Продолжить обработку квитанций после входа в систему

Я реализовал автоматическое продление подписки в моем приложении. По умолчанию приложение пытается использовать рабочий URL-адрес для обработки квитанций. Если код возвращает 27001, приложение будет использовать URL-адрес изолированной программной среды. Поэтому, если я запускаю приложение из XCode и учетная запись песочницы указывается в настройках iPhone (iTunes/AppStore), приложение пытается со второй попытки загрузить сведения о продукте для песочницы и делает это успешно. Поскольку массив продуктов не пуст, я могу купить подписку после запроса подтверждения. Похоже, что код работает, как ожидалось, но не во всех условиях.

App Review Team делает следующее: они выходят из реальной и песочнице учетной записи в настройках устройства. В этом случае, если они запускают приложение, приложение показывает приглашение войти в систему, потому что в приложении ViewController проверяет состояние подписок. Они нажимают Отмена. Затем они идут в BuySubscriptionViewController и снова нажимают Отмена. Таким образом, в данный момент массив продуктов пуст, и невозможно купить продукт.

Я добавил следующее условие:

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

        }
    }

Если пользователь снова нажимает на кнопку, приложение не просит его войти снова и получает данные о продуктах. Если пользователь нажимает кнопку в третий раз, приложение отображает запрос на подтверждение покупки. Как я могу продолжить процесс покупки после ввода адреса электронной почты и пароля, не прося пользователя нажать кнопку еще 2 раза?

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

0 ответов

Другие вопросы по тегам