什么是Restore Purchase

发布时间:2023-05-20

Restore Purchase是一个在移动应用内购买中非常常见的功能。它的作用是允许已经购买过应用内项目或订阅的用户,在更换设备或在同一个设备上重新安装时,能够轻松地恢复其之前的购买状态,不必再次付费。对于一些需要定期订阅或使用的应用,如新闻应用、游戏应用等,该功能非常重要,因为订阅者和用户通常需要随时随地访问其历史购买记录并重新激活。

一、Restore Purchase的使用场景

Restore Purchase通常用于以下场景:

  1. 用户更换设备时希望能够恢复之前的购买记录。
  2. 用户在同一个设备上重新安装应用时,希望能够恢复之前的购买记录。
  3. 用户在应用中心内购买过一个订阅,但该应用没有正确地记录和更新其购买状态,从而导致用户无法访问其购买内容。

二、Restore Purchase的实现

在iOS和Android平台,实现Restore Purchase需要在应用程序中实现以下步骤:

iOS平台

//1. 调用SKPaymentQueue的shared()实例,创建观察者对象。
let observer = NotificationCenter.default.addObserver(forName: .storeKitPurchased, object: nil, queue: nil) { _ in
    //2. 调用SKPaymentQueue的restoreCompletedTransactions()方法请求恢复购买。
    SKPaymentQueue.default().restoreCompletedTransactions()
}
//3. 当用户请求恢复购买时,应用程序将收到一个SKPaymentTransaction的数组,其中每个交易都可以恢复订阅或购买。
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        //4. 对于每个交易,检查其transactionState状态是否为.restored。
        if transaction.transactionState == .restored {
            //5. 如果状态为.restored,表示该交易已经成功地被恢复,我们可以调用提供的恢复处理程序block回调来触发一些后续操作。 
            SKPaymentQueue.default().finishTransaction(transaction)
        }
    }
}

Android平台

//1. 调用IInAppBillingService的isBillingSupported()方法检查是否支持结算。
Bundle response = mService.isBillingSupported(3, packageName, ITEM_TYPE_SUBS);
int responseCode = response.getInt(RESPONSE_CODE);
if (responseCode != BILLING_RESPONSE_RESULT_OK) {
    return;
}
//2. 调用IInAppBillingService的getServiceVersion()方法获取Google Play服务版本。
int version = mService.getServiceVersion(3, packageName, ITEM_TYPE_SUBS);
if (version < 3) {
    return;
}
// 3. 调用IInAppBillingService的getPurchases()方法获取用户的购买记录。
Bundle ownedItems = mService.getPurchases(3, packageName, ITEM_TYPE_SUBS, null);
int response = ownedItems.getInt(RESPONSE_CODE);
if (response != BILLING_RESPONSE_RESULT_OK) {
    return;
}
//4. 如果API返回BILLING_RESPONSE_RESULT_OK,则表示恢复操作成功完成。
ArrayList<String> purchaseDataList = ownedItems.getStringArrayList(INAPP_PURCHASE_DATA_LIST); //购买数据
ArrayList<String> signatureList = ownedItems.getStringArrayList(INAPP_DATA_SIGNATURE_LIST); //签名
ArrayList<String> purchaseItemList = ownedItems.getStringArrayList(INAPP_PURCHASE_ITEM_LIST); //购买项目
for (int i = 0; i < purchaseDataList.size(); i++) {
    String purchaseData = purchaseDataList.get(i);
    String signature = signatureList.get(i);
    String sku = purchaseItemList.get(i);
    //5. 如果需要,我们可以根据获取的信息来更新应用程序中用户的购买记录。
}

三、Restore Purchase的常见问题

Restore Purchase通常会出现一些常见问题:

1. iOS Restore Purchase不起作用

在iOS平台上,如果Restore Purchase不起作用,可能是因为以下原因: 1)设备无法连接iTunes商店; 2)用户的Apple ID与之前购买项目的Apple ID不同; 3)应用程序与App Store服务器的通信失败。

2. Android Restore Purchase不起作用

在Android平台上,如果Restore Purchase不起作用,可能是因为以下原因: 1)用户没有在Google Play应用中登录; 2)用户的Google帐户与之前购买项目的Google帐户不同; 3)应用程序未正确实现Restore Purchase功能。

3. 在iOS平台上恢复购买后无法加载内容

在iOS平台上,如果用户恢复购买后仍无法加载其购买的订阅或项目内容,则可能是应用程序未正确地更新其购买状态。在这种情况下,我们需要查看应用程序中的代码,并确保当订阅或购买成功时,应用程序中适当更新购买的状态。

四、总结

Restore Purchase是一个非常常见和重要的应用内购买功能,它可以使用户在更换设备或重新安装应用时轻松地恢复其之前的购买状态,避免再次支付费用。实现Restore Purchase需要在应用程序中实现一系列步骤,但对于开发者来说,这些步骤并不复杂,只需要注意一些常见问题即可。