「COCCHi」開発者の日記:「iOSプロジェクトの舞台裏〜アーキテクチャ編〜」
パイオニア公式noteをご覧いただき、ありがとうございます。モバイル開発部のiOSエンジニアの杉岡です。
普段自分が業務で携わっているスマートフォン専用カーナビアプリ「COCCHi」のiOSアプリでは「Full SwiftUI」と「The Composable Architecture(以降TCA)」を利用し開発を行っています。
今回は、実際のプロダクトでの利用経験をもとに、SwiftUIとTCAを用いたアプリ開発における実践的な印象をお話ししたいと思います。
初めて利用した感想ですので、想定された使い方に対して正確なコメントではないかもしれませんが、その点ご理解いただければ幸いです。間違った点があれば、ぜひご意見をいただければと思います。
「COCCHi」って何?
まずは「COCCHi」の紹介からさせてください。
パイオニアでは9月4日に、スマートフォン専用カーナビアプリ「COCCHi」をリリースしました。
今までパイオニアでは、車載機器などと連携させて使用するアプリの開発しか行っておらず、単体で動くアプリの開発は初の試みになります。
無料で使用できるプランもあるので、是非気軽にインストールしてお試しください!
開発体制
「COCCHi」のアプリは、OSごとに開発しています。
アプリだけでなく、ナビや音声案内のSDK、バックエンドやQAチームを含めると全体で数十名規模のプロジェクトになります。
使用技術
iOSは、SwiftUIとTCAを用いて開発を行っています。
その他の、車載機器と連携させるCarPlayへの対応や、CI/CDではBitriseなどのツールを使用しています。
今回は、社内に知見がなく、チームにとってもチャレンジングだったSwiftUIとTCAでの開発を実際に行ってみて、良かったところ、また、辛かったところを書いていこうと思います。
軽く用語説明
SwiftUIについて
SwiftUIは、Appleが2019年のWWDC(Worldwide Developers Conference)で紹介した新しいUIツールキットです。
コードで宣言的にUIを構築することができます。
TCAについて
SwiftUIでのアプリケーション開発における新しいアーキテクチャのアプローチを提案するライブラリです。
主に状態管理をしやすくしてくれるアーキテクチャです。
(※詳しくは公式のGitHubをご覧ください。)
よかったところ(SwiftUI編)
まずはSwiftUIについてです!
①UIを構築しやすい
SwiftUIは宣言的なアプローチを採用しており、UIの要素やその動作を簡潔に実装できます。
「COCCHi」では、メニュー画面や車両登録画面を実装する際にその効果を実感できました。
この様な、要素を並べてスクロールする画面をUIKitで実装しようとすると、複雑で難しくなってしまいがちですが、SwiftUIでは直感的かつ簡潔に書くことができます。
難しい実装を簡単に行えるため、開発スピードを上げることができますね。
②レビューがしやすい!
SwiftUIで実装すると、StoryboardやXIBを用いて開発する必要がなくなるため、UIの実装をコードのみで行えます。
そのため、変更箇所がどこなのか直感的にわかりやすく、レビューの際に、デザイン仕様通りの実装になっているか、バグが含まれていないかの判断がしやすくなります。
③UIの再利用が容易!
SwiftUIは再利用性が高いツールです。UIをコンポーネントで括ることにより、簡単にさまざまな画面やプロジェクトに利用できるため、開発効率が上がります。
共通化する方法はSwiftUIで記述したコードを別ファイルに括り出して、UIとして呼び出すだけです。簡単ですね。
「COCCHi」では、「各画面で表示されているボタン」「出発時間か到着時間か選択する部分」「ルート選択画面の並び替え部分」などさまざまなUIを共通化して使用しています。。
辛かったこと(SwiftUI編)
SwiftUI自体が発展途上であり、限界がある
SwiftUIはまだまだ発展途上の技術です。SwiftUI自体にもバグが存在し、できないこともあります。
そのため、UIの作成時には、まずSwiftUIで実現できるのかを調べる必要があり、不具合が出た際には、SwiftUI自体のバグなのか、自分たちの実装面バグなのか調査する必要がありました。
調べた結果、SwiftUIでは実現できないUIであれば、UI Kitで作り直すといった作業が発生してしまいます。
このような調査や作り直しの作業は辛いものがありました。
できること、できないことをあらかじめ把握しておくことが大切です。
いいところ(TCA編)
次はTCAについて
①状態管理の方法が一意に定まる
過去にMVPやMVVMなど、他のアーキテクチャを使ったプロジェクトに参加した経験がありますが、これらのアーキテクチャは状態の保持の仕方を明確に定めていないため、プロジェクトによっては複雑化してしまうリスクを感じました。
TCAには「Stateと呼ばれる状態を保持して、Stateの変更はActionからのみ行うことを強制する」というルールがあります。
そのため、UIのどの値を見て、どこからその値が変更されているかを管理するのが容易で、不具合の特定などもやりやすくなります。
②書き方の見本が多く、情報を入手しやすいこと
TCAは注目度の高い技術です。
公式のドキュメントやGitHubでは正しい書き方の例が豊富に記載されています。(これさえ読んでいればいいと思えるほどです!)
正しい書き方を学び、統一することができるので、コードの可読性が上がり、チームの開発効率の向上にもつながってきます。
また、TCAに関する記事もたくさん見つけることができます。
新しいアーキテクチャであるにも関わらず、開発につまずいた時に参照できるドキュメントがたくさんあるという安心感はメリットだと思います。
辛かったこと(TCA編)
①学習コストが比較的高い
「TCAはルールがあり、正解が提供されていて、参照できるドキュメントが豊富」と記載しましたが、TCAは他のアーキテクチャ(MVPやMVVMなど)と比較して、理解する必要がある概念や推奨されていない書き方も多く存在します。
初めてTCAを使用する場合は、それらのルールを学んだり、理解したりするのに時間がかかると感じました。
どのアーキテクチャにも言えることですが、特にTCAに関しては何が正しくて、何が間違っているかの理解を怠り、開発を進めてしまうと結果的に技術的な負債となり、開発効率を落としてしまうことがあると感じました。
②書くのが大変(コードの記述量が多くなりがち)
TCAにはルールがありますが、どれだけロジックとして小さいものでも、構築するにはState、Action、Reducer、Storeの4つの実装が必要になります。
ルールとして決まっていることはメリットでもありますが、いちいちこれらの記述を行わないといけないことを煩わしいと感じる方もいると思いました。
実際に導入して感じた課題
SwiftUIとTCAで作成したCOCCHiのiOSアプリですが、取り組まないといけないと感じている技術的な課題も多く残っています。
現在把握しているものを幾つかあげると
「画面遷移やアニメーションのパフォーマンス向上」
「クラス責務の切り分け」
などです。
SwiftUIとTCAの知見をより深めて少しずつ解決していきたいと考えています。
最後に
いかがでしたでしょうか?今回はパイオニアとして初めてFull SwiftUIとTCAを活用したアプリ開発で感じたことをお話ししてみました。
私自身、今年の4月にパイオニアに入社しパイオニア歴は短いのですが、「COCCHi」のリリースに携わり、カーナビ業界におけるパイオニアの知名度・注目度がすごく高いことに驚きました。
そのため、やりがいと、「COCCHi」のクオリティをより向上させるという責任感を感じながら、ユーザーの期待に沿うようなアプリを届けられるよう日々開発に取り組んでいます。
また、パイオニアでは、たくさんのモバイルアプリの開発を予定しています。
一緒にやりがいを感じながら、試行錯誤し、最高のモバイル開発部隊を作り上げていく仲間を絶賛募集中です。
カジュアル面談も実施していますので、興味を持っていただけた方は、是非ご応募ください!