デジタルイノベーションラボのゴルゴです。
今回はQUOカードPayのモバイルアプリで利用している技術を紹介します。
Androidアプリ
MVVM+Clean Architectureパターンで実装しており、以下のような技術・サービスを利用して開発しています。
言語: Kotlin 100%
ライブラリ: Rx, Retrofit2, Glide, Koin, Coroutine, Epoxy, Firebase
テスト: JUnit, Spek, Mockito, Espresso, Spoon
CI/CD: Bitrise
よくあるパターンなので特筆するところはそれほどないですが、開発当初の開発メンバでDagger2に慣れているものがいなかったので、習得しやすいKoinを採用しました。ハマることもなくすんなりと使えたので良かったです。ただ、KoinはInjectするオブジェクトを動的解決するので実行時エラーになるリスクがあり、今後も使い続けるかはわかりません。Dagger2のように静的解決してくれる、KotlinネイティブのDIツールの登場を待っていたのですが、どうやらDagger2がGoogle公式の推奨DIツールがなったようなので、本腰を入れて調べています。
また、Coroutineは当初experimentalだったこともあって非同期処理は主にRxで実装しており、今の所部分的にしかCoroutineは使っていません。
CIにはBitriseを利用しているのですが、モバイルアプリ向けに特化されていて使いやすいです。自作のSlack Bot、GitHubと組み合わせることで、Slackからメンションを飛ばすとストアへのアップロードまで自動で行われるようにしています。
iOSアプリ
MVP + Clean Architectureパターンで実装しており、以下のような技術・サービスを利用して開発しています。
開発言語: Swift5
ライブラリ: Rx, Moya, Nuke, R.swift, Realm, Firebase
テスト: XCTest, swift-snapshot-testing
ライブラリ管理: Carthage, CocoaPods
CI/CD: Bitrise
iOSアプリではAndroidアプリと比べてMVVMを採用した場合のRxSwiftへの依存度が高くなる等があった為、MVP + Clean Architectureを採用しました。 通信ライブラリにはAlamofireのラッパー的なMoyaを使うことでdebug時はスタブを利用するようにしています。 リソースファイルへのアクセスはR.swiftを使用しているので、プロパティとして取得できるためtypoがなくなりました。
CIはAndroidアプリ同様にBitriseとSlack Bot、Githubと組み合わせてSlackからApp Store ConnectへIPAアップロードを自動化しています。
設計
iOSとAndroidはそれぞれネイティブ実装していますが、ドメイン層に用意するUseCaseやRepositoryの設計は出来るだけ揃えることで相互のエンジニアがレビューしやすいようにしています。