显示IAP页面之前的收据验证

时间:2018-08-13 10:59:46

标签: ios in-app-purchase receipt-validation

我对我们的应用内购买流程有疑问,因为它被苹果拒绝了。

因为我们不知道用户是否具有有效的订阅,我们必须首先获取收据,这将导致Itunes Store密码提示(这是正常的行为,因为我们在非生产环境中正确理解)。然后进行验证,并根据结果显示自动更新订阅页面,或者我们通过请求的操作。

我们的流程是:

  1. 获取收据

  2. 验证收据

  3. 如果

    有效-通过请求的操作

    无效-显示自动续订的订阅页面,用户可以在其中进行应用内购买

现在,Apple在拒绝中评论说,他们没有看到自动更新订阅页面,而是从iTunes Store获得了密码提示。

正如我们正确理解的那样,密码提示是在非生产环境中的正常行为,但苹果似乎并不期望这种行为。我们在获取收据的方式上没有任何改变。

为了方便处理,我们使用SwiftyStoreKit。这是我们的代码:

SwiftyStoreKit.fetchReceipt(forceRefresh: false) { result in

    switch result {
    case .success(let receiptData):

        let encryptedReceipt = receiptData.base64EncodedString(options: [])

        Log.info("Fetch receipt success")

        //further code to send the receipt to our server

    case .error(let error):
        observer.send(error: error.localizedDescription)
    }
}

我们的流程是否不正确?或者如何在不获取收据的情况下验证用户是否具有有效的订阅?我们在这里有点困惑。有人可以在这里给我们任何建议吗?

1 个答案:

答案 0 :(得分:1)

您的电流并不能提供很好的用户体验;他们会启动您的应用程序,并显示iTunes帐户密码提示,但不显示其出现原因。

我建议您采用类似于以下内容的过程:

  1. 在此设备上验证订阅时,请向UserDefaults添加一个布尔值
  2. 启动应用时,请检查该值。
  3. 如果该值为true,则刷新收据并验证订阅
  4. 如果该值为false /不存在,则显示您的商店界面。确保您的商店界面包含“恢复”按钮。
  5. 现在,如果用户知道他们已订阅,则可以点击“还原”,然后您可以验证其订阅;如果此时提示他们输入iTunes帐户密码,则说明原因。
  6. 如果用户没有订阅,则可以购买。即使他们确实有一个并开始购买,StoreKit也会处理并告诉他们他们已经有一个有效的订阅。
  7. 无论是购买还是恢复订阅,您都将获得订阅交易。然后,您可以更新UserDefaults并按照步骤3进行。

或者,在尝试刷新本地收据之前,请检查其是否存在。如果收据不存在,则很可能会提示用户输入iTunes密码:

if let receiptDataURL = appStoreReceiptURL,
   let _ = try? Data(contentsOf: receiptDataURL)  {
       SwiftyStoreKit.fetchReceipt(forceRefresh: false) { result in

       switch result {
           case .success(let receiptData):

               let encryptedReceipt = receiptData.base64EncodedString(options: [])

               Log.info("Fetch receipt success")

    //further code to send the receipt to our server

           case .error(let error):
               observer.send(error: error.localizedDescription)
       }
   }
}  else {
    // Display purchase/restore interface
}