はじめに
「資格取りたいけど、どれが向いてるか分からん」を解決する診断アプリ 「資格みっけ」 をApp Storeにリリースしました。
1分の性格診断に答えると、12種類の動物タイプに分類されて、自分に合う資格・検定が提案されるアプリです。
この記事のポイントは3つです。
-
Macを持っていません(Windows 11のみ)
-
実装はほぼClaude Code(人間は設計と意思決定に集中)
-
平日夜のスキマ時間、実働11日で審査一発通過
同じ構成で個人開発したい人の参考になれば嬉しいです。 -
App Store: https://apps.apple.com/jp/app/id6791038439
技術構成と設計判断
| 項目 | 選定 |
|---|---|
| フレームワーク | 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つだけです。
- プライバシー申告「データ収集なし」(通信なし設計のおかげ)
-
提出前にTestFlightで本番ビルドの全導線をタップ(クラッシュ確認)
結果、一発通過でした。個人開発のリジェクト理由は「クラッシュ」「プライバシー」「機能が薄い」が定番なので、この3点を潰しておけば診断×データベース×シェアの構成で十分戦えます。
まとめ
- 期間: 平日夜中心、実働11日
- 費用: Apple Developer Program $99 + AI利用料
- Mac: 不要でした
- 審査: 一発通過
AIとの個人開発は「実装力」より「決める力」が問われる感覚でした。何を作るか、何を削るか、どのデータを信用するか。実装をClaude Codeに任せられる分、人間の仕事は上流に寄ります。
「資格みっけ」、よかったら触ってみてください。1分で自分の動物タイプが分かります。


