1. 組み込み前のiTunes Connectの設定
(1) iTunes Connectで、アプリ内課金を組み込みたいアプリのApp情報を開く。
(2) 機能タブからApp内課金を開き、情報を追加する。
(3) 製品IDは、逆ドメイン名で指定推奨。
(4) アプリで表示されるアプリ内課金コンテンツの説明文に英語版は必須で、日本語版などローカライズ版を追加する。
(5) 削除した製品IDは削除した状態のまま残り、再利用することはできない。
(6) 作成内容に問題がないことを確認したのち「保存」する。後述する通り、「保存」ではなく「審査提出」とするのが望ましい。
2. アプリにアプリ内課金のコードを組み込む(下記は非消耗型の場合)
(1) 上記1.(3)で定義した製品IDを、アプリ内バンドルplistに組み込む。あるいは、サーバから取得する。
(2) 製品IDを元にStorekitを用いてAppleのサーバにアプリ内課金情報をリクエスト。
(3) (2)で取得した情報を取得して、購入ボタンとともに画面表示する。
(4) 無効な製品IDは購入対象から除外するようにすること。
(5) ユーザが製品IDを選択して購入ボタンを押したときに、StoreKitを用いてAppleのサーバに購入の要求をする。
(6) 購入時のApple IDの入力、購入完了の画面はStoreKitで自動的に表示される。
(7) アプリ側はStoreKitの処理結果を受けて画面再表示などを行う。
(8) 購入後のレシートはStoreKitによりアプリ内に所定の場所に保存される。
(9) レシート復元画面を作り、StoreKitを用いて実施するレシート復元コードを追加。レシートの更新(SKReceiptRefreshRequest)と復元(SKPaymentQueue: restoreCompletedTransactions)の2種類がある。
(10) アプリ内課金コンテンツを利用する場合は、レシートの検証を実施する。レシートの検証は独自に組み込むこと。セキュリティを強固にするために、オリジナルなコードでレシート検証を実装する。
(11) Appleが推奨するレシート検証手順にて検証を実施し、さらに使用しようとしているアプリ内課金コンテンツの製品IDがレシートに含まれ、かつ、有効なレシートである場合に、コンテンツが利用できるようにする。可能な限り複雑かつ強固な検証ロジックを組み込む必要がある。
3. テスト環境でのテスト
(1) Macにデバイスを接続し、Xcodeからアプリを起動した場合は、Appleのアプリ内課金サーバはテスト環境に接続される。購入時に画面上に「sandbox」と表示される。
(2) 購入、復元、エラー処理、コンテンツ利用時のレシート検証等、あらゆるテストケースを考慮しテストを実施する。
(3) テスト用のApple IDアカウントは、専用のアカウントを使用すること。一度、本番環境で使用したアカウントは、テスト環境では利用できなくなる。
4. 本番環境でのテスト
(1) アプリ内課金は、Appleの審査が必要なので、開発中は本番環境でのテストはできないが、AdHocやTestFlightを使って動作確認を実施する。
(2) 本番環境(Production)向けにビルドしたAdHoc用バイナリやTestFlight向けにアーカイブしたバイナリ(iTunes Connectにアップロードしたバイナリ)で実行しても、Appleのアプリ内課金サーバはテスト環境に接続される。(購入時、StoreKitで表示される画面において「sandbox」と表示される。)
5. テスト完了後のiTunes Connectの設定
(1) Xcodeからアプリをアーカイブして、iTunes Connectにアップロードする。
(2) iTunes ConnectのApp内課金を開き、審査用スクリーンショットをpng形式で登録する。
(3) 初回のアプリ内課金組み込み時は、審査するバージョンの画面におけるApp内課金セクションで組み込むアプリ内課金を選択して保存、審査に提出する。(2020年11月10日現在、アプリ内課金を選択する設定はなくなっている)
(4) (3)操作後、アプリ内課金を組み込んだバイナリのバージョンが「審査待ち」、アプリ内課金も「審査待ち」となっていることを確認する。審査待ちとなった後は、アプリ内課金を組み込んだバイナリのバージョンの画面にはApp内課金セクションは表示されなくなる。(3)を操作しないと、アプリ内課金は「審査待ち」とはならず、いつまで経っても「送信準備中」となる。(3)の操作を忘れてアプリのバイナリのみ「審査待ち」状態にした場合は、アプリの審査待ちをセルフリジェクトして、(3)の操作をやり直す。
6. App Storeリリース時
(1) 配信開始は手動で実施すること。
(2) アプリ内課金の配信開始は、アプリのバイナリの配信開始と必ずしも同期が取れているわけではない。アプリのバイナリ及びアプリ内課金のステータスがReady For Salesとなってから9時間以上経過してアプリ内課金の購入が出来る場合があるため、ステータスがReady For Salesとなってから半日程度経過後に、App Storeでのバイナリ配信を開始すること。
(3) 上記(2)の状況を避けるためには、アプリ本体の審査提出の前日までに、アプリ内課金のメタデータ作成時にアプリ内課金の設定を審査提出する。
このアプリ内課金の設定の審査はメタデータのみ審査されるようで、アプリ内課金を組み込んだアプリ本体の審査が未提出であっても構わない。
メタデータの審査がOKの場合は、ステータスが審査承認済みに更新される。
アプリ内課金そのものの審査は、アプリ本体の審査時に実施される。この手順により、アプリ本体の審査が終了し、App Storeでリリースしたと同時にアプリ内課金も利用できるようになる。(2020年11月10日 確認済)
(4) 稀に、アプリ内課金を実装したアプリのバイナリの審査には合格したものの、アプリ内課金は審査待ちの状態になったままとなることがある。この場合は、24時間程度待てばアプリ内課金が承認されるようになる。アプリ内課金が審査待ちの状態のままの場合、アプリのバイナリの審査に合格したからといってApp Storeで配信開始すると、実装したアプリ内課金がストアで表示されないので、配信開始は手動にして「デベロッパーによる配信待ち」(Developer pending release)の状態にすることが必須である。(2022年2月22日 追記)
参考記事:
https://developer.apple.com/jp/documentation/StoreKitGuide.pdf
https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnectInAppPurchase_Guide_Jpn/Chapters/Introduction.html
https://developer.apple.com/jp/documentation/General/ValidateAppStoreReceipt/Introduction.html
http://itblogdsi.blog.fc2.com/blog-entry-65.html
http://qiita.com/sora/items/9f81cf90b25c2a7d3101
http://qiita.com/monoqlo/items/24d36e3a95bc813a7276
http://inside.pixiv.net/entry/2014/12/09/111310
http://blog.tworks.jp/archives/374
http://qiita.com/fmtonakai/items/6d13c8e535c5d8904c60
http://glassonion.hatenablog.com/entry/20111201/1322697417
http://nantekottai.com/2011/10/31/basics-of-storekit-transaction/
http://qiita.com/kyasusoft/items/28e48f60f46c32483061
【アプリ内課金の最新記事】