4回連続リジェクト
ElioをApp Storeに出すまでに、4回リジェクトされた。1回目は「まあそういうこともあるか」と思ったけど、4回目になると正直メンタルに来る。でも全部違う理由でのリジェクトだったので、それぞれに学びがあった。
時系列で振り返ってみる。
1回目: iPad Air M3で89%止まり
最初のリジェクトは予想外の角度から来た。
「Your app was not able to be installed on iPad Air (M3)」
え、iPadで動かないの? — 手元のiPhone 16 ProとiPad Pro M4では問題なく動く。でもAppleの審査チームがiPad Air M3でダウンロードすると、進捗バーが89%で止まるらしい。
原因を調べると、アプリバンドルのサイズだった。Elioはローカル推論のためにCoreMLモデルを同梱している。このモデルファイルが大きすぎて、iPad Air M3のストレージ構成でOTAインストールが途中で失敗していた。
対策として、CoreMLモデルをApp本体から分離して、初回起動時にオンデマンドでダウンロードする形に変更した。NSBundleResourceRequestを使ったオンデマンドリソース化。バンドルサイズが380MBから95MBに縮小して、この問題は解消された。
2回目: マイクの権限文言
2回目は、よくある系のリジェクトだった。
「The purpose string for microphone access is not sufficiently detailed」
Elioは音声入力機能があるので、マイクのアクセス許可を求める。そのときに表示する文言が「音声入力に使用します」だけだった。Appleの基準では「何のために」「どう処理されるか」をもっと具体的に書く必要がある。
修正後の文言:
「Elioは音声をデバイス上でテキストに変換します。音声データはサーバーに送信されず、端末内でのみ処理されます。」
ポイントは「サーバーに送信されない」と明記したこと。Elioはローカル推論がウリなので、プライバシーに関する説明を入れたら一発で通った。
3回目: 中国向け規制対応
3回目が一番面倒だった。
Elioは多言語対応しているので、中国のApp Storeでも公開される設定になっていた。中国で公開するAIアプリには、追加の規制要件がある。具体的には、AIが生成するコンテンツに関する免責事項の表示と、コンテンツフィルタリングの実装が求められた。
正直、中国市場をそこまで優先していなかったので、最初は中国ストアから除外しようかと思った。でも、中国語話者のユーザーは一定数いるし、将来的な可能性を考えて対応することにした。
やったこと:
- AIチャット画面に「AI生成コンテンツには誤りが含まれる可能性があります」の免責表示を追加
- P2P分散推論の機能を中国リージョンでは無効化
- プライバシーポリシーの中国語版を整備
4回目: スクリーンショットの不備
4回目はもう力が抜けるようなリジェクトだった。
「Screenshots do not accurately reflect the app experience on iPad」
iPad用のスクリーンショットに、iPhone版のスクリーンショットを引き伸ばしたものを使っていたのがバレた。いや、バレたというか、審査員にはすぐわかるよなと。
ちゃんとiPadでスクリーンショットを撮り直して、iPad特有のSplit ViewやSlide Over対応も見せるようにした。
5回目でついに承認
5回目の提出で、ようやく承認された。最初のリジェクトから承認まで、ちょうど3週間。
振り返ると、4回のリジェクトから学んだことは:
- 実機テストは全デバイスでやる — シミュレータだけじゃ不十分。特にストレージ周り
- 権限の説明文は具体的に — 「何に使う」だけでなく「データがどこに行くか」まで書く
- 公開地域は最初から絞る — 全世界公開にすると、各国の規制に対応する必要がある
- スクリーンショットは手を抜かない — 審査員は細かく見ている
App Store審査は辛いけど、結果としてElioの品質が上がった。特にオンデマンドリソース化は、審査がなかったらやらなかったかもしれない。外圧が改善を生むこともある。
技術的な詳細はこちら → Elio審査対応の技術的な裏側