SKProduct第一次返回nil,稍后再工作

时间:2019-01-16 01:24:08

标签: swift in-app-purchase skproduct

我的问题很奇怪-我以前从未在论坛上见过。第一次单击IAP(getPurchaseInfo()—> request.start())时,它给我一个错误,没有找到产品。但是,如果我立即重试,它将接受产品ID,并允许购买。 Apple拒绝了我的提交,因为起初我有此错误,我不知道如何解决。

我需要使用IAP的许多功能,其中一些是我认为可能有用的功能。

func getPurchaseInfo() {
        if SKPaymentQueue.canMakePayments() {
            let request = SKProductsRequest(productIdentifiers: NSSet(objects: self.productID) as! Set<String>)
            request.delegate = self
            request.start()
            print("Completed Product Request.")
        }

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        var products = response.products
        print(products.count)
        if products.count == 0 {
            //Tell the user there are no products found!
            let prodError = UIAlertController(title: "Error", message: "No products were found.", preferredStyle: .alert)
            let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
            prodError.addAction(okAction)
            self.view?.window?.rootViewController?.present(prodError, animated: true, completion: nil)
        }
        else {
            product = products[0]
            print(productID)
        }

我得到“已完成产品请求”的打印,甚至得到了product.count为1以及正确的productID,这意味着有一个产品。但是,我仍然收到一条错误消息(针对这种情况设置了AlertController),告诉我没有产品,如果删除了我为向我显示该错误而导致应用崩溃的AlertController,这意味着找不到产品。 这是我单击按钮以购买IAP的功能:

func purchase() {
        SKPaymentQueue.default().add(self)
        self.getPurchaseInfo()
        if self.product == nil {
            let errorPurchasing = UIAlertController(title: "Error", message: "There was an error requesting the purchase. Please try again.", preferredStyle: .alert)
            let okayButton = UIAlertAction(title: "OK", style: .default, handler: nil)
            errorPurchasing.addAction(okayButton)     
            self.view?.window?.rootViewController?.present(errorPurchasing, animated: true, completion: nil)
        }
        else {
            let payment = SKPayment(product: self.product!)
            SKPaymentQueue.default().add(payment)
            if let myP = self.product {
                let payment = SKPayment(product: myP)
                SKPaymentQueue.default().add(payment)
            }
        }
}

当我第一次单击它时,我总是收到我设置的“错误购买”警报,但在此应用程序打开后却没有。只是第一次找不到就没有意义,而第二次才找到。

1 个答案:

答案 0 :(得分:1)

我建议保留实例变量中的SKProductsRequest,以免被释放。

类似

self.request = SKProductsRequest(....)