[AppStore] In-App purchase での restore 対応

Swift

In-App Purchase を実装すると、ユーザーの購入を復元(Restore)する機能が必要となりますが、restoreCompletedTransactions と SKReceiptRefreshRequest の使い所を説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Monterery beta 5
  • Xcode 13 beta5
  • iOS 15 beta

In-App Purchase できるアイテム

In-App Purchase には、以下のような種類が定義できます。

  • Consumables
  • Non-consumables
  • Auto-renewable subscriptions
  • Non-renewing subscriptions

Consumables

例えば、ゲーム内通貨のような 消費することでなくなってしまうタイプのアイテム

Non-consumables

ゲーム内で新しいアイテムが使用できるようになる というような消費されないタイプのアイテム

Auto-renewable subscriptions

ニュース購読契約 のような期間を決めてサービスが提供されるようなタイプのアイテム

このタイプのアイテムは、ユーザーがキャンセルするまで一定期間ごとに更新され 自動的に課金されます。

Non-renewing subscriptions

Auto-renewable subscriptions と似ていますが、自動的に更新されない点が異なるアイテム

restore

ユーザーが、端末を買い替えたり、何らかの事情で アンインストール後に再インストールを行うと、それまでの購入情報がデバイス上からは消去されている状態になります。

ユーザーが以前に In-App Purchase で購入しているならば、アプリ内の復元(Restore) 機能を使用して、それらの機能を再度有効にすることができるようにする必要があります。

In-App Purchase できるアイテムのうち、StoreKit を使った Restore の対象となるアイテムは、以下のタイプです。

  • Non-consumables
  • Auto-renewable subscriptions

Apple は、ユーザーが Auto-renewable subscriptions と Non-renewing subscriptions を購入しているならば、ユーザーのデバイスでそれらが有効になるようにすることと、Restore によって、再度利用可能にすることは、アプリ の責務としています。

つまり、Non-consumables と Auto-renewable subscriptions は、StoreKit の情報を使用して restore できますが、Non-renewing subscriptions は、アプリ(デベロッパ)側で restore できるようにしないといけないということです。

restore 対応

Non-consumables

SKReceiptRefreshRequest を使用して、ローカルの Receipt を更新し、Receipt に含まれる購入記録を確認して restore します。

Auto-renewable subscriptions

restoreCompletedTransactions を使用して、transaction を再度処理し、restore します。

Non-renewing subscriptions

StoreKit は特にサポートしないので、iCloud を使って記録しておくか、自前サーバーで管理することになります。

まとめ:In-App purchase の restore

In-App purchase の restore
  • In-App purchase で restore 対応が必要なのは、Non-consumables, Auto-renewable subscriptions, Non-renewing subscriptions
  • StoreKit は、Non-consumables と Auto-renewable subscriptions の restore をサポートする
  • Non-renewing subscriptions は、アプリが独自に restore する必要がある

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です