こんな場面を想像してください。ユーザーがサブスクリプションを購入し、デバイスを変更し、アプリを再インストールしたら、突然アクセスできなくなる。これは信頼を失う最も簡単な方法です。
まさにそのため「購入を復元」ボタンが存在します。オプションのボタンのように見えるかもしれませんが、特にサブスクリプションベースのアプリでは必須です。
このオプションにより、ユーザーは再購入せずに以前に購入したコンテンツへのアクセスを回復できます。
信頼性、コンプライアンス、ユーザー維持において重要な役割を果たす小さなボタンです。
なぜ重要なのか
- ユーザーの信頼: 一度支払ったユーザーは、どのデバイスからでもアクセスを継続できることを期待しています。
- サポート負荷: 混乱を招く、または欠落した復元ロジック = 怒ったユーザー + 増加するチケット数。
- App Storeのコンプライアンス: AppleとGoogleは、特定の製品タイプに対して復元オプションを含めることを求めています。
復元できる購入の種類
復元可能な購入品には以下が含まれます:
- 非消耗品: 生涯アクセス権やプレミアム機能など、一度限りの購入品。
- 自動更新サブスクリプション: デバイス間で同期される月間/年間プラン。
- 自動更新されないサブスクリプション: 期間制アクセス(例: 3ヶ月パス)。
復元不可:
- 消耗品(コイン、追加ライフ、1回限りのブーストなど)。これらは使い切ることを前提としています。
「購入の復元」ボタンの仕組み
- UI/UX。「購入を復元」 ボタンを追加する — 通常は設定画面内、または課金画面に直接配置する。
- トリガー。タップすると、以下の方法で復元をトリガーします:
- SKPaymentQueue.restoreCompletedTransactions() iOS用
- BillingClient.queryPurchaseHistoryAsync() for Android
- または、サーバーサイドで権限管理を行う場合のバックエンドロジック
- アクセスを更新します。復元が完了したら、ユーザーのサブスクリプション状態を更新し、コンテンツのロックを解除します。
- 役立つ説明文を追加してください。混乱を減らすための簡単な一文:「端末を切り替えた場合やアプリを再インストールした場合に使用してください。」
- 冗長性を避ける。ユーザーが既にアクセス権を持っている場合は、ボタンを無効化するか完全に非表示にする。
- アカウントロジック。ログイン機能を持つアプリの場合:サブスクリプションをユーザーアカウントに紐付け、バックエンド経由で同期することで、複数デバイス間での復元を簡素化します。
iOSでの購入の復元の仕組み
iOSでは、購入の復元によりアプリのレシートが更新され、ユーザーのApple IDに紐づけられた製品が再配信されます。このプロセスはバックグラウンドで静かに実行され、ユーザー体験はシンプルでわかりやすいものであるべきです。
ネイティブのStoreKit(StoreKit 2以前)を使用した実装方法は以下の通りです:
1. 復元プロセスを開始する
復元フローをトリガーするには、restoreCompletedTransactions() を呼び出します:
SKPaymentQueue.default().restoreCompletedTransactions()これにより、StoreKitが現在のApple IDに紐づけられた過去の購入を検索します。
2. 復元されたトランザクションを処理する
支払いキューを監視し、restored トランザクション状態を確認します。その後、コンテンツのロックを解除し、トランザクションを完了としてマークします:
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
if transaction.transactionState == .restored {
// Unlock access based on restored product
unlockContent(transaction: transaction)
SKPaymentQueue.default().finishTransaction(transaction)
}
}
}finishTransaction(_:)を呼び出すことを忘れないでください。そうしないと、StoreKitが同じトランザクションを再試行し続ける可能性があります。
3. エラーを適切に処理する
復元は、無効なレシート、ネットワークの問題、またはApple IDに対象となる購入がない場合に失敗することがあります。ユーザーに明確なフィードバックを表示し、デバッグ用にエラーをログに記録してください。
Adapty SDKをご利用ですか?レシート検証や例外ケースを含む、これらすべてを単一メソッド呼び出しで処理します。
Androidでの購入の復元の仕組み
Androidでは、購入の復元とはGoogle Play経由でユーザーの購入履歴を確認し、非消耗型プロダクトやアクティブなサブスクリプションを再有効化することを意味します。iOSのような組み込みの”復元”ボタンはありません。つまり、billing APIを使って手動で処理する必要があります。
Google Play Billing Libraryを使用した実装方法は以下の通りです:
1. 購入履歴の照会
ユーザーの過去の購入履歴を取得するには、queryPurchaseHistoryAsync() を使用します:
billingClient.queryPurchaseHistoryAsync(
BillingClient.SkuType.SUBS
) { billingResult, purchaseHistoryList ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchaseHistoryList != null) {
for (purchase in purchaseHistoryList) {
// Restore subscription access
restoreEntitlement(purchase)
}
}
}アプリ内購入をクエリするには、BillingClient.SkuType.INAPPを渡すこともできます。
2. 検証してアクセスを解除する
購入履歴を取得した後、レシートを検証し(理想的にはサーバーサイドで)、それに応じてアクセスを付与します。なりすましを防ぐため、署名データの検証を必ず行ってください。
Adaptyは、購入の検証、ユーザーアクセスロジック、クロスプラットフォーム同期をすぐに使える状態で提供します。
3. UXに関する考慮事項
Androidユーザーは「購入の復元」ボタンを期待していないため、以下のような対応が可能です:
- ログイン時またはアプリ起動時に自動的に復元をトリガーする
- または、透明性を確保するために設定画面に控えめなオプションを用意する
いずれの場合も、復元ロジックがバックグラウンドで静かに実行され、アクセスが復元された際にUIが更新されるようにしてください。
まとめ
「購入の復元」ボタンはシンプルに見えるかもしれませんが、サブスクリプションの体験において非常に重要な役割を果たしています。
- 信頼を築きます。
- 解約率を低減します。
- コンプライアンスを維持できます。
目立つように配置し、確実に動作させ、わかりやすくしましょう。




