サードパーティ製のライブラリなしでiOSアプリがリリースできてしまった話
iOSエンジニアのpupepaです。約6年ぶりにiOSアプリをリリースしました。
しばらく離れている間に、開発環境が大きく変化していることを実感しました。特に変化を感じたことは、今回のアプリ開発で一度もサードパーティ製のライブラリを使用せずにリリースできたことです。
これまでiOSアプリ開発では、標準ライブラリの機能が不足しているため、多くのサードパーティ製ライブラリを導入するのが当たり前でした。(少なくとも私の中では) Alamofire、SDWebImage、HUD関連などなど…今回はそれらを一切使わずに済んだことに驚いています。
リリースしたアプリの概要
今回リリースした「Flowcus」は、行動ログを記録するためのアプリです。1日の行動予定をスケジュールし、それに基づいて記録を残せる仕組みになっています。
家計簿でお金の管理、レコーディングダイエットで体重管理をするように、時間を有効活用するためには時間を記録するべき、という考えに基づいています。
アプリ自体はシンプルな設計ですが、その開発にどのようなアーキテクチャを採用したのかを紹介します。
アーキテクチャ
主な構成は以下の通りです。
- UIはほぼすべてSwiftUI
- データ永続化はSwiftDataを使用し、CloudKitで複数端末間の同期を実現
- API通信は標準ライブラリを使用
- 課金はStoreKit 2を採用
UI
UIはほぼSwiftUIのみで実装しています。UIKitを使用したのはSafariViewを利用する部分のみです。
FlowcusのUIは比較的シンプルな構成になっていますが、現状のSwiftUIだけで実装することが厳しい部分もいくつかありました。特にList周りは、UIKitを使えば簡潔に実装が可能だったと思います。
SwiftUIはその設計思想にマッチしたUIはすごく簡単に作れますが、思想からちょっと外れると、実装が急に大変になりがちというのが私の感想です。個人アプリということもあり、SwiftUIでできないことは積極的に諦めることで、UIKitを使うのを回避しました。
実績の表示にはChartsを使用しています。少ないコードで見栄えの良いグラフが表示できるため、とても便利でした。
データ永続化
Core Dataを採用するのはさすがに古いと感じたため、SwiftDataを使用しました。しかし、SwiftDataもなかなか扱いが難しく、まだまだ機能が足りていない印象でした。
SwiftDataはCloudKitと組み合わせてデータの同期を実現でき、Flowcusではこの機能を用いて端末間のデータの同期を行っています。しかし、この機能を使うとSwiftDataの制約が増えてさらに苦行でした。
個人的にSwiftDataを本格的に導入するは時期尚早かなと思いますが、それでもCore Dataを今から採用するよりはいいと信じて導入しました。そういえばRealmはどうなったのでしょうか…。
API通信
サーバーとの通信量がそれほど多くないため、標準ライブラリのみで十分対応できました。特に抽象化せず、雑なシンプルな実装にしています。
課金
Flowcusはサブスクリプションモデルを採用しており、実装にはStoreKit 2を使いました。
以前のStoreKitは実装がめちゃくちゃ大変だった記憶があるのですが、StoreKit 2は驚くほど簡単に実装できて感動しました。SubscriptionStoreView
を使えば、サブスクリプションの課金画面も驚くほど簡単に作成できました。
その他
設計モデルはMVVMを採用せず、MVCに近い形にしています。これはSwiftDataのオブジェクトをViewから直接使用するためです。
ただ、Viewにロジックを書いてしまうとユニットテストが書けなくなるため、複雑なロジックは外部に切り出しています。チーム開発なら適切ではないかもしれませんが、個人開発なので問題ないと判断しました。
クラッシュログはAppleの標準のクラッシュログを使用し、Crashlyticsは導入していません。また、アナリティクスも導入していません。
おわりに
サードパーティ製ライブラリを一切使用せずにiOSアプリをリリースした、という話でした。
もちろん、サードパーティ製ライブラリが悪いとはまったく思っておらず、むしろライブラリの作者の方々には感謝しています。今後のアップデートでは、サードパーティ製のライブラリを使用することもあると思います。ただ、まずは標準ライブラリで実装できるかを試し、その上でライブラリの導入を検討することが望ましいのではないかと思いました。
Discussion