App Store Connectで頂いた珠玉のリジェクト理由たち〜解決策を添えて〜
「お前才能ないからアプリ開発するのやめた方がいいよ」とApple Review Teamに言われてもおかしくないくらいリジェクトをくらいましたので、ボロボロだけどここに車輪を置いておきます。
Guideline 1.5 - Safety
The Support URL provided in App Store Connect does not direct to a website with information users can use to ask questions and request support.(App Store Connectで提供されるサポートURLは、ユーザーが質問やサポートを依頼するための情報が記載されたウェブサイトには直接アクセスできません。)
メールアドレスを記載するだけで許してくれる優しいReview担当もいるが、フォームがないとダメだという厳しいReview担当もいる。後者にあたった時は、Google FormやMicrosoft Formsで1つ作って、そこへのリンクを貼っておけば許してくれる。Canvaの無料プランで作った「hogehoge.my.canva.site」でも通ったので、独自ドメインじゃなくてもいいぽい。ただ、Google AdMobを使う場合はサーバーにテキストファイルを置かないといけない関係でCanvaだと無理っぽい。
Guideline 2.1 - Performance - App Completeness
Revise the app and metadata so that all of its content is complete and final.(アプリとメタデータを修正し、すべてのコンテンツが完全かつ最終的なものにしてください。)
「Coming Soon」のような次回アプデ時に実装しようとしている表示は認められないらしい。それ以外にも、ロード中に「Loading…」とテキスト表示するのもダメらしい。未実装機能はそもそもUIに表示させず、Loading画面はおとなしくProgressViewを使うか、もしくは何も表示しないことで解決。
To resolve this issue, please be sure to take action and submit your in-app purchases and upload a new binary in App Store Connect so we can proceed with our review.(この問題を解決するには、App Store Connectでアプリ内課金を送信し、新しいバイナリをアップロードしてください。)
未だに「バイナリ」という概念がわからないけれど、「アプリ内課金」もしくは「サブスクリプション」で配信地域や価格を設定したのち、バージョンページかアプリ情報ページで課金アイテムを選択する必要があった気がする。気がするというのはすでにその運用はなくなっている気がする。というか見つけられない。でも審査が通っている。要するに、アイテムの登録だけでなく、アプリとそのアイテムの紐付けが必要だよということ。
Bug description: No action was taken when we tapped Sign in with Apple. We were unable to sign in the app.(Appleでサインインをタップしても何も行われませんでした。アプリにサインインできませんでした。)
FirebaseでSign in with Appleを実装していたと思いきや、無意識のうちに匿名ログインもONにしていた。そして、匿名ログイン処理をコード内に書き忘れた結果、ログインの挙動がおかしくなった。当たり前。Firebaseの設定と自分のコードに齟齬がないか確認しよう。
Bug description: your app did not display content.(アプリがコンテンツを表示しない)
アプリが表示されないのか、中身が表示されないのか、このフィードバックはちょっと不親切だと思いつつ、皆さまにおかれましてはテスト時に「ダークモード」の表示も確認しておくのが良い。文字の色を白色などで固定していると、ダークモード時にボタンの色と同じ色になって結果として何も表示されないということが起こり得る。
Guideline 2.4.5(i) - Performance
Your app uses one or more entitlements which do not have matching functionality within the app.(あなたのアプリは、アプリ内で一致する機能を持たない1つ以上のエンタイトルメントを使用しています。)
Xcodeで「YourApp.entitlements」という黄色いアイコンをクリックして、「com.apple.security.network.server」というのが表示されていたら削除する。よくわからないけど、よくあるミスらしい。アプリをサーバーとして使う時に必要らしいが、よくわからない。ただAPIを使うだけの時は不要とのこと。
Guideline 3.1.1 - Business - Payments - In-App Purchase
The app unlocks or enables additional functionality with mechanisms other than in-app purchase, which is not appropriate.(このアプリは、アプリ内課金以外の仕組みで追加機能をアンロックまたは有効にしていますが、これは適切ではありません。)
サブスク登録したら、ユーザー自身が発行したOpenAIのAPIトークンを使ってGPTを使えるようになる、という機能を想定していたがどうやらダメらしい。Apple以外の課金を必須にするのがダメということ。おとなしく諦めよう。
Guideline 3.1.2 - Business - Payments - Subscriptions
The submission did not include all the required information for apps offering auto-renewable subscriptions. Apps offering auto-renewable subscriptions must include all of the following required information in the binary(自動更新可能な購読を提供するアプリに必要な情報がすべて含まれていない。自動更新可能なサブスクリプションを提供するアプリは、バイナリに以下のすべての必須情報を含める必要があります)
タイトル、期間、価格、プラポリと利用規約へのリンクを全てアプリ内で確認できるようにしないといけない。StoreKitでApp Store Connectの「App Storeのローカリゼーション」で設定した表示名だったり、配信地域ごとの価格を取得できるので、それを表示するのが丸い。Buildして購入テストをするとデータが更新されるので、コード修正してBuildして反映されてない!と焦ってはいけない。一度最後までテストして、もう1度Buildする必要があるかも。
Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
To resolve this issue, please revise the app to let users freely access the app's features that are not account based.(この問題を解決するには、ユーザーがアカウントに基づかないアプリの機能に自由にアクセスできるようにアプリを修正してください。)
闇雲にログイン機能を作るなよ、というジャブ。メモアプリを作っていたので、「全てのデータはアカウントに紐づくのでOKです」と回答すれば納得いただけた。ただし、利用規約やプライバシーポリシーはログインする必要がないので、ログイン画面から閲覧できるようにした方がいいかも。