首页 > 解决方案 > 登录后继续处理收据

问题描述

我在我的应用程序中实现了自动续订订阅。默认情况下,应用程序尝试使用生产 URL 来处理收据,如果代码返回 27001,应用程序将使用沙盒 URL。因此,如果我从 XCode 运行应用程序并且在 iPhone 设置(iTunes/AppStore)中指定了沙盒帐户,则应用程序会尝试第二次尝试加载沙盒的产品详细信息并成功执行。因为产品数组不为空,所以我可以在确认提示后购买订阅。它看起来像代码按预期工作,但并非在所有条件下。

App Review Team 执行以下操作:他们从设备设置中的真实帐户和沙盒帐户注销。在这种情况下,如果他们运行应用程序,应用程序会显示登录提示,因为在 ViewController 应用程序中会检查订阅状态。他们按取消。接下来他们转到 BuySubscriptionViewController 并再次按 Cancel。所以此时产品数组为空,无法购买产品。

我添加了以下条件:

@IBAction func buySub(_ sender: Any) {

        if (product_mysub != nil) {
            StoreManager.shared.buy(product: product_mysub)
        } else {
            requestData()
        }
    }

因此,如果未找到产品,我会要求用户在尝试购买时再次登录。

func requestData() {
        let receiptManager: ReceiptManager = ReceiptManager()
        receiptManager.startValidatingReceipts()
    }

来自 ReceiptManager.swift:

func startValidatingReceipts() {
        do {
            _ = try self.getReceiptURL()?.checkResourceIsReachable()
            do {
                let receiptData = try Data(contentsOf: self.getReceiptURL()!)
                self.validateData(data: receiptData)
                print("Receipt exists")
            } catch {
                print("Not able to get data from URL")
            }
        } catch {
            guard UserDefaults.standard.bool(forKey: "didRefreshReceipt") == false else {
                print("Stopping after second attempt")
                return
            }
            UserDefaults.standard.set(true, forKey: "didRefreshReceipt")
            let receiptRequest = SKReceiptRefreshRequest()
            receiptRequest.delegate = self
            receiptRequest.start()
            print("Receipt URL Doesn't exist", error.localizedDescription)

        }
    }

如果用户再次点击按钮,应用程序不会要求他再次登录并获取有关产品的数据。如果用户第三次点击按钮,应用程序会显示购买产品的确认提示。输入电子邮件和密码后,如何在不要求用户按两次按钮的情况下继续购买流程?

    extension ReceiptManager: SKRequestDelegate {
        func requestDidFinish(_ request: SKRequest) {
// this func is not executed after entering account details in the prompt and pressing OK


        }

        func request(_ request: SKRequest, didFailWithError error: Error) {
            print("Error refreshing receipt", error.localizedDescription)
        }
    }

标签: iosswiftstorekit

解决方案


推荐阅读