2026年10月20日、「掃除!」の開発をひと区切りにして、今度は筋トレ記録アプリを作り始めました。机の前でMacを操作する代わりに、今回もiPhoneのChatGPTから指示して進めます。
前のアプリでは、掃除した場所をタップして記録し、カレンダーやグラフで振り返る仕組みを作りました。その画面と記録処理を使えば、筋トレにも応用できそうです。まずはスクワットや腕立て伏せをタップして記録するアプリにすることにしました。
そして10月22日には、「筋トレ!」1.0.0(ビルド14)をApp Storeの審査へ提出しました。
今回紹介したいのは、筋トレ記録アプリの作り方だけではありません。iPhoneからChatGPTに頼むと、Macでコードの編集、Xcodeのビルド、テスト、TestFlightへの配布まで進められるという開発方法です。「掃除!」に続いて2本目を作ったことで、同じ環境を次のアプリにも使えることを確かめられました。
iPhoneからXcodeを操作する仕組み
私が主に触ったのはiPhoneです。ChatGPTとの会話で仕様を決め、画面を見て修正を頼み、TestFlightで実際のアプリを確認しました。
Mac miniにはXcodeを用意してあり、ChatGPTはDesktop Commander(DC)を通じてMacのファイルやターミナルを操作します。Swiftのコンパイルやアーカイブ自体は、Mac側で実行しています。
iPhoneのChatGPT
│ 画面の希望、修正指示、ビルドの依頼
▼
ChatGPT
│ Desktop Commander
▼
Mac mini
├─ SwiftUI / SwiftDataの実装
├─ Xcodeでビルド
├─ iOS Simulatorで画面確認
├─ XCTest / XCUITest
└─ Git / GitHub
│
▼
App Store Connect / TestFlight
│
▼
iPhoneでインストール・操作確認
例えば「筋トレメニューを並べ替えられるようにして」と頼むと、Mac上でコードを変更してビルドします。シミュレーターでの確認結果を見て、次の修正を頼みます。実機で確かめたい部分はTestFlightへ送って確認する、という進め方です。
「掃除!」では、この一連の作業を行うための環境を整えました。今回は、その環境を使って別のアプリを作ります。
「掃除!」の仕組みを次のアプリに使う
筋トレの記録を毎回細かく入力するのは面倒なので、スクワットならスクワットのカードをタップする方式にしました。最初のメニューは腕立て伏せ、スクワット、腹筋、プランク、ランジ、背筋、ストレッチです。
既存の掃除アプリには、タップした日時をSwiftDataへ保存する処理、カレンダー、日・週・月の集計、共有カードなどがそろっています。それらを土台にして、筋トレ用のメニューと見た目に変更しました。
ここからは、iPhoneで指示しながら、実際にどこを作り替えたのかを紹介します。
筋トレメニューを作って、iPhoneで動きを確かめる
各メニューには、名前、分類、実施内容を設定します。例えば腕立て伏せなら「上半身」「10回 × 1セット」、プランクなら「体幹」「30秒 × 1セット」といった具合です。
実装では、メニューをタップすると実施履歴を追加します。同じメニューを一日に何回か行った場合にも記録できるようにしました。もちろん、押し間違えたときの取り消しも用意しています。
「今日」画面。筋トレメニューを並べ、タップして記録します。
最初の構成を作る段階では、元アプリのコードが使えるので作業を早く進められました。一方、掃除用の言葉や設定が残っていないか、画面と内部処理の両方を確認する必要がありました。
メニューは自分で編集・並べ替えできるようにする
筋トレの内容は人によって違います。最初に用意した7種類だけでは足りません。
そこで、メニューの追加と編集、削除に対応しました。名前や実施内容を変えられるほか、メニューの順番も並べ替えられます。写真を設定して、カードの表示に使うこともできます。
追加したメニューが記録できることに加え、同じメニューを繰り返しタップしたときの表示や、編集モードに切り替えたときの操作も確認しました。
XCUITestでは、スクワットを記録し、続けてもう一度記録した後、編集モードへ切り替える操作をテストしています。
掃除アプリを流用したとはいえ、メニューの種類が増えたり、並び順を変更したりする部分は、筋トレアプリとして調整が必要でした。
見た目は金塊をモチーフにしました
今回のデザインは「掃除!」とは大きく変えました。
掃除アプリは、水色やダイヤモンドの輝きを使っています。一方、「筋トレ!」では金塊をモチーフにしています。頑張った記録が積み上がっていく雰囲気にしたかったからです。
開発中は、カードの色や背景、アイコンの見え方を何度も調整しました。最終的には、白を基調にした背景と、金塊の画像を使ったデザインへまとめています。
写真やアイコンを変更しても、タップする場所がわかりにくくならないよう、カードの見え方も見直しました。
「掃除!」と同じ操作感を残しながら、アプリを開いたときの印象は筋トレ用に変えられました。
一番注意したのは、掃除アプリとのデータ混在
開発中、重大な問題が見つかりました。筋トレアプリなのに、掃除アプリのデータが混ざる状態になっていたのです。
原因はSwiftDataの保存先でした。元のアプリを利用して開発したため、共有領域のデータベースを参照する構成が残っていました。
アプリ名とBundle IDを分けただけでは、データの保存場所まで必ず分かれるとは限りません。今回はそこを修正する必要がありました。
対策として、筋トレ専用のSwiftDataストアをアプリの保存領域内に設けました。保存ファイル名も kintore-private.store として、掃除アプリの記録と分離しています。
一方、「記」への連携用JSONは、既存のApp Groupに書き出す仕組みを残しました。筋トレ記録の本体データと、別アプリに渡すデータの役割を分けた形です。
// 保存先はアプリ専用のApplication Support配下
let directory = try FileManager.default.url(
for: .applicationSupportDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true
)
let url = directory.appendingPathComponent("kintore-private.store")
let config = ModelConfiguration(
schema: schema,
url: url,
cloudKitDatabase: .none
)
この変更では、過去の共有ストアにあるデータを扱う可能性も考慮しました。移行が必要な場合は、筋トレに該当するメニューだけを選び、元の共有データベースを壊さないようにしています。
掃除側と筋トレ側をそれぞれ確認し、テストを実行してから配布用ビルドを更新しました。
この問題がわかったときは、見た目を筋トレ用に変えただけでは安心できないと感じました。次回は、画面を作り始める段階で保存先も確認します。
履歴とふりかえりは、掃除アプリの仕組みを活用
筋トレの履歴はカレンダーと一覧で確認できます。
履歴画面。実施した日とメニューを振り返ります。
日・週・月の集計も用意しました。筋トレを何回実施したか、何日取り組んだかを確認でき、結果を共有カードとして書き出せます。
共有カード。日・週・月の期間を選んで記録をまとめます。
この部分では「掃除!」で苦労した経験が役立ちました。以前、共有カードの「日・週・月」ボタンが画面上には見えるのに押せない問題がありました。
そのため今回は、期間切り替えのXCUITestも用意しています。見た目だけで確認を終えず、タップして表示が切り替わるかをテストしました。
「記」との連携は、書き出しと読み込みを分けて考える
筋トレの記録を、別アプリ「記」のライフタイムラインでも扱えるようにする構想があります。
筋トレアプリ側では、App Groupの共有領域へ kintore.json を書き出す処理を実装しています。
「記」側にも筋トレのデータを読み取る変更を用意しましたが、実機での連携がすべて確認できたとは扱っていません。送信側がJSONを書き出せることと、受信側が期待どおりに画面へ表示することは別の確認項目です。
複数アプリを連携させる場合、片方の実装だけで動作確認を終えないようにしています。
10月22日、ビルド14を審査提出
開発中はTestFlight向けのビルドを更新しながら、操作性やデザインを確認しました。
10月22日時点の最新UIとして記録されているのは、バージョン1.0.0(ビルド14)です。金塊の画像、白を基調とした背景、2列のカード表示などを調整した版です。
GitHubでは、このビルドに対応するソースを保存し、appstore-submitted-1.0.0-build14 というタグを付けました。審査に出した状態を後から確認できるようにするためです。
リポジトリは sakumoridai/kintore-ios、Bundle IDは com.sakumori.kintore.app です。なお、Xcodeプロジェクトの内部名には元アプリの Souji が残っています。名称だけを機械的に置換して動作を壊さないよう、利用者に表示する名前と内部構成を区別して管理しています。
10月22日に初回審査へ提出したことはGitHubの記録で確認できます。審査結果や一般公開については、この記事の記録範囲とは分けています。
2本目まで作ってわかった、iPhone開発の使いどころ
「掃除!」を作ったときは、iPhoneからの指示でどこまで開発できるのかを試していました。「筋トレ!」では、整えた環境と前のアプリのコードを使って、次のアプリを作りました。
今回便利だったのは、思いついた変更をその場で伝えられることです。メニューの並びや色が気になったら、iPhoneから修正を頼みます。Macではコードの変更とビルドが進み、確認用の画面ができたらまた判断できます。Xcodeを直接触る作業が減った分、アプリの使い心地を確かめながら進められました。
もちろん、Macの開発環境は必要です。また、配布したビルドが正しいか、データがほかのアプリと混ざっていないかは、実際のファイルやテスト結果で確かめました。今回のSwiftDataの問題は、そうした確認で見つけたものです。
iPhoneで指示を出し、ChatGPTとDCでMacを動かし、完成したアプリをiPhoneで試す。 「掃除!」で試したこの手順を、「筋トレ!」でも使えました。次に別のアイデアをアプリにするときも、この環境から始めようと思っています。
開発環境・関連リンク
- 開発期間:2026年10月20日〜22日
- 審査提出版:1.0.0(ビルド14)
- ChatGPT / Desktop Commander
- Mac mini / Xcode / iOS Simulator
- SwiftUI / SwiftData / XCTest / XCUITest
- Git / GitHub / App Store Connect / TestFlight
- アプリ紹介ページ:筋トレ!
- サポート:筋トレ!サポート
※App Storeの審査提出まではGitHubの記録で確認しています。審査結果や一般公開の状況は、この記事では断定していません。外部アプリ「記」への連携も、実機での確認が済んだ範囲を区別しています。