Настройка постоянного наблюдателя транзакций - PullRequest
0 голосов
/ 23 января 2020

По 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)
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...