2023年3月現在のママリのiOSアプリは開発環境について紹介します。
言語
100% Swiftで、以前はObjective-Cのコードもありましたが、全てSwiftに書き換えました。
iOSのサポート範囲
iOS14以上としています。4/10以降は14.5以上に変更予定です。(iOS14.0~14.4でSwiftUIの挙動の違いがあるためサポート範囲外としました)
使っている主なフレームワークやライブラリ
主に以下のフレームワークやライブラリを利用しています。
- UIKit, SwiftUI
- RxSwift, Combine
- Realm
- Firebase
以前はUIKitとRxSwiftを使っていましたが、新しい画面についてはSwiftUIとCombineを使用する方針で開発しています。ただし、SwiftUIで実装する際に特殊な方法が必要であれば、新たな負債を作らないためにUIKitで実装する方針です。
アプリ内でデータ永続化のためにRealmを利用していますが、ママリは基本的にWeb APIから情報を取得して表示することがメインであり、Realmは軽量な利用に留めています。
Firebaseは、分析、ABテスト、クラッシュ検知など多様な用途で使用しています。
アーキテクチャ
RxSwiftが主となっているため、MVVMになっています。 SwiftUI導入時にTCAも検討しましたが、特定のFrameworkに強い依存をしたくなかったのもあり、一旦見送っています。ただし、今後課題が出てきた場合は再考していく予定です。
Model部分を別モジュールとして切り分けています。これについて詳しくはこちらのブログをご覧ください。 tech.connehito.com
ツール
swift-formatやSwiftLintが開発中に自動で実行されるようにしています。
Renovateをつかってライブラリを定期的にアップデートする仕組みを導入しています。
iOSエンジニアの数は2名で、project fileでコンフリクトすることはあまりないためXcodeGenは導入していません。
デザイナーとのデザインのやりとりはFigmaをつかっています。
テスト
Quick/Nimbleを使ってユニットテストを書いています。
全てにテストを書いているわけではなく、APIの通信周りは必須、ViewModelやModelは推奨としています。
テスト時の依存性注入のためにDIのライブラリは導入していませんが、必要な箇所ではinitializerで注入しています。
CI/CD
CI/CDの実行環境としてはBitriseとGitHub Actionsを使っています。 Macでの実行が必要なケースはBitriseを使い、それ以外はGitHub Actionsを使うといった使い分けをしています。
テストの実行、AppDistributionでのアプリの配布、テスト端末の登録、App Storeへのアプリのアップロード、リリースノートの生成といったことを自動化しています。
今年度やった技術的改善
ママリの開発業務をやるだけでなく、技術的な改善にも一定の時間を使うようにしています。今年度は主に以下のようなことをやりました。
- Objective-Cのコードの撲滅
- Swift Concurrency導入
- 脱Rosetta2
- モジュール分割
技術的な改善の今後
今注力している技術的な改善はAPIKitの置き換えとAPI通信周りをRxSwift/CombineからSwift Concurrencyへの置き換えです。
その後やりたいこととしては、Swift Package Managerの導入や画面の一部をSwiftUIへのリプレース、起動周りのコードの改善などがあります。
最後に
コネヒトではママリの機能開発をしながらも技術的な改善を進める時間も一定確保しこのような改善を進めています。
コネヒトでの開発に興味を持っていただいた方はカジュアルにお話しましょう〜 TwitterのDMなどでも大丈夫ですので@yanamura_までお気軽にどうぞ 日本中の家族をITの力で笑顔にしたい、iOSエンジニア募集! - コネヒト株式会社のモバイルエンジニアの採用 - Wantedly