По Apple Документы
Наблюдатель должен быть постоянным, чтобы он не освобождался, когда приложение отправляется в фоновый режим. Только постоянный наблюдатель может получать транзакции, которые могут происходить, когда ваше приложение находится в фоновом режиме, например транзакция продления для автоматически возобновляемой подписки.
Как настроить постоянный наблюдатель, чтобы мое приложение обновляется при автоматическом продлении подписки?
Они также используют класс Observer, тогда как я расширил AppDelegate
(см. Ниже). По этой ли причине мое приложение не получает уведомления о покупке, когда подписка автоматически обновляется до запуска приложения?
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//KEY: Adds observer to the payment queue
SKPaymentQueue.default().add(self)
}
extension AppDelegate: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue,
updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
handlePurchasingState(for: transaction, in: queue)
case .purchased:
handlePurchasedState(for: transaction, in: queue)
case .restored:
handleRestoredState(for: transaction, in: queue)
case .failed:
handleFailedState(for: transaction, in: queue)
case .deferred:
handleDeferredState(for: transaction, in: queue)
default: print("hit default in App Delegate, paymentQueue updatedTransactions")
}
}
}
func handlePurchasingState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
print("User is attempting to purchase product id: \(transaction.payment.productIdentifier)")
}
func handlePurchasedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
print("User purchased product id: \(transaction.payment.productIdentifier)")
SubscriptionService.shared.uploadReceipt { (success, error) in
if success {
DispatchQueue.main.async {
queue.finishTransaction(transaction)
NotificationCenter.default.post(name: SubscriptionService.purchaseSuccessfulNotification, object: nil)
}
} else {
if let unwrappedError = error {
let errorDict:[String: Error] = [uploadReceiptErrorKey: unwrappedError]
NotificationCenter.default.post(name: SubscriptionService.uploadReceiptErrorNotification, object: nil, userInfo: errorDict)
} else {
NotificationCenter.default.post(name: SubscriptionService.uploadReceiptErrorNotification, object: nil)
}
}
}
}