旅行計画アプリ「たびくる」で、地図上のスポットから場所詳細を開く導線を追加した。同時に、スポット登録中に端末が熱くなるという報告を受け、地図描画、端末内保存、CloudKit取得の負荷を調査して改善した。以下は2026年10月2日までの開発記録で、発熱低減の実測はまだ行っていない。
場所詳細シートと地図タップの競合を直す
検索結果にMapKitのmapItemDetailSheetを付けたところ、地図タップによる地点登録が反応しなくなり、詳細ボタンでも場所カードが開かなかった。Simulatorで、修飾子を外すと地点登録が復帰することをユーザーが確認した。
通常の.sheet(item:)内にMKMapItemDetailViewControllerを置き、UIViewControllerRepresentableでSwiftUIへ橋渡しする方式へ変更した。署名ありSimulatorビルドが成功し、地図タップ登録と場所カード表示の両方をユーザーが確認している。
確認した場所カードには写真が出なかったため、ボタン名は「詳細を見る」とした。カードの下には「Google マップで開く」を追加し、登録時の名称・住所を使った検索URLを開く。URLのエンコードとSimulatorでのブラウザ起動を確認し、実機ではGoogle マップが開くことをユーザーが確認した。
登録済みスポットにも詳細の入口を作る
検索結果から登録した後は選択状態が解除され、詳細ボタンも消えていた。登録済みスポットにはMKMapItemを保存していないため、詳細へ戻る入口がなかった。
そこでスポット一覧カードに詳細ボタンを追加した。押すと名称と座標を使って周辺1kmをMKLocalSearchで再検索し、100m以内で最も近い場所のカードを開く。見つからなければ、名称と位置だけのカードを出す。保存モデルは変更していない。この追加分はSimulatorビルド成功まで確認しており、画面操作は未確認である。
地図描画と入力の更新を分ける
発熱報告を受けた静的調査では、3D地図、入力ごとの地図内容・軌跡線の再計算、全旅行のJSON保存、CloudKitの繰り返し取得が負荷の候補になった。Instrumentsによる計測は未実施で、原因の寄与率は分かっていない。
まずMapの表示をelevation: .flatへ変更した。地図本体をTripMapLayerへ分け、.equatable()で比較することで、検索語やスポット名の入力、候補更新で地図を作り直さない構成にした。軌跡の線も、軌跡が変わったときだけ作るようにした。
名称編集は登録前と登録後の両方に追加した。保存時は旅行全体のBindingへ再代入し、Storeの更新・同期経路を通す。カードの横スワイプ削除は開始距離を12ptから30ptへ変え、縦スクロールとの競合を抑える調整も行った。これらはビルド成功を確認しているが、調整後の操作には未確認の項目がある。
連続入力中のJSON保存をまとめる
従来は編集のたびに、旅行や同期状態、プロフィールをまとめてJSONへ保存していた。保存を0.5秒のdebounceで集約し、同一内容は書かず、ファイル書込みを直列キューへ移した。JSONの整形もやめ、バックグラウンド移行時には保留分を即時保存する。エンコード自体はMainActorに残っている。
確認用プログラムでは、21回の連続変更中にファイルを書かず、0.9秒後に最後の内容が保存されること、flushLocalSnapshotで即時保存されることを確認した。Simulatorでも再起動後に旅行一覧が読めることと、Mapの表示を確認した。署名ありビルドと共有shell回帰も成功している。
CloudKitの周期と重複取得を見直す
前面中の定期取得を30秒ごとから5分ごとへ変更し、タブ切替時にも取得するようにした。直前の取得開始から30秒以内なら省略する。また、同じ更新の一覧取得で受け取った旅行を、続けて個別に取り直す処理を減らした。一覧にない旅行や、一覧取得後に保存が走った旅行は個別取得する。
共有shell回帰には、一覧取得済みの旅行は再取得しない、一覧にない旅行は取得する、30秒以内なら省略する、という3ケースを追加して成功した。Simulatorのログでタブ切替の取得タイミングを確認し、その後ユーザーが実機で、タブ切替と5分ごとの定期取得で共同編集の内容が反映されることを確認した。
負荷改善後も残っていること
今回確認できたのは、保存の集約、取得の省略、表示と共同編集の反映である。端末温度、CPU・GPU使用率、通信量、電池消費の比較は未実施で、発熱が解消したとは断定できない。地図描画変更後の検索・登録・地図タップも、改めて操作確認が必要である。
タブを開いただけで旅行が編集扱いになり保存が走る既存の書き戻し、軌跡記録中の連続GPSと全点保存は未修正である。CloudKitの差分取得にも移行していない。今後は実機で操作と同期を確かめながら、Instrumentsで残る負荷を測定する必要がある。