Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

App Storeでサブスクリプションのアプリ内課金を審査に通すまで

アプリ内課金の経験を増やしたいな、と思って、個人でアプリ内課金の実装をしてみたいな、と思っていました。アプリ内課金、特にサブスクリプションは審査に通す難易度が高いと言われています。

作ったアプリの宣伝

PhotoGuesserというアプリを作りました。

PhotoGuesser

PhotoGuesser

  • Kouki Saito
  • エンターテインメント
  • 無料
apps.apple.com

動画を撮ったので見てみてください!もしくはインストールして触ってみてください!


www.youtube.com

実はiPadで開発しています。どうやってやっているの?と思った方はこちらもみてください!

kouki.hatenadiary.com

サポートURLはちゃんとしたものを使う

App Storeではアプリごとに、サポートURLが必須になっています。これは開発者に連絡を取るための手段で、これまではXなどのURLで通っていたので、今回も最初はそれで審査に出したのですが、アプリ内課金が入ると厳しいのか、最近は許可されなくなっているのか、レビュワーによって判断が分かれるのか、理由はわからないのですが今回はGuideline 1.5 - Safetyで審査が落ちていました。

メールアドレスを書いたサポートページを急ごしらえで作って、それで対応しました。

定期購読の要件

Guideline 3.1.2 - Business - Payments - Subscriptions で、定期購読の要件について書かれています。

https://developer.apple.com/jp/app-store/review/guidelines/#subscriptions

サブスクリプションでは必要な項目が多く、Apple Developer Program使用許諾契約の別紙2で説明されている要件というのが必要でした。一通りレビューガイドラインは読んでから審査提出していたんですが、別紙までは目を通せていなかった。

Appleが提供しているアプリ内課金のUIを持っているSubscriptionStoreViewをそのまま使っていたので、この辺りの要件は満たしているのかと思っていたのですが、ちゃんと考慮しなければならないようでした。

まず、プライバシーポリシーと利用規約をアプリ内のバイナリに含めなければいけないとのことでした。設定画面に追加したのと、定期購読画面にも、SubscriptionStoreViewのモディファイアでsubscriptionStorePolicyDestination, subscriptionStorePolicyDestinationを使うことで、それぞれ表示できるようになります。

また、利用規約はApp Store Connectにも登録する必要があります。利用規約へのリンクを記述する形で対応しました。

https://developer.apple.com/help/app-store-connect/manage-app-information/provide-a-custom-license-agreement

あとは、アプリ内課金の説明を調整しました。ユーザーが受け取る利益について説明されていない、という理由で何度か審査が通らなかったので。元々は「アプリ内の全ての機能が使えるようになります」みたいな書き方をしていたのですが、具体的に「フィルタリング機能が使えるようになります」のように変更すると通りました。これから機能追加をしたときに備えておきたかったのですが、その時に考えることにします。

他にも、期間や価格などを明示しろ、というフィードバックも来ていました。この辺りはSubscriptionStoreViewに任せていてちゃんと表示できていて、特に変えたりせずに最終的に審査が通ったので、おそらく定型文なのかな?最終的には以下のUIで通りました。

実装コードは、SubscriptionStoreViewをほぼそのまま使っているだけです。簡単ですね

SubscriptionStoreView(groupID: PurchaseModel.proGroupId)
    .subscriptionStorePolicyDestination(url: URL(string: "https://koukilab.web.app/privacy.html")!, for: .privacyPolicy)
    .subscriptionStorePolicyDestination(url: URL(string: "https://koukilab.web.app/photo-guesser/terms.html")!, for: .termsOfService)
    .storeButton(.visible, for: .restorePurchases)
    .tint(Color.blue)

リストアボタンを追加する

アプリ内課金といえばリストアボタンを用意する、というのがアプリ内課金を実装したことある人の中では常識ですよね。でも今回レビューガイドラインを見ていて、リストアボタンを置くというレビューガイドラインは存在しないということに気づきました。

なので、最初はリストアボタンなしで実装して審査に出してみました。最近のアプリ内課金では、ちゃんと作るとリストア相当の処理は自動でハンドリングできるのですよね。リストアボタンを押す機会は存在しないような作りにもできるので、そのように実装して審査に出してみました。

が、見事に審査落ち。理由は Guideline 3.1.1 - Business - Payments - In-App Purchase です。

ガイドラインに書いてないじゃん!と思ったのですが、https://developer.apple.com/documentation/storekit/in-app_purchase に書いてあるでしょ、と言われました。書いてなくない・・・?と思ったのですが、戦うのもめんどくさかったので素直にボタンを追加しました。

SubscriptionStoreView を使っていたら、リストアボタンは1行追加するだけで追加できます。

.storeButton(.visible, for: .restorePurchases)) のモディファイアを追加して、再度審査へ。

審査通過!

ということで、課金機能の開発以外にもこれくらいのやり取りを発生して、無事サブスクリプションの審査が通りました。プライバシーポリシーや利用規約をちゃんとしないといけないので、少しハードルが高いですね。僕は「良いウェブサービスを支える 「利用規約」の作り方」を参考にしながら作っていました。

ということで、久しぶりに作ったアプリをリリースしました!サブスクリプションの実装をした理由は儲けたいというよりは、アプリ内課金の実装を試してみたいというものだったので、サブ的な機能がアンロックされる形になっています。メインの機能は課金なしで楽しめるようにしているので、気軽に遊んでみてください!

PhotoGuesser

PhotoGuesser

  • Kouki Saito
  • エンターテインメント
  • 無料
apps.apple.com