添加和删​​除事务队列观察器 - 正确的方法?

Kat*_*ins 9 transactions in-app-purchase ios swift

参考In app Purchases ...我参考此技术说明:https://developer.apple.com/library/ios/technotes/tn2387/_index.html

它声明我们应该didFinishLaunchingWithOptionsAppDelegate文件中添加事务观察器.而且,我们应该删除事务观察员参加applicationWillTerminateAppDelegate.

这与我所阅读的许多教程(当前的教程)不一致,并且与此问题上的许多主题(最近也是如此)不一致.

我很迷惑.苹果显然是"堆积之王".所以我应该采用技术说明的方向并添加事务队列观察器didFinishLaunchingWithOptions并将其删除applicationWillTerminate

有人可以再详细说明一下吗?提前致谢.

Rob*_*Rob 15

你问:

它声明我们应该didFinishLaunchingWithOptions在AppDelegate文件中添加事务观察器.而且,我们应该删除事务观察员参加applicationWillTerminateAppDelegate.

这与我读过的很多教程不一致......

不,以这种方式添加它没有任何问题.正如技术说明所述,"在启动时添加应用程序的观察者可确保它在应用程序的所有启动期间保持不变,从而允许您的应用程序接收所有支付队列通知."

如果您有一些针对该做法的建议,请编辑您的问题并与我们分享具体的参考,我们可以专门评论该链接.

在评论中,您后来问:

我还必须包括所有相关的委托方法AppDelegate吗?

有几个选择.例如,您可以为此实例化一个专用对象.在Swift 3中:

let paymentTransactionObserver = PaymentTransactionObserver()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    SKPaymentQueue.default().add(paymentTransactionObserver)

    return true
}

func applicationWillTerminate(_ application: UIApplication) {
    SKPaymentQueue.default().remove(paymentTransactionObserver)
}
Run Code Online (Sandbox Code Playgroud)

或者在Swift 2中:

let paymentTransactionObserver = PaymentTransactionObserver()

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    SKPaymentQueue.defaultQueue().addTransactionObserver(paymentTransactionObserver)

    return true
}

func applicationWillTerminate(application: UIApplication) {
    SKPaymentQueue.defaultQueue().removeTransactionObserver(paymentTransactionObserver)
}
Run Code Online (Sandbox Code Playgroud)

在Swift 3中:

class PaymentTransactionObserver: NSObject, SKPaymentTransactionObserver {

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { ... }

    func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { ... }

    func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { ... }

    func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { ... }

    func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) { ... }

}
Run Code Online (Sandbox Code Playgroud)

或者在Swift 2中:

class PaymentTransactionObserver: NSObject, SKPaymentTransactionObserver {

    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { ... }

    func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { ... }

    func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { ... }

    func paymentQueue(queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: NSError) { ... }

    func paymentQueue(queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) { ... }

}
Run Code Online (Sandbox Code Playgroud)

或者,您也可以直接将它添加到您的AppDelegate,但如果您这样做,您可能希望添加协议与扩展的一致性,以保持这些相关方法干净地组合在一起,例如在Swift 3中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    SKPaymentQueue.default().addTransactionObserver(self)

    return true
}

func applicationWillTerminate(_ application: UIApplication) {
    SKPaymentQueue.default().remove(self)
}
Run Code Online (Sandbox Code Playgroud)

或者在Swift 2中:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)

    return true
}

func applicationWillTerminate(application: UIApplication) {
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
Run Code Online (Sandbox Code Playgroud)

extension AppDelegate: SKPaymentTransactionObserver {

    // the `SKPaymentTransactionObserver` methods here

}
Run Code Online (Sandbox Code Playgroud)


小智 5

它有助于在应用程序启动时添加观察者,因为有时候应用程序在购买流程中退出或者互联网出现故障(这些情况不会被教程考虑,因为它们更具体地解释了教程)

如果事务中断,则在您注册观察者的下一个事务开始之前,它不会完成.为避免这种情况,您将其附加到应用程序启动时,操作系统将在启动时使用上次挂起的事务进行更新,这将提供更好的用户流.