iOS の家計簿アプリをつくる(通信処理編)

advent_calendar アドベントカレンダー

はじめに

こちらは個人開発アプリができるまで by am10 Advent Calendar 2024の 5 日目の記事です。

5 日目はアプリからデータ登録とデータ取得をできるよう通信まわりの実装をします。
個人開発ではそこまでやる必要はないのですが下記 3 つを切り替えられるようにします。

  • 本番環境
  • 開発環境
  • ローカルの JSON ファイル読み込み

ローカルの JSON ファイル読み込みはサーバーサイドの実装がまだ終わってない場合にアプリの実装を進めたいときや通信せずにアプリの動作だけみたいときなどに利用します(私はこの手法をよく使います)。

データ定義

家計簿のデータを扱うためにまずはデータクラスをつくります。
Storage に SwiftData を選択したら自動で生成されている Item クラスを下記のように修正します。

リクエスト生成

次に HTTP リクエストの生成関連を実装していきます。
AppConfig.swift ファイルを作成し下記の実装をします。

AppConfig はその名の通りアプリの設定関連のもので本番、開発、ダミーを切り替えるために使います。
次に API.swift ファイルを作成し下記の実装をします。

API は HTTP リクエストのタイムアウトなどの設定をするために使います。AppConfig と API は家計簿アプリ以外でも使える汎用的なやつです。
次に APIError.swift ファイルを作成し下記の実装をします。

APIError は API のエラーを定義したものです。上記以外にもエラーがあればここに追加していきます。
次に .gitignore に Secret.swift を追加して Secret.swift ファイルを作成し以下のように API の URL を記載します。

これで GitHub などに公開しても URL は公開しなくなります。Secret.swift には API キーなど公開したくない値を記載します。
次に ExpenseLogAPI.swift ファイルを作成し下記の実装をします。

ExpenseLogAPI は家計簿アプリ専用の API を記載します。削除や更新処理など API を追加したい場合はここに記載します。
下記の makeBaseURL で本番環境と開発環境の接続先変更が可能です。

これで API のリクエスト生成処理は完成です。timeout などの設定値は以下のようにすれば API ごとに設定できるようになっています。

通信処理

通信処理を実装していきます。

本番・開発環境

まずは本番・開発環境から実装していきます。
Session.swift ファイルを作成し下記の実装をします。

Session と DefaultSession は家計簿アプリ以外でも使える汎用的なものです。
次に ExpenseLogAPIClient.swift ファイルを作成し下記の実装をします。

ExpenseLogAPIClient は家計簿アプリ専用のクラスです。API を追加する場合はここに追加していきます。
これで本番・開発環境は完成です。

ダミー環境

次にダミー環境を作成します。Resources フォルダに fetch.json と register.json を以下のように作成します。

それぞれダミー環境での取得・登録処理の返却値になります。
次に DummySession.swift ファイルを作成し下記の実装をします。

遅延処理を入れてるのは通信処理ぽくするためです。これでローカルの JSON ファイルを読み込んで API ごとに返却できるようになりました。JSON ファイルではなく画像ファイルなどを返したい場合は下記の処理を API ごとに変えてやれば可能です。

これでダミー環境も完成です。

環境ごとの切替

最後に環境ごとの切り替えができるようにします。APISessionKey.swift ファイルを作成し下記の実装をします。

これで各 View から @Environment にアクセスできるようになりました。環境を切り替えたいときは下記の値を書き換えます。

今回は手動で書き換えるようにしましたが下記みたいにスキームをわけてもいいでしょう。

iOS開発(Swift)のおすすめ構成〜実践編〜
はじめにライブラリ編の続きです。おすすめ構成を実践してみました。今回アーキテクチャに関しては特に触れないですがプレゼンテーションロジックをどっかに置きたいと思い PresentationModel というよくわからないものを置いています...

動作確認

動作確認をします。ContentView.swift を下記のように修正します。

「データ取得」ボタン、「データ登録」ボタン押下でそれぞれデータ取得とデータ登録ができていれば成功です。

おわりに

これでアプリからデータをさわれるようになりました!

通信周りは未だにどう実装すべきなのか迷いますがわりと汎用的なものになったんではないでしょうか。どうやって使いやすく実装するのか考えるのは楽しいのでみなさんもぜひ色々試してみてください。
明日は画面構成について書きます。

https://amzn.to/41h6u3J

コメント

タイトルとURLをコピーしました