SKProduct возвращает ноль в первый раз, работает позже - PullRequest
0 голосов
/ 16 января 2019

Моя проблема странная - я никогда не видел ее на форуме раньше. После запроса IAP (getPurchaseInfo () -> request.start ()), когда я в первый раз нажимаю на него, выдается сообщение об ошибке, так как продукты не найдены. Однако, если я попробую еще раз, он сразу же примет идентификатор продукта и разрешит покупку. 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)
        }

Я получаю распечатанный «Завершенный запрос продукта» и даже получаю products.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 голосов
/ 16 января 2019

Я бы предложил удерживать SKProductsRequest в переменной экземпляра, чтобы она не освобождалась.

, что-то вроде

self.request = SKProductsRequest(....)
...