iOS版CODEアプリのアーキテクチャと使用ライブラリ

リサーチ・アンド・イノベーションの小川です。iOSエンジニアをやっています。弊社ではiOSエンジニアを募集しています。この記事でもAndroidアプリと同様に応募者が弊社で働くイメージを持ちやすくするために、iOS版CODEアプリのアーキテクチャと使用ライブラリを広く簡潔に紹介します。

アーキテクチャ

アーキテクチャは4層構造のレイヤードアーキテクチャになっています。 MVVM+クリーンの改造版的なイメージです。チームで使い勝手を良くするために他のアーキテクチャを参考に制定してみました。

architecture.png

非同期処理

GCD, RxSwiftを使用しています。 今後、Combineを使用予定です。

プレゼンテーション層


  • View, ViewController, ViewModelが置いてある
  • ユーザーからの入力を受けて表示する

アプリケーション層


ドメイン


インフラ層


  • データ取得ロジックが記載されている
  • Repositoryの実装クラス
  • データの永続化

その他モジュール

Utility


  • 全体で使用する便利classが置いてある
  • だいたい何かのExtension

Config


  • アプリケーション全体で使いたい定数などが纏められている

実装について

Repository

データの出し入れを代表するクラスです。単純なラッパーになっているケースが多いですが、REST APIからデータ取得する場合はcacheの管理や取得データをストリームに変換して返す処理を行なっています。

UseCase

ViewModelからRepositoryを使う場合はUseCaseクラスを作成しています。

ViewModel

ユーザのInputに対しOutputを返す存在として実装しています。インターフェースとして以下を採用しています。

protocol ViewModelProtocol {
    associatedtype Input
    associatedtype Output

    func transform(input: Input) -> Output
}

ユーザの操作は全てInputに、UIの変化は全てOutputに集約させるように実装しています。 Input, OutputはRxのストリームで表現していて、リアクティブプログラミングでイベントの実装をしています。 こちらについては一つの方法に拘りがあるわけではなく、チーム内で話してより良い解決策を採用しています。

View

各ViewControllerに対して.xibファイルを作成しています。

ViewController

1つのViewControllerに1つのViewModelを結びつけ、ユーザの操作をViewModelへのInputとし、画面変更をViewModelからのOutputとして実装しています。

テスト

ユニットテスト

XCTestを使用しています。RxSwiftに関する部分についてはRxTestを使用しています。 テストカバレッジについてはまだ不十分なので、プロジェクトの課題です。

UIテスト

Appiumにてスクリプトを作成しています。本アプリではカメラの操作がメインアクションなのでまだまだ実験導入の段階となっています。

ワークフロー

主にfastlaneBitriseを使用しています。

CI

Githubでのプルリクエスト作成時・それ以降のPUSH毎にローカル単体テストの実行を行なっています。

CD

TestFlightを使った社内テスト版の配布やAppStoreへのリリースもワークフロー化されています。

分析

Firebase Analyticsで画面遷移やアプリに埋め込んだイベントを送っています。さらにBigQuery Exportを設定して、BigQueryにGoogle DataStudioJupyterからアクセスすることで、柔軟にデータ分析を行っています。データ分析エンジニアが居るのでグロースのためのデータ分析は、ほぼその方が担当しています。Androidチームでは重要機能が適切に動作しているかの確認や、ユーザから報告のあった不具合の調査のための分析を主に行っています。

まとめ

現状の課題

CODEは2013年に開発が開始したプロジェクトで、当初に開発された画面はObjective-Cで書かれていてそれが残っています(アーキテクチャとしてはFluxを採用して、グローバルな単一stateをKVOで監視することで実現しています)。レガシーコードについてはViewController単位で最新の実装方法に切り替えて作り直す方針にしています。

今後の展望

今後は今まで少人数の開発体制だったものを拡大していく予定なので、大人数でもうまくワークする開発体制の整備が必要と考えています。 また、開発効率や安全性の向上のためにも積極的に新しい技術を導入したいと考えております。一緒にチャレンジいただける方のご応募をお待ちしております。 (2022年2月の時点での具体的な検討事項は以下となります)

  • SwiftUI/Combineの導入を検討中
  • GraphQLの導入を検討中
  • E2Eテストの自動化を検討中
  • アーキテクチャの改善