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