2011-04-26 7 views
8

Estoy usando StoreKit para compras en la aplicación. Estoy descubriendo que la API es peculiar en su comportamiento cuando el usuario presiona el botón "Cancelar".Manejar transacciones canceladas de IAP

Por ejemplo, si presiono Cancelar en la pantalla "Confirmar la compra de la aplicación de In", recibo una transacción SKPaymentTransactionStateFailed con error.code == SKErrorPaymentCancelled como era de esperar.

Pero si presiono Comprar y luego presiono Cancelar, obtengo una transacción Failed con error.code == 0. El error.localizedDescription es "No se puede conectar a iTunes Store", lo cual es claramente una mentira.

Es tentador tratar todas las transacciones Failed como cancelaciones ignorables, pero también puedo ver claramente que si el dispositivo está fuera de línea en modo avión, recibo una transacción Failed sin alerta emergente; Realmente debería notificar al usuario para explicar el problema en ese caso.

Veo que MKStoreKit asume que todas las fallas son cancelaciones. MKStoreManager 's failedTransaction método nunca se llama; MKStoreObserver siempre llama transactionCanceled para todas las transacciones Failed. Los comentarios MKStoreManager.hrecommend no error message para transactionCanceled, lo cual tiene sentido, pero ¿quién notificará al usuario acerca de Failed transacciones no canceladas?

¿Cuál es la mejor práctica para manejar estas fallas? ¿Debo tragar errores? ¿Siempre muestra un error, incluso si es redundante?

Respuesta

11

Tenemos una base de usuarios comprar cosas bastante sustancial con respecto a las conexiones móviles y sólo se mostrarán las alertas para

code != SKErrorPaymentCancelled && code != SKErrorPaymentNotAllowed 

Al parecer, es lo mejor que puede hacer. También he visto el comportamiento raro en la cancelación que mencionas, que es un error de marco hasta donde yo sé.

3

La respuesta anterior está muy cerca. MKStoreKit puede mostrar automáticamente mensajes de error para condiciones de error válidas, como el control parental activado y tal.

A pesar de eso, para manejar las cancelaciones de compras, también proporcioné un delegado (a partir de v3.5) llamado transactionCanceled en MKStoreKitDelegate.

manejar eso y detener cualquier actividad o hilanderas progresar HUD en el controlador de vista que hace la llamada compra ...

+2

MKStoreKit 3.5 no distingue entre fallas y cancelaciones. He registrado un problema en github https://github.com/MugunthKumar/MKStoreKit/issues/3 y lo he arreglado en mi fork. –

+0

¡Gracias! He fusionado su solicitud de extracción – Mugunth

+0

Ahora que mi solicitud de extracción se ha fusionado, la última MKStoreKit muestra automáticamente un error en fallas, luego llama a transactionCanceled en el delegado para que los usuarios puedan ocultar el spinner. –

-1

todavía tienen un problema de uno ... Después de hacer clic en el botón Comprar se mostrará otra vista Alerta y pregunte sobre la información de la cuenta.

si lo hiciera no cancelo entonces se entra en el caso SKErrorUnknown: continuación i cant muestran mensaje como este "Su compra no se pudo completar por favor verifica la configuracion de red y vuelve a intentarlo más tarde.".

- (void) failedTransaction: (SKPaymentTransaction *)transaction 
{ 
    switch (transaction.error.code) { 
     case SKErrorUnknown: 
      NSLog(@"SKErrorUnknown"); 
      break; 
     case SKErrorClientInvalid: 
      NSLog(@"SKErrorClientInvalid"); 
      break; 
     case SKErrorPaymentCancelled: 
      NSLog(@"SKErrorPaymentCancelled"); 
     break; 
     case SKErrorPaymentInvalid: 
      NSLog(@"SKErrorPaymentInvalid"); 
      break; 
     case SKErrorPaymentNotAllowed: 
      NSLog(@"SKErrorPaymentNotAllowed"); 
     break; 
     default: 
      NSLog(@"No Match Found for error"); 
      break; 
    } 
    NSLog(@"transaction.error.code %@",[transaction.error description]); 
    if (transaction.error.code == SKErrorPaymentCancelled) { 
     [[MKStoreManager sharedManager] transactionCanceled:transaction]; 
    } else { 
     [[MKStoreManager sharedManager] failedTransaction:transaction]; 
    } 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 
0

Sólo quería añadir que los errores debidos a sin conexión a Internet en su mayoría deben ser capturados antes de cualquier transacción utilizando la clase de accesibilidad de Apple de la OMI. De esta forma, no necesita confiar en la API de Apple para un tipo de error común y directo.

0

Creo que es su responsabilidad y la decisión de dónde mostrar la alerta de la transacción cancelada o no. Pero definitivamente debes terminarlo, de lo contrario, caerá a Falló todo el tiempo. Así debería ser algo como esto:

if (transaction.error.code == SKErrorPaymentCancelled) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} else { 
    [self notifyError:transaction.error]; 
} 

ACTUALIZACIÓN: Debido a The Business of iPhone App Development: Making and Marketing Apps that Succeed debemos terminar la transacción después de cualquier actualización al estado de error. Sería interesante saber si hay situaciones en las que no deberíamos.

Cuestiones relacionadas