😬

[TCA] 地図を見るのが悔しいから、アプリを作った話

2024/12/16に公開

概要

SwiftのComposableArchitecture(TCA)を使って、目的地の方角と距離を表示してくれるアプリを作った。
開発の動機や苦労した点をまとめる。

作ったアプリ

アプリ

iPhoneとAppleWatch対応
https://apps.apple.com/jp/app/home-nav/id6738886508?l=ja

背景

友達と散歩しているときに、迷ったことがあった。
自分は方向音痴の自覚はあるが、それでも地図を見るのは悔しい気持ちがある。
そんなときに、目的地の方角と距離だけを示してくれるアプリがあれば、悔しくないし迷わないのではと思い開発した。

機能

  • 地図から場所を登録
  • 登録した場所への方角と距離を表示
  • 複数の場所を登録できる。(e.g. 家、会社などを想定)

タイムライン

開発期間は3週間くらい

  • 11月末道に迷う
  • 12月中旬リリース

使用技術

環境

  • Swift6
  • Xcode 16.1

使ったもの

  • TCA
    • 学習の意味も込めて使うようにしている。今回は、TCAを使用した2つめのアプリ。
    • 1つめは、こちら
  • ComposableCoreLocation
    • CoreLocationをTCAで使いやすいようにラップしたライブラリ
    • TCAと同じくPoint-Freeによって開発されている
  • Tuist
    • Xcodeプロジェクトの生成や管理を行うツール
    • 最近配属されたチームで、Tuistを使っているので、学習の意味を込め使ってみた。

https://github.com/pointfreeco/swift-composable-architecture
https://github.com/pointfreeco/composable-core-location
https://docs.tuist.dev/ja/

苦労した点

ComposableCoreLocationが依存しているTCAのバージョンが古い

ComopsableCoreLocationは、Point-freeによって開発されているが、最近は更新が活発ではない。
最新のTCAのバージョンは1.17.0だが、ComposableCoreLocationは0.43.0に依存している。
最近TCAに触れ始めた私にとっては、古いTCAのAPIには馴染みがないため、それを使用した開発は避けたかった。

ComposableCoreLocationのPRを見たところ、Swift concurrency対応のPRが出ていた。
PRはまだDraftの状態だったが、新しめのTCAに対応していたため、Forkして使用した。

PRの中では、Swift6へのMigration用のflagが設定されており、そのせいで、ArchiveをUploadするとエラーが発生した。
そのflagをコメントアウトするために、Forkして使用する必要があった。
TCAをCoreLocationのようなライブラリと組み合わせて使用するうまい方法を思いついていなかったため、上のPRが提出されていて助かった。

Tuistが初見で難しい

最近配属されたチームで、Tuistを使っているので、学習の意味を込めて使ってみた。
Tuistは、XcodeGenのように設定ファイルからXcodeprojを生成するツール。
Tuist関連の情報が探しづらく、最初は設定ファイルの書き方がわからなかった。

XcodeのGUIから設定を変更したときに、info.plistやxcodeprojのどの部分にどんな値が書き込まれるかを確認することで、Tuistでどのように値を設定すればよいのかを探索した。

AppleWatchとの連携をTCAで実現する方法

CoreLocationと同様にWatchConnectivityをTCAと使用するうまい方法思いついていなかった。

  • 他のデバイスから情報を受け取るときにDelegateMethodを使用するが、それをReducerでどう扱うか
  • Swift6で使いたい。

上記の課題を解決するために、ComposableCoreLocationのコードをまねて、WatchConnectivityをTCAで使用する方法を実装した。(ComposableWatchConnectivity)
WatchConnectivityのdelegateが発行されたときに、eventが発行されReducerでactionを受け取れるようになった。

https://github.com/Ueeek/ComposableWatchConnectivity/tree/main
https://zenn.dev/ueeek/articles/20241215tca_watchconnectivity

やってよかったこと

Xcode Copliotの導入

main branchにPushしたタイミングで自動でArchiveしてTestflightにUploadしている。
Archiveの間もローカルのXcodeは自由に使えるし、uploadの手間もないのでとても便利。
DeveloperProgramに登録しているなら、月24hまで無料で使える。
1回あたり20分くらいでArchiveできたので、月70回くらいは、無料でTestflightを作れそう。

GitHub Issueを使ってタスクの管理

個人開発では占め切りがない。これが良いところでも悪いところでもある。
自分は3ヵ月でリリースまでいくようにしている。
作りたい機能はたくさんあるが、すべてをやるとリリースまでに時間がかかりすぎる。
そのため、GitHub Issueを使ってやるべきタスクを管理している。

  1. やりたいことをIssueに書き出す
  2. 優先順位を決める
  3. 3ヵ月にはいりきるように、タスクを選ぶ

個人的にこのやり方を気に入っている。

Github Copilot For Xcodeの導入

Xcodeのプラグインで、コード補完をしてくれる。
たまに間違ったコードを提案してくることもあるが、TCAのReducerやActionを書くときに、とても便利だった。

https://github.com/github/CopilotForXcode

まとめ

TCAを使った2つめのアプリだからか、以外とスムーズに開発できた。
地図を見るのは悔しい気持ちがある人には、ぜひ使ってほしいです。

Discussion