iOSにおいて、Unity IAP を使って課金処理を実装しました。色々なサイトを参考にさせていただいたのですが、実装してみないとわからない点が多くありましたので、複数回に分けて記事にまとめます。
- In App Purchasing
4.1.2 - Unity
2020.3.21.f1 - iOS
iPhone SE 15.1
iPad mini (第五世代) 15.2
この記事ではIAPのセットアップとアプリ内購入の仕組みについてまとめます。実装、評価については以下の記事を参照してください。
IAP のセットアップ
Unity IAPのセットアップについては、Androidで実施した内容と同じ手順になります。こちらの記事を参考に設定してください。
なお、iOSの場合はGoogle Public Keyの設定は不要です。
アプリ内購入の仕組み
実装を説明する前にアプリ内購入の仕組みについて簡単に説明します。
購入コンテンツの種類
購入できるアイテムは以下の3つにカテゴライズされています。
- 消費可能アイテム
購入の度に消費され何度も購入できるアイテム。ゲーム内通貨など。 - 消費不可アイテム
一度だけ購入できるアイテム。広告消しやロックコンテンツの解放など。 - 定期購入
定期的に購入が必要なもの。動画視聴のサブスクなど。
ここでは消費可能アイテムを例に説明します。
購入までの流れ
購入までのながれはAndroidと同じになります。詳細はこちらの記事を参照してください。
レシートのリストア
iOSとAndroidで大きく異なるのがレシートのリストア(復元)です。iOSのアプリは機種変更などでデバイスが変わった際にすでに購入済みのアイテムの復元をユーザー操作でできるようにアプリUI実装する必要があります。
Androidではライブラリの初期化時にStoreのレシートと自動で同期するので、明示的なリストア処理をユーザーに求めることは不要です。
復元を行うと購入した時と同じようにコールバックされます。これについては実装編で説明します。
シーケンスまとめ
アイテムの購入やアプリの起動のシーケンスをまとめておきます。
アプリ起動(IAP初期化)
アプリ起動時にIAPの初期化を行います。初期化はUnityPurchasing.Initialize()で実施し、ネットワーク接続がある場合はストアのレシートと同期します。ネットワーク接続がない場合はアプリ内部に保有するレシートをそのまま使用します。
消費不可アイテムの返金が発生した場合はこの同期の際にレシートが失われてほしいのですが、sandbox環境の評価ではレシートが残ったままとなり、いまいち正しく動作しませんでした。この辺詳しい方に教えていただきたいです。
アイテム購入(アプリ内レシート検証)
CrossPlatformValidatorでアプリ内でレシートの検証を実施します。購入処理が完了したら、ProcessPurchase()をreturn PurchaseProcessingResult.Complete で終了するか、ConfirmPendingPurchase()で購入を完了させるかのどちらかで購入処理が完了したことをStoreへ通知します。
アイテム購入(サーバーレシート検証)
サーバーでレシートの検証を実施します。購入処理が完了したら、ProcessPurchase()をreturn PurchaseProcessingResult.Complete で終了するか、ConfirmPendingPurchase()で購入を完了させるかのどちらかで購入処理が完了したことをStoreへ通知します。
アイテム復元
サーバーでレシートの検証を実施します。購入処理が完了したら、ProcessPurchase()をreturn PurchaseProcessingResult.Complete で終了するか、ConfirmPendingPurchase()で購入を完了させるかのどちらかで購入処理が完了したことをStoreへ通知します。
下のシーケンスは復元したレシートの検証をアプリ内で実施する場合の例です。
復元するレシートがない場合は ProcessPurchase () がコールバックされることはありません。通常の購入処理を行える状態にしておきます。
なお、復元すると、返金済みのレシートはなくなっていることを確認しました。
おわりに
ここではUnity IAPのセットアップと購入の仕組みについて説明しました。Androidとの違いはアイテムの復元を実装しなければならないという点です。
また、復元するレシートがなかった時、何もコールバックされないので、それを踏まえてアプリを実装する必要があります。
購入処理の実装や実機を用いたテスト方法については別の記事でご紹介します。
コメント