見出し画像

バスのアプリで使用した技術 iOS編

概要

大学のスクールバスのアプリを作る上で使用した技術について紹介していきます。

今回はiOSアプリを開発する上で使用した技術などを紹介しています。
ちなみにソースは公開しています。

そもそもなぜ作ったのか

このアプリを作り始めたのは今年の冬ごろで、
その頃 MVVM にハマっていたり、CocoaPods の自前管理を試したくて
何かアプリを作りたいなーと思っていました。

そんな時に大学スクールバスのアプリがあったことを思い出して、
ふと見てみると 2020 年度のものには対応していないようでした。
( 現在はアップデートされていて 2020 年度に対応されています。 )

自分は OB だし、後輩が使えるようなアプリを作ろう!ということで開発がスタートしました。

またその上で

・ iOS らしい機能( ローカル通知やウィジェット )の実装
・より見やすい UI、UX
・後輩に知見を公開できるようにソースをオープンに

をマストに実装を進めていました。

アーキテクチャ

アプリのアーキテクチャには RxSwift を使用した MVVM を採用しました。

MVVM を採用した理由として、
今回作成したアプリの規模、複雑さでも問題なく実装できるかどうか確かめたかった部分があったのが一番の理由です。
あとは個人的に書き心地が良かったというのもあります。

プロジェクトの構成

Embedded Framework を利用して、アプリ本体とネットワーク、DBの処理をまとめたレイヤー( Infra )の二つに分けています。
Embedded Framework については以下の記事が参考になると思います。

また、ライブラリの管理には CocoaPodsCarthage の両方を使用していて。Firebase のみ CocoaPods で管理するようにしています。
CocoaPods は Workspace に自動統合されないように自前で管理しています。この辺りは以下の記事を参考にさせていただきました。

自前で管理することでビルド時間が大幅に短縮できるのと、Embedded Framework での設定がしやすくなるので自前で管理しています。

自前で管理しているため、スクリプトの実行などが必要になってきます。
この辺りを上手くまとめるために Makefile を作成して、コマンド一つで環境を整えられるようにしています。

使用ライブラリ

RxSwift
MVVM を実現させる上で最もメインとなるライブラリです。
Reactive Extensions の Swift 版になります。

Firebase
Firestore、Remote Config、Crashlytics を使用しています。
バスのデータの取得やクラッシュ解析などに使用しています。

Realm
Firestore から取得したデータを本体にキャッシュとして保存するために使用しています。保存したキャッシュは Today Extension で読み込んでいます。

SwiftDate
標準の Date をより使いやすくするために使用しています。

細かい部分

モジュール化
Today Extension などの App Extension は別ターゲットとして追加されるので、同じような処理をもう一度書いたりする必要が出てきてしまいます。
これを避けるために Embedded Framework を利用して、Realm のデータ構造を表すクラスやデータベースから読み込みを行う処理などを Infra モジュールとして分割しています。

これによってモジュール化を意識した作りになることや、前述したビルドが早くなると言ったメリットがあります。

ViewController in ViewController
今回作成したアプリでは同じような画面が多かったため、
1つの ViewController に細かく分解した ViewController を複数埋め込み、
できるだけ再利用できるように工夫しました。

スクリーンショット 2020-06-24 15.21.25

こうすることで1つの画面に複数の ViewController が存在することになり、
肥大化しやすい ViewModel を細分化するよう強制することができました。

CI を使用してビルドを自動アップロード
Github Action と fastlane を利用してビルドの提出を自動で行っています。
master ブランチにプッシュされると CI が実行されて、リリース一歩手前の状態まで持っていくことができるようになっています。

こちらについては別記事で詳しく解説しているので、よかったら見てください。

最後に

iOS アプリを作成する上で使用した技術等はこんな感じです。
現在テストが作成できていないので、ViewModel のテストなどを作成してより堅牢な作りにできるよう改善していきたいと思っています。

この記事が気に入ったらサポートをしてみませんか?