ios - subheader - Agregar y eliminar observador de cola de transacciones: ¿la forma correcta?
ionic subheader (2)
Es útil agregar observadores en el lanzamiento de la aplicación, ya que a veces la aplicación se cierra durante un flujo de compra o puede que Internet se cuelgue (estos casos no se tienen en cuenta por los tutoriales, ya que son más específicos para explicar el tutorial).
Si se interrumpe una transacción, no se completará hasta que comience la próxima transacción en la que se registre el observador. Para evitar esto, lo adjunta al inicio de la aplicación y el sistema operativo se actualizará con la última transacción pendiente en el lanzamiento y eso proporcionará un mejor flujo de usuarios.
Con referencia a las compras en la aplicación ... me refiero a esta nota técnica: https://developer.apple.com/library/ios/technotes/tn2387/_index.html
Establece que debemos agregar el observador de transacción en didFinishLaunchingWithOptions
en el archivo AppDelegate
. Y que deberíamos eliminar el observador de transacción en la applicationWillTerminate
de AppDelegate
de AppDelegate
.
Esto no concuerda con muchos tutoriales que he leído (bastante actuales) y también con muchos hilos sobre el tema (también recientes).
Estoy confundido. Apple es obviamente el "rey del montón". Entonces, ¿debería adoptar la dirección de la nota técnica y agregar el observador de cola de transacción en didFinishLaunchingWithOptions
y eliminarlo en applicationWillTerminate
?
¿Alguien puede aclarar esto un poco más? Gracias por adelantado.
Usted pregunta:
Establece que debemos agregar el observador de transacción en
didFinishLaunchingWithOptions
en el archivo AppDelegate. Y que deberíamos eliminar el observador de transacción en laapplicationWillTerminate
deAppDelegate
deAppDelegate
.Esto no concuerda con muchos tutoriales que he leído ...
No, no hay nada de malo en agregarlo de esta manera. Como dice la nota técnica, "Agregar el observador de su aplicación en el lanzamiento asegura que persistirá durante todos los lanzamientos de su aplicación, lo que permitirá que su aplicación reciba todas las notificaciones de cola de pago".
Si hay alguna referencia que tiene que aconseja contra esa práctica, edite su pregunta y comparta la referencia específica con nosotros y podemos comentar específicamente sobre ese enlace.
En un comentario, luego preguntaste:
¿Tendré que incluir todos los métodos delegados relevantes en
AppDelegate
también?
Hay algunas opciones. Por ejemplo, podría instanciar un objeto dedicado para esto. En 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)
}
O en 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)
}
Con, en 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]) { ... }
}
O en 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]) { ... }
}
O, como alternativa, también puede agregarlo directamente a su AppDelegate
, pero si lo hace, puede agregar la conformidad del protocolo con una extensión , para mantener esos métodos relevantes agrupados limpiamente, por ejemplo, en 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)
}
O en 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)
}
Y
extension AppDelegate: SKPaymentTransactionObserver {
// the `SKPaymentTransactionObserver` methods here
}