Pytasz:
Stwierdza, że powinniśmy dodać obserwatora transakcji w didFinishLaunchingWithOptions
w pliku AppDelegate. I że powinniśmy usunąć obserwatora transakcji w applicationWillTerminate
z AppDelegate
.
To nie jest zgodne z wielu tutoriali, że przeczytałem ...
Nie, nie ma nic złego z dodaniem go w ten sposób. Zgodnie z uwagą techniczną: "Dodanie obserwatora aplikacji przy uruchomieniu gwarantuje, że będzie się ona utrzymywać podczas wszystkich uruchomień aplikacji, dzięki czemu Twoja aplikacja będzie otrzymywać wszystkie powiadomienia o kolejce płatności."
Jeśli masz jakieś referencje, które odradzają ci tę praktykę, edytuj swoje pytanie i podziel się z nami specjalnym odnośnikiem, abyśmy mogli wypowiedzieć się konkretnie na temat tego linku.
w komentarzu, później zapytał:
będę musiał zawierać wszystkie odpowiednie metody delegata w AppDelegate
również?
Istnieje kilka opcji. Na przykład można utworzyć instancję przeznaczoną do tego celu.W 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)
}
Albo w 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)
}
Z, w 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]) { ... }
}
Albo w 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]) { ... }
}
Lub alternatywnie możesz dodać go bezpośrednio do swojego telefonu AppDelegate
, ale jeśli to zrobisz, możesz chcieć add protocol conformance with an extension, aby te czyste metody były zgrupowane razem, np. w 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)
}
Albo w 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)
}
I
extension AppDelegate: SKPaymentTransactionObserver {
// the `SKPaymentTransactionObserver` methods here
}
Genialny! Przegapiłem to, żałuję, że nie mogłem więcej przegłosować. –