2016-04-21 68 views
5

參照應用內購買......我指的是這個技術說明:https://developer.apple.com/library/ios/technotes/tn2387/_index.html添加和刪除事務隊列觀察者 - 正確的方法?

它指出,我們應該在AppDelegate文件中添加事務觀察員didFinishLaunchingWithOptions。我們應該刪除AppDelegateapplicationWillTerminate中的交易觀察員。

這不符合我已閱讀過的許多教程(相當流行的),也與許多有關此問題的線程(也是最近的)不一致。

我很困惑。蘋果顯然是「堆之王」。所以我應該採用技術說明的方向,並將交易隊列觀察者添加到didFinishLaunchingWithOptions中,並將其刪除在applicationWillTerminate

有人可以澄清這一點嗎?提前致謝。

回答

11

你問:

它指出,我們應該在AppDelegate的文件中添加事務觀察員didFinishLaunchingWithOptions。我們應該刪除AppDelegateapplicationWillTerminate中的交易觀察員。

這是不符合很多教程保持我已閱讀...

沒有,有沒有錯,加入這種方式。正如技術說明所述,「在啓動時添加應用程序的觀察者可確保在應用程序的所有啓動過程中它都會持續存在,從而允許您的應用程序接收所有付款隊列通知。」

如果您有一些建議反對這種做法,請編輯您的問題並與我們分享具體的參考資料,我們可以專門針對該鏈接發表評論。

在一個評論,你後來問:

我必須包括所有在AppDelegate也有關委託方法?

有幾個選項。例如,你可以爲此實例化一個專用對象。在夫特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) 
} 

或者在夫特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) 
} 

隨着,在夫特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]) { ... } 

} 

或者在夫特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]) { ... } 

} 

或者,或者,您可以直接將其添加到您的AppDelegate,但如果你這樣做,你可能需要add protocol conformance with an extension,以保持這些相關的方法乾淨地組合在一起,例如,在斯威夫特3:

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

    return true 
} 

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

還是在斯威夫特2:

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

    return true 
} 

func applicationWillTerminate(application: UIApplication) { 
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 
} 

而且

extension AppDelegate: SKPaymentTransactionObserver { 

    // the `SKPaymentTransactionObserver` methods here 

} 
+1

太棒了!我已經提高了這一點,希望我可以提高更多。 –

5

它有助於將觀察者添加到應用程序啓動中,因爲有時應用程序在購買流程期間退出或者互聯網出現故障時(這些情況不由教程考慮,因爲它們更詳細地解釋教程)

如果一個交易中斷,它將不會完成,直到下一個交易開始你註冊觀察者。爲了避免這種情況,您可以在應用程序啓動時附加它,並且操作系統將在啓動時使用上次掛起的事務進行更新,這將提供更好的用戶流。

+0

我必須包括所有在AppDelegate中也相應的委託方法? –

+0

不,您將所有商店套件方法包裝在一個類中,並從應用程序代理以及商店場景/或商店視圖控制器初始化商店。 – Kamini

+0

道歉,我很新。你能爲我發佈一些代碼提示嗎?我一直在嘗試添加代碼的相關部分,但不斷收到錯誤。 –