Не получать уведомления о статусе подписки на автообновление на производстве
Мы работаем над приложением с автоматическим продлением подписки. У нас есть только один вариант - ежемесячная подписка с автоматическим продлением и бесплатная недельная пробная версия. Мы также используем "URL-адрес статуса подписки" для получения уведомлений о подписке.
Само приложение похоже на приложения "TO DO LIST", которые могут разделять задачи между несколькими пользователями. Таким образом, мы храним данные на сервере.
Каждый раз, когда пользователь загружает приложение или создает задачу, данные поступают с сервера с параметром current_subscription_status, например, мы проверяем статус подписки на сервере, просто проверяя дату истечения срока действия чека по текущей дате на сервере.
В настоящее время у нас есть только версия для iOS, но мы также работаем над версией для Android. И пользователь должен иметь возможность подключиться к его / ее учетной записи на разных устройствах с разными Apple ID.
Проблема, с которой мы столкнулись, заключается в том, что мы не получаем фактические уведомления о покупке (подписке). Например, когда пользователь нажимает кнопку "Начать бесплатную 1-недельную пробную версию" и подписывается, мы получаем уведомление (введите INITIAL_BUY). После этого пробного периода в одну неделю мы должны были получить еще одно уведомление с типом что-то вроде "ОБНОВЛЕНИЕ", но ничего не получили.
Мы связались со службой поддержки Apple, но не получили реальной помощи. Они просто отправляют ссылки на документацию Apple. Где мы нашли следующую заметку ( вот ссылка):
"Чтобы получать актуальную информацию по мере обработки событий, ваше приложение должно проверять последнюю квитанцию в App Store".
Итак, основываясь на этом, у меня есть вопрос о возможном сценарии использования:
Пользователь подписывается на устройстве iOS для ежемесячной подписки на автоматическое продление, например, он / она хотел бы, чтобы его / ее сняли с его / ее учетной записи Apple iTunes. Но после первоначальной покупки он / она закрывает (убивает) приложение и даже не открывает его на устройстве iOS. Пользователь загружает приложение на устройство Android и использует приложение только на Android. Таким образом, App Store должен взимать плату с этого пользователя каждый месяц и отправлять уведомления о статусе подписки на сервер, даже если пользователь больше никогда не открывал приложение на своем устройстве iOS. Таким образом, "... последнее подтверждение получения..." никогда не происходит с приложением iOS. Как это можно реализовать?
Технические детали:
Мы используем SwiftyStoreKit. Это две части реализации покупки в приложении:
В AppDelegate мы имеем:
// Auto-renewal complete transactions SwiftyStoreKit.completeTransactions(atomically: true) { purchases in for purchase in purchases { if purchase.transaction.transactionState == .purchased || purchase.transaction.transactionState == .restored { if purchase.needsFinishTransaction { // Deliver content from server, then: SwiftyStoreKit.finishTransaction(purchase.transaction) } } } }
Вот функция подписки, вызываемая, когда пользователь нажимает кнопку "Начать бесплатную пробную версию":
func subscribe(completion: @escaping (_ response:Bool, _ message: String?) -> Void) { SwiftyStoreKit.purchaseProduct(self.productId, atomically: true) { result in if case .success(let purchase) = result { if purchase.needsFinishTransaction { SwiftyStoreKit.finishTransaction(purchase.transaction) } let appleValidator = AppleReceiptValidator(service: self.env, sharedSecret: self.sharedSecret) SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in if case .success(let receipt) = result { let purchaseResult = SwiftyStoreKit.verifySubscription( type: .autoRenewable, productId: self.productId, inReceipt: receipt) switch purchaseResult { case .purchased(let expiryDate, let receiptItems): if let receiptItem = receiptItems.first { // Send receipt to the server functionality ............................. } completion(true, nil) case .expired(let expiryDate, let receiptItems): completion(false, "Receipt has been expired") case .notPurchased: completion(false, "Purchase has not been processed") } } else { // receipt verification error completion(false, "ERROR OCCURED") } } } else { // purchase error completion(false, "Canceled") } }}