2026年10月18日、iPhoneからChatGPTに指示を出して、新しいアプリの開発を始めました。
作ったのは「掃除!」というiPhoneアプリです。トイレやキッチンなど、掃除した場所をタップすると、その日時が記録されます。前回の掃除から日数が経つと画面の汚れが増え、掃除するとピカピカになる仕組みです。
今回は、普段の開発方法も変えてみました。私は主にiPhoneから指示を出し、ChatGPTがDesktop Commander経由でMacを操作します。SwiftUIの実装、Xcodeでのビルド、シミュレーターの確認、TestFlightへのアップロードまで、この方法で進めました。
10月18日に開発を始め、20日にビルド26を開発上の正本として確定しました。途中では画面の作り直しや、押せないボタンの修正、保存データの調査、Appleへのアップロードエラーなども経験しました。今回は、その過程を開発記録とGitの履歴に沿って振り返ります。
「最後に掃除したのはいつ?」から始めました
完成した「今日」画面。掃除場所を選ぶ操作を中心にしました。
トイレを掃除した後、次はいつ掃除すればいいのか。キッチンの換気扇は先週だったか、先々週だったか。毎日同じ場所を掃除するわけではないので、前回の日付を覚えておくのは面倒です。
とはいえ、掃除が終わるたびに日付や作業内容を入力するアプリなら、私は使わなくなりそうです。
そこで考えたのが、掃除場所を並べて、終わった場所をタップするだけの仕組みでした。最初から使える場所として、トイレ、キッチン、洗面台、浴室、リビング、寝室、玄関の7か所を用意します。
掃除前と掃除後で見た目も変えたかったので、掃除していない場所には汚れを表示し、掃除後には明るい色と短いアニメーションを付けることにしました。家事の記録を、できるだけ手軽に続けられるようにするのが狙いです。
iPhoneで指示し、Macでビルドする構成
今回使ったのは、iPhoneのChatGPT、Desktop Commander、Mac mini、Xcodeです。データはSwiftDataで保存し、画面はSwiftUIで作りました。
iPhone(ChatGPTで指示・実機確認)
│
▼
ChatGPT
│ Desktop Commander
▼
Mac mini
├─ Git / GitHub
├─ SwiftUI / SwiftData
├─ Xcode / xcodebuild
├─ iOS Simulator
└─ XCTest / XCUITest
│
▼
App Store Connect
│
▼
TestFlight
│
▼
iPhoneで確認
ビルド処理はMacで実行しています。iPhone単体でXcodeを動かしたという話ではありません。私がiPhoneで「ホーム画面の数字を減らして」「このボタンが押せません」と伝え、ChatGPTがMac上のコードを修正して動作確認する流れです。
シミュレーターのスクリーンショットをチャットに表示してもらい、見た目を確認したらまた修正を依頼します。実際のタップ操作を確かめたいときは、TestFlightで配信したビルドをiPhoneに入れて試しました。
10月18日:まずは記録を保存できるようにする
最初に実装したのは掃除場所と掃除履歴のモデルです。掃除場所には名前やカテゴリ、掃除方法を持たせ、掃除したときに日時と対象の情報を履歴として保存します。
シミュレーターで掃除場所を追加してタップし、アプリを終了して再起動しました。記録が残っていることをXCUITestで確認できたので、保存の基本部分は動きました。
ただ、画面は気に入りませんでした。今日の掃除回数や累計、説明文、最近の履歴を一度に表示していて、掃除場所を探しにくかったのです。
そこで、以前から開発していた記録アプリ「うんき」の画面構成を参考にしました。ホームは掃除する場所、履歴はカレンダー、集計はふりかえり、と役割を分けます。専用のGitブランチ refactor/unki-based-rebuild を作り、画面を再構築しました。
機能を追加するたびにホームへ表示を増やすと、肝心の操作が埋もれてしまいます。最初の作り直しでは、表示する情報を減らす作業に時間を使いました。
日付が変わったら、汚れは1段階進める
掃除していない日数に応じた汚れは、最大7段階にしました。
ここで迷ったのが日数の数え方です。例えば月曜日の23時に掃除して、火曜日の朝にアプリを開いた場合、24時間は経っていません。それでも日付は翌日です。
今回は時間差ではなく、暦日を基準にしました。Swiftの Calendar で日付を比較し、7日を超えても汚れの段階が増え続けないようにしています。日付の境界を含む単体テストも追加しました。
掃除すると、くすんでいたカードが明るい色になり、光の演出が表示されます。この表現は何度も調整しました。清潔感を優先すると地味に見え、色を増やすと落ち着きがなくなります。シミュレーターの画像を見ながら、掃除前後の違いが伝わるところを探しました。
ダブルタップで履歴を2件作らない
掃除場所を素早く2回タップしたとき、記録が重複してはいけません。そこで、掃除完了の演出中は短時間の連打を防ぐ処理を入れました。
XCUITestでダブルタップを実行し、掃除済みの表示に変わることと、意図しない重複登録が起きないことを確かめました。
夕方からTestFlightの準備へ
基本機能が動いたので、その日のうちにTestFlightへのアップロードを試しました。
最初に出たのはBundle IDの問題です。Xcode側の識別子とApp Store Connectへの登録が一致していませんでした。設定を修正してアーカイブを作り直すと、今度はアプリアイコンの不足を指摘されました。
必要なアイコン画像を追加し、アセットカタログを設定して再度アップロードします。10月18日19時54分頃、最初のバイナリをAppleへ送信できました。
午前中に考え始めたアプリを、その日の夜にはTestFlight向けにアップロードできたのはうれしかったです。ただ、Apple側で処理が終わるまでは配信できません。以降は、アーカイブ成功、アップロード成功、Appleの処理完了を分けて確認するようにしました。
誤タップを取り消せるようにする
掃除場所をタップするだけの仕組みだと、隣の場所を誤って押す可能性があります。そこで、直近の掃除記録を取り消す機能を追加しました。
最初は場所ごとに「取り消す」を用意しました。その後、掃除を記録した直後に画面下部から戻せるようにもしました。
取り消しでは、選んだ場所の該当履歴だけを削除します。別の場所の記録が残ること、取り消した場所の表示が元に戻ることをテストで確認しました。
TestFlight更新後、記録が消えたと思いました
開発中、TestFlightのビルドを更新した後に、以前の記録が見えなくなったと感じました。保存データに問題があるなら、先に確認しなければなりません。
SwiftDataのモデルや保存処理を調べると、初期の7か所を登録する判定方法に改善点が見つかりました。それまではUserDefaultsの初回起動フラグを見ていましたが、実際に保存されている掃除場所の件数を確認する方針に変更しました。
既存の場所があれば上書きせず、ストアが空の場合に標準の7か所を登録する処理です。ただし、これは消えた履歴を復旧する仕組みではありません。
その後、自分で以前の記録を削除していた可能性に気づきました。更新後のデータ保持を改めて確認すると問題は見つからず、TestFlightの更新によるデータ消失は確認されませんでした。
原因が確定していない状態で保存データを初期化していたら、かえって状況を悪くしたかもしれません。今回はデータを残したまま調べる方針で進めました。
10月19日:触って見つけた使いにくさを直す
履歴はカレンダーと一覧を組み合わせ、掃除した日を後から確認できます。
翌日は、実機で気づいた点の修正が中心でした。
ホーム画面の余分な数字やマークを減らし、履歴にはカレンダーと一覧を配置しました。ふりかえりには日・週・月のグラフを用意しました。
共有カードの「日・週・月」が押せない
日・週・月で掃除の実績を確認する「ふりかえり」画面。期間の切り替え操作も実際にテストしました。
掃除の記録を画像で共有するカードを作り、表示期間を日・週・月から選べるようにしました。
ところが、iPhoneで操作するとボタンが反応しません。見た目には表示されていても、タップ可能な領域が期待どおりになっていませんでした。
SwiftUIのヒットテストを見直し、XCUITestで3つの期間ボタンを実際に押して状態が切り替わるか確認しました。スクリーンショットだけでは見つけられなかった不具合です。
掃除場所を写真にする
続いて、掃除場所の表示に写真を追加しました。
標準の7か所には写真を用意し、ユーザーが好きな写真へ変更できるようにしました。自宅のキッチンやトイレの写真を設定すれば、一覧から場所を探しやすくなります。
この変更では、トイレ用のJPEG画像が正常に読み込めず、Xcodeのアセット処理でエラーになりました。原因のファイルを差し替え、再度アーカイブして解決しました。Swiftのコードだけを見ていても原因にたどり着けないトラブルでした。
バックアップと復元
設定画面。掃除記録のバックアップと復元も用意しました。
記録を続けて使えるよう、JSON形式のバックアップと復元も追加しました。掃除場所、履歴、写真などを扱い、復元時には識別子で照合して重複を避けます。
最初はバックアップ用の共有シートが空白になる問題がありました。ファイルの受け渡しと表示のタイミングを修正し、設定画面から利用できるようにしました。
10月20日:アプリ名を「掃除!」にする
開発中は「そうじ」「掃除をしよう!」という名前を使っていました。最終的に、App StoreとiPhoneのホーム画面では短い「掃除!」にしました。
アプリ内の見出しは「掃除をしよう!」のまま残しました。ホーム画面で見つけやすい名前と、アプリを開いたときの表示を使い分けています。
この時点で、掃除場所の登録、汚れの変化、履歴、グラフ、共有、写真、バックアップがそろいました。GitHubのソースと CURRENT_PROJECT_VERSION を照合し、バージョン1.0.0のビルド26を開発上の正本として確定しました。
App Store Connectにはビルド番号100も登録されていましたが、そのソースと作成理由を確認できなかったため採用していません。番号だけで実装の新しさを判断せず、開発の基準となるソースを記録しました。
App Store向けの素材も用意
完成したアプリを紹介するため、シミュレーターで実際の画面を撮影しました。履歴やグラフを説明できるよう、撮影専用のダミーデータを使っています。
今日、履歴、ふりかえり、設定の各画面からスクリーンショットを用意し、App Store Connectに登録しました。sakumori.comには紹介ページと個別のプライバシーポリシーも作成しました。
完成した機能
| 機能 | 内容 |
|---|---|
| 今日 | 掃除場所をタップして実施日時を記録 |
| 汚れの表示 | 最後に掃除した日から最大7段階で変化 |
| 完了演出 | 掃除後に色と光の表現が変化 |
| 取り消し | 誤って記録した掃除を戻す |
| 履歴 | カレンダーと一覧で確認 |
| ふりかえり | 日・週・月ごとの集計とグラフ |
| 共有カード | 期間別の掃除記録を画像で共有 |
| 写真 | 掃除場所ごとに画像を設定 |
| バックアップ | JSON形式で保存・復元 |
ほかのアプリ「記」との連携に向けて、App Groupへ掃除履歴のJSONを書き出す処理も実装しました。受信側を含む連携全体の実機検証は、別途必要です。
iPhoneから開発してみた感想
一番便利だったのは、画面を確認したその場で修正を依頼できたことです。
以前なら、Macで該当するSwiftUIのコードを開いて修正し、ビルドして画面を確認していました。今回はiPhoneから「この表示を減らしたい」「ボタンが押せません」と伝え、そのまま修正と再テストへ進めました。
一方、作業結果の確認には気を配りました。ChatGPTが「完了」と返しても、ビルドに成功したのか、Appleへのアップロードが済んだのか、TestFlightで試せる状態になったのかで意味が変わります。Gitの変更履歴や実行ログ、App Store Connectの状態を確認する運用は欠かせませんでした。
画面の好みも、言葉だけではなかなか一致しません。シミュレーターの画像を見て具体的に修正箇所を伝える方が、結果的には早く進みました。
10月18日に掃除記録のアイデアを考え、20日にはビルド26を開発上の正本として確定できました。普段使っているMacの開発環境を生かしながら、iPhoneからここまで進められたのは、今後のアプリ開発にも役立ちそうです。
次に同じ方法で開発するときは、最初からUIテストとビルドの対応関係を整えておきたいと思います。今回つまずいた部分を改善すれば、修正後の確認ももっと進めやすくなるはずです。
開発環境・関連リンク
- 開発開始:2026年10月18日
- 開発上の正本確定:2026年10月20日
- アプリ:掃除!
- 開発正本:1.0.0(ビルド26)
- 使用技術:SwiftUI、SwiftData、XCTest、XCUITest
- 開発ツール:ChatGPT、Desktop Commander、Mac mini、Xcode、GitHub
- 配布確認:App Store Connect、TestFlight
※本記事は、2026年10月18日〜20日の開発日誌、Gitの変更履歴、テスト記録をもとにまとめています。一般公開の完了を示すものではなく、アプリ開発とTestFlightでの確認までの記録です。