2016-04-21 8 views
5

Nawiązując do App Zakupy ... I odnoszą się do tego Uwaga techniczna: https://developer.apple.com/library/ios/technotes/tn2387/_index.htmlDodawanie i usuwanie obserwatora kolejki transakcji - poprawny sposób?

Stwierdza, że ​​powinniśmy dodać obserwatora transakcji w didFinishLaunchingWithOptions w pliku AppDelegate. I że powinniśmy usunąć obserwatora transakcji w applicationWillTerminate z AppDelegate.

Nie jest to zgodne z wieloma samouczkami, które przeczytałem (dość aktualne), a także kłóci się z wieloma wątkami w tej sprawie (także niedawnymi).

Jestem zdezorientowany. Apple jest oczywiście "królem kupy". Więc powinienem przyjąć kierunek notatki technicznej i dodać obserwatora kolejki transakcji w didFinishLaunchingWithOptions i usunąć go pod applicationWillTerminate?

Czy ktoś może wyjaśnić to trochę więcej? Z góry dziękuję.

Odpowiedz

11

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 

} 
+1

Genialny! Przegapiłem to, żałuję, że nie mogłem więcej przegłosować. –

5

Przydaje się dodawanie obserwatorów przy uruchamianiu aplikacji, ponieważ czasami zdarza się, że aplikacja znika w trakcie zakupu lub może nastąpił spadek Internetu (takie przypadki nie są uwzględniane w samouczkach, ponieważ są bardziej szczegółowe w wyjaśnianiu samouczka)

Jeśli transakcja zostanie przerwana, nie zostanie ona zakończona do momentu rozpoczęcia następnej transakcji w przypadku rejestracji obserwatora. Aby tego uniknąć, załączysz go przy uruchomieniu aplikacji, a system operacyjny zaktualizuje się wraz z ostatnią oczekującą transakcją po uruchomieniu, co zapewni lepszy przepływ użytkowników.

+0

będę musiał zawierać wszystkie odpowiednie metody delegata w AppDelegate również? –

+0

Nie można zawijać wszystkich metod zestawu magazynu w jednej klasie i zainicjować sklepu z delegata aplikacji, a także ze sklepu sceny/lub kontrolera widoku sklepu. – Kamini

+0

Przepraszam, jestem raczej nowy. Czy możesz przesłać mi kilka wskazówek? Próbowałem dodać odpowiednie części kodu, ale wciąż dostaję błędy. –

Powiązane problemy