個人開発とマルチモジュール化
iOSアプリ開発界隈では、マルチモジュール化というと、『コンフリクトしにくいプロジェクト構成にでき、XcodeGenを使わずに済む』といったような、わりと大規模かつチームでの開発を前提とした点がメリットとして挙がることが多い気がします。
一方で僕は仕事でも個人開発でもほぼ一人で開発することが多いのですが、わりと細かくモジュール分けします。
動機としては、
1. 依存関係の明確化
2. 再利用 / 横展開
といったあたりです。
とくに2が重要で、仕事でも個人開発でもアプリを新規プロジェクト作成からスタートすることが多いので、同じ実装はSwift Packageの導入でサクッと済ませたい、というのがあります。
本記事では、たとえばどんな実装をモジュール化(Swift Package化)しているのか、というのを一部紹介します。
なお、ここに出てくるソースコードはいずれも販売しています。ご興味あればお問い合わせください。
カメラの撮影
AVFoundation の AVCaptureSession を用いた撮影まわりのラッパーライブラリ。
初期化:
videoCapture = VideoCapture(cameraType: .back, previewView: view)
撮影開始:
videoCapture.startCapture()
これだけなので、「カメラのプレビューが画面に表示される」ところまでなら新規プロジェクト作成から3分でいける。
カメラデバイス(AVCaptureDevice)の切り替えや、デプスの取り扱い、マルチカメラ等の機能が秘伝のタレのように入っている。
・・・と書いたものの、Swift Package版にはデプス/マルチカメラの実装はまだ入っておらず、ローカルに散在する別バージョンに混じっている(技術的負債)。いずれ統合する予定。
Visionによる画像・動画処理
Visionによる画像分類(Image Classification)や物体検出(Object Detection)系の機能のラッパー。
たとえば顔、人間(人体)、動物(犬・猫)を検出したかったら、このように書く。
filterHandler.perform(cgImage: cgImage, requestTypes: [.animals, .face, .human], completionHandler: { [weak self] result in
...
})
Visionのビルトイン機能だけじゃなく、YOLOのCore MLモデルの利用もサポートしている。よく使うので。
こちらのモジュールはSomatoで実装したので、TOTOCでは横展開しただけ。
おかげでこの「認識する」というところ自体は本当に一瞬でできた。
動画・音声ファイルの選択
こんな感じでアクションシートを出して、
PHPickerViewControllerを用いてカメラロール(写真ライブラリ)から、あるいはUIDocumentPickerViewControllerを用いてiCloudから動画や音声ファイルを選択できるようにする実装もSwift Package化している。
メソッド一つ呼べばアクションシートが出て、後は選択時(あるいは失敗時に)completion handlerに指定した処理が実行される。
こちらはChopperで実装したものだが、
自分がつくる他のプロト等も動画や音声を使用するものが多いので、これから多用すると思う。
動画の録画
カメラによる撮影と、それを動画として録画することは必ずしもセットではないので、別モジュールにしている。こちらは要はAVAssetWriterのラッパー。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/