目次
我が家では、1週間分の夕食を Excel の表で管理していました。曜日ごとに料理名を書いて、そこから買うものを手で書き出す。表自体は機能していたのですが、毎週 PC を開いて、コピペして、買い物メモに転記して……という手間が地味に重く、結局続かなくなりました。
欲しかったのは表計算ではなく、「献立を決めたら、買うものが勝手に出てくる」という一直線の流れでした。それなら自分で作るのが早い、というのが出発点です。
機能は 3 タブだけです。
献立タブで週カレンダーを開いて、日ごとに料理と材料を登録する。買い物リストタブに行くと、その週の材料が集計されて並んでいる。タップすると購入済みに移る。履歴タブには過去に登録した料理が残っていて、材料ごと再利用できる。
この「再利用」が意外と効いていて、2週目以降は献立を組む時間がはっきり短くなります。最初の1週だけ頑張ればあとは楽、という設計にしています。
構成は Expo(React Native)+TypeScript、ルーティングは Expo Router、状態管理は Zustand、永続化は AsyncStorage です。
どれも「この規模ではこれで十分」を基準に選んでいます。状態管理は Redux を入れるほどの規模ではないので Zustand。保存も SQLite や MMKV までは必要なくて AsyncStorage。UI ライブラリは入れず、iOS の見た目を細かく制御したかったので素の StyleSheet で書いています。
一方で、ホーム画面ウィジェットだけは Swift / WidgetKit でネイティブに書いています。App Group 経由でアプリ本体とデータを共有し、今日と明日の献立を表示します。ここを RN 側でなんとかしようとするより、素直に Xcode ターゲットを手で追加した方が結局早かったです。
設計でひとつだけこだわっているのが、献立に料理を登録するときに履歴側の材料を参照ではなくコピーすることです。あとから履歴を編集しても、過去の週の献立は変わらない。「先週何を作ったか」が後から書き換わらないことは、この手のアプリでは大事だと思っています。
リリース後に一番痛かったのがこれです。あるビルドで、Firebase の設定ファイル GoogleService-Info.plist が IPA に同梱されていませんでした。
厄介なのは、ファイルが入っていなくてもビルドは普通に成功するということです。手元では動くし、エラーも出ない。でも実際に配られたビルドでは Firebase の初期化が例外を投げて、起動した瞬間に落ちる。審査でも当然弾かれました。
原因は、ネイティブのリソースが Xcode プロジェクトの Copy Bundle Resources に登録されていなかったことでした。リポジトリにファイルがあることと、それが成果物に入ることは別の話だったという、言われてみれば当たり前のことです。
以降、提出前に IPA を unzip して中身を目で確かめることを手順に入れました。必要なファイルが1件出るか、埋め込まれたビルド番号が意図した値か。この2つを見るだけで、同じ事故は防げます。
もうひとつ。スワイプ中に誤タップしてしまうバグを以前修正していたのですが、コンポーネントを分割するリファクタのときに、その対策コードごと消えてリグレッションが起きました。テスト計画に「過去に直したバグが再発していないか」という項目がなかったのが原因です。
今は、分割・整理系の変更には必ず回帰確認の項目を入れるルールにしています。AI で実装が速くなるほど、こういう「何を壊していないかを確かめる側」の重要度が上がると感じています。
実装はほぼ Claude Code で進めています。使いながら落ち着いたのは、プロンプトを工夫することよりも、リポジトリ側にルールを書いておく方が効く、ということでした。
例えばバージョンを上げるときは app.json だけでは不十分で、Info.plist と pbxproj も同時に直さないと提出で弾かれます。こういう「人間も忘れる手順」をドキュメントに書いておくと、毎回説明しなくても同じ手順で進むようになります。
意思決定のログを残しているのも同じ理由です。なぜそのライブラリを選んだのか、なぜその実装にしたのかを残しておくと、3ヶ月後の自分と AI の両方が助かります。
正直なところ、AI のおかげで「作る」ハードルはかなり下がりました。思いついたものをその日のうちに形にして、実機で確かめられる。
難しいのはその先です。見つけてもらうこと、使い続けてもらうこと。今はストアでの見せ方や ASO、多言語化をひとつずつ試している段階です。このあたりは、同じように個人開発をしている方の話を聞きたいところです。
献立カート(App Store): https://apps.apple.com/app/id6760213937
公式サイト: https://nakakei6439.github.io/kondate-cart/
最後まで読んでいただきありがとうございました。
コメントはまだありません