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

Ios 显示IAP页面前的收据验证,ios,in-app-purchase,receipt-validation,Ios,In App Purchase,Receipt Validation,我对我们的应用内购买流程有一个问题,因为它被苹果拒绝了 因为我们不知道用户是否拥有有效的订阅,我们必须首先获取收据,这会导致Itunes Store密码提示(这是我们在非生产环境中正确理解的正常行为)。然后进行验证,并根据结果显示自动续订订阅页面或传递请求的操作 我们的流程是: 取款收据 确认收据 如果 有效-通过请求的操作 无效-显示用户可以在其中进行应用内购买的自动续订订阅页面 现在苹果在拒绝中评论说,他们没有看到自动续费订阅页面,而是从iTunes商店得到了密码提示 正如我们正确理解的那样

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

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

我们的流程是:

  • 取款收据

  • 确认收据

  • 如果

    有效-通过请求的操作

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

  • 现在苹果在拒绝中评论说,他们没有看到自动续费订阅页面,而是从iTunes商店得到了密码提示

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

    我们使用的是便于操作的。这是我们的代码:

    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)
        }
    }
    

    我们的流程是否不正确,或者我们如何在不获取收据的情况下验证用户是否拥有有效的订阅?我们有点困惑。有人能给我们一些建议吗?

    您当前的流量并不能提供很好的用户体验;他们启动你的应用程序并看到iTunes帐户密码提示,但没有任何上下文说明其出现的原因

    我建议您采用与以下类似的流程:

  • 验证此设备上的订阅时,将布尔值添加到UserDefaults
  • 应用程序启动时,请检查此值
  • 如果该值为true,则刷新收据并验证订阅
  • 如果该值为false/不存在,则显示您的商店界面。确保您的商店界面包含“还原”按钮
  • 现在,如果用户知道他们有订阅,他们可以点击恢复,您可以验证他们的订阅;如果此时提示他们输入iTunes帐户密码,他们就会明白原因
  • 如果用户没有订阅,那么他们可以购买一个。即使他们有一个并开始购买,StoreKit也会处理这个问题,并告诉他们他们已经有一个活动订阅
  • 无论是购买还是恢复订阅,您都将获得订阅的事务处理。然后,您可以更新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
    }
    

    据我所知,ITunes帐户密码提示是出于安全原因在非生产环境中获取收据时的固有行为。因为我们在应用商店里已经有一个应用程序,它可以像我的代码一样获取收据,不需要密码,这是我们的理解。或者我们的说法不正确?如果用户最近没有通过商店的身份验证,iTunes帐户密码提示也可能出现在生产环境中。通常,如果在appStoreReceiptURL中找不到收据,则应显示购买/还原界面,而不是刷新该界面。我不喜欢SwifyStoreKit的方法,即在找不到收据时刷新收据。事实上,我从来没有找到我喜欢的StoreKit包装纸;他们似乎都隐藏着重要的行为,非常感谢。这是一些非常有用的信息。也许我们也应该考虑离开雨燕,这取决于你。就个人而言,我更喜欢直接编写StoreKit代码;没那么复杂。它只是基于委托而不是基于闭包。@Paulw11:订阅过期时如何处理?