【问题标题】:Adding & Removing Transaction Queue Observer - The Correct Way?添加和删​​除事务队列观察者 - 正确的方法?
【发布时间】:2016-04-21 15:29:24
【问题描述】:

关于应用内购买...我指的是这个技术说明:https://developer.apple.com/library/ios/technotes/tn2387/_index.html

它指出我们应该在didFinishLaunchingWithOptions 文件中的AppDelegate 中添加事务观察器。并且我们应该删除AppDelegateapplicationWillTerminate 中的事务观察器。

这与我读过的许多教程(相当最新的)不符,也与有关此事的许多线程不一致(也是最近的)。

我很困惑。苹果显然是“堆中之王”。所以我应该按照技术说明的方向,在didFinishLaunchingWithOptions添加事务队列观察器,在applicationWillTerminate删除它?

有人可以再澄清一下吗?

【问题讨论】:

  • 这与我读过的许多教程(相当最新的)不符,也与有关此事的许多线程不一致(也是最近的)。 - 请链接这些!

标签: ios swift transactions in-app-purchase


【解决方案1】:

你问:

它指出我们应该在 AppDelegate 文件的didFinishLaunchingWithOptions 中添加事务观察器。并且我们应该删除AppDelegateapplicationWillTerminate 中的事务观察器。

这与我读过的许多教程不符...

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

如果您有一些参考建议反对这种做法,请编辑您的问题并与我们分享具体参考,我们可以对该链接进行具体评论。

在评论中,你后来问:

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

有几个选项。例如,您可以为此实例化一个专用对象。因此:

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)
}

地点:

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]) { ... }
    
}

或者,您也可以将其直接添加到您的AppDelegate(如Setting Up the Transaction Observer for the Payment Queue 中所述)。但如果您这样做,您可能希望add protocol conformance with an extension 将这些相关方法清晰地组合在一起,例如:

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

    return true
}

func applicationWillTerminate(_ application: UIApplication) {
    SKPaymentQueue.default().remove(self)
}

extension AppDelegate: SKPaymentTransactionObserver {
    
    // the `SKPaymentTransactionObserver` methods here
    
}

请参阅previous revision of this answer 了解 Swift 2 版本。

【讨论】:

  • 太棒了!我对此表示赞同,希望我能投票更多。
  • 去除部分呢?有必要吗?应用关闭时不是隐式移除的吗?
  • Apple 将它包含在 in their documentation 中,所以我觉得它可能被认为是最佳实践。
【解决方案2】:

在应用程序启动时添加观察者很有用,因为有时应用程序在购买流程期间退出或互联网出现故障(教程不考虑这种情况,因为它们更具体地解释教程)

如果一个事务被中断,直到下一个事务在你注册观察者的地方开始,它才会完成。为避免这种情况,您在应用启动时附加它,操作系统将在启动时使用最后一个待处理事务进行更新,这将提供更好的用户流程。

【讨论】:

  • 我还必须在 AppDelegate 中包含所有相关的委托方法吗?
  • 不,您将所有商店工具包方法包装在一个类中,并从应用程序委托以及商店场景/或商店视图控制器初始化商店。
  • 抱歉,我是新手。您能为我发布一些代码提示吗?我一直在尝试添加代码的相关部分,但不断出错。
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多