0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows+Expo+Claude Code、MacなしのiOSアプリ個人開発。平日夜だけ・実働11日で審査一発通過するまでの全記録

0
Posted at

はじめに

「資格取りたいけど、どれが向いてるか分からん」を解決する診断アプリ 「資格みっけ」 をApp Storeにリリースしました。

1分の性格診断に答えると、12種類の動物タイプに分類されて、自分に合う資格・検定が提案されるアプリです。

ホーム画面 質問画面 結果画面

この記事のポイントは3つです。

技術構成と設計判断

項目 選定
フレームワーク Expo SDK + TypeScript (strict)
ルーティング expo-router
状態管理 React標準 (useState/useReducer + Context)
テスト Jest
ビルド EAS Build (無料枠)
開発機 Windows 11 + 実機iPhone (Expo Go)

一番大きな設計判断は 「通信を一切しない」 ことです。診断ロジック・質問・資格データベースはすべてアプリ内蔵のTypeScriptデータにしました。

理由は審査対策です。通信しなければApp Store Connectのプライバシー申告が「データ収集なし」の最軽量になり、審査で突っ込まれるポイントが激減します。個人開発では「機能を足す判断」より「削る判断」の方が審査通過に効くと感じました。

外部の状態管理ライブラリも入れていません。この規模ならReact標準で十分で、依存が減るほどClaude Codeへの指示もシンプルになります。

AIとの分業体制

今回の開発は「AIに丸投げ」ではなく、役割を明確に分けました。

  • チャット(Claude): 要件定義、資格データの調査、設計判断の相談、実装プロンプトの作成
  • Claude Code: 実際のファイル編集、テスト作成、リファクタリング
  • 人間(私): 意思決定、実機での動作確認、コンテンツの最終レビュー
    この体制で効いたのが CLAUDE.md です。リポジトリ直下に置く指示書で、ここに実装ルールを書いておくとClaude Codeが毎回それを守ってくれます。私が書いたルールの一部:
- 診断ロジック(scoring.ts)は副作用のない純関数で書き、Jestで境界値テストを書く
- アフィリリンクは外部ブラウザ起動。WebView埋め込み禁止(審査対策)
- EAS Buildは無料枠のため、Claude Codeが勝手に `eas build` を実行しない
- 個人情報の収集・送信・保存を行うコードを書かない
- 資格名は必ず正式名称。一次情報で確認済みのデータのみ使用

特に「勝手にビルドしない」「未確認データを追加しない」のような 禁止事項 を書いておくのが重要でした。AIは良かれと思って先回りするので、やってほしくないことを明文化しておくと事故が減ります。

品質面では、診断のスコアリングロジックを純関数にしてJestで境界値テストを書かせました。「この回答パターンならこのタイプになるはず」を自分で答えて検証する、というアナログなチェックも併用しています。

Macなし開発の現実

「iOSアプリ開発=Mac必須」は、Expo + EASの構成ならほぼ過去の話です。

  • 日常開発: npx expo start → 実機iPhoneのExpo GoでQRコード読み取り → 即確認
  • 本番ビルド: eas build --platform ios → クラウド上でビルド → TestFlightへ
    XcodeもMacも一度も触っていません。注意点はEAS Buildの無料枠が iOS月15回 なこと。日常の確認は全部Expo Goで済ませて、ビルドはTestFlight確認と審査提出のときだけに絞れば余裕で収まります(私は2回で収まりました)。

ハマったところと解決

その1: Apple Developer登録が住所で止まる

最初にして最大のつまずきです。Apple Developer Programの支払いを済ませたのに、登録が保留のまま数日進まない。サポートに問い合わせたところ、登録時に提示した住所が無効または不完全とのことで、ローマ字表記での再送を求められました。

原因は、登録フォームのこの欄です。

Street:
City:
State:
Postal Code:

英語が得意でないと、日本の住所をどう分解すればいいのか分かりません。正解はこうです。

フォームの欄 入れるもの 例(横浜の場合)
Street 町名・番地以下 1-2-3 ○○-cho, ○○-ku
City 市区町村 Yokohama
State 都道府県 Kanagawa
Postal Code 郵便番号 231-XXXX

日本の住所は「大きい→小さい」順ですが、英語は「小さい→大きい」順。この対応が分からずに適当に入れると、私のように登録が止まります。再送後、1日ほどで承認されました。

教訓: Apple Developer登録は審査待ちが発生するので、開発の一番最初に着手すべき。 私はこの間に資格データの調査やキャラ生成を並行して進めていたので、時間を無駄にせずに済みました。

その2: AI生成キャラの背景透過

12種類の動物キャラはAI画像生成(主にGemini)で作りました。問題は背景透過です。生成画像は背景付きで出てくるので、透過PNG化が必要でした。

採用したのはPythonの rembg(u2netモデル)。ただし一筋縄ではいかず、

  • ミツバチの羽の内側が「穴」として抜けてしまう
  • 透過済みに見えて、市松模様(チェッカーボード)が画像に焼き込まれていた
    といった事故がありました。対策として、背景除去後に連結成分をチェックする簡単なQAスクリプトを書いて(もちろんClaude Code製)、目視と機械チェックの二段構えにしました。

審査対策と結果

やったことは2つだけです。

  1. プライバシー申告「データ収集なし」(通信なし設計のおかげ)
  2. 提出前にTestFlightで本番ビルドの全導線をタップ(クラッシュ確認)
    結果、一発通過でした。個人開発のリジェクト理由は「クラッシュ」「プライバシー」「機能が薄い」が定番なので、この3点を潰しておけば診断×データベース×シェアの構成で十分戦えます。

まとめ

  • 期間: 平日夜中心、実働11日
  • 費用: Apple Developer Program $99 + AI利用料
  • Mac: 不要でした
  • 審査: 一発通過
    AIとの個人開発は「実装力」より「決める力」が問われる感覚でした。何を作るか、何を削るか、どのデータを信用するか。実装をClaude Codeに任せられる分、人間の仕事は上流に寄ります。

「資格みっけ」、よかったら触ってみてください。1分で自分の動物タイプが分かります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?