SKPaymentQueue addTransactionObserver pidiendo la contraseña de la tienda de aplicaciones en el inicio después de la compra en la aplicación


Mi aplicación está utilizando compras en la aplicación, y la mayoría de mis usuarios pueden comprar muy bien sin ningún problema. Para estas personas, mi aplicación descarga el contenido después de que la compra tenga éxito y están felices.

Sin embargo, para un número creciente de mis usuarios, una vez que completan una compra exitosa en la aplicación, se les pide su contraseña de la Tienda de aplicaciones cada vez que la aplicación se inicia después de eso. Creo que esto está sucediendo en la llamada a:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Que estoy llamando al inicio en de acuerdo con el paso 6 en la guía de compra in-app de Apple:

Mi conjetura es que, por alguna razón, los servidores de compra dentro de la aplicación de Apple no están registrando que la transacción terminó correctamente, a pesar de que llamo

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

Cuando se complete la transacción y mi contenido se haya descargado correctamente.

2 preguntas:

  1. ¿Alguien más está viendo esto?

  2. ¿Alguien tiene una solución sugerida?

BOUNTY EDIT :

Es una transacción que se realizó con un ID de Apple diferente. Es por eso que no se puede terminar a menos que escriba las credenciales correctas en el diálogo. La pregunta debe ser:

  1. ¿Cómo puedo evitar tales transacciones muertas (la transacción no se ha terminado, el usuario no tiene red, mientras tanto los cambios App-ID)?
  2. ¿Cómo podar el SkPaymentQueue?
Author: Cœur, 2011-02-14

14 answers

Yo tenía el mismo problema.asegúrese de llamar

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

Para los tres estados de las transacciones: SKPaymentTransactionStatePurchased, SKPaymentTransactionStateRestored, SKPaymentTransactionStateFailed.

 31
Author: Ilker Baltaci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-27 22:50:55

Tuve el mismo problema de tener el mensaje de inicio de sesión que aparece en la llamada:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

También surgía de vez en cuando incluso cuando no estaba usando mi aplicación (en la pantalla de inicio o en otras aplicaciones), lo que era realmente molesto. Mirando a su alrededor, parece haber tantas respuestas sugeridas a este problema, pero finalmente encontré una solución a partir de una combinación de lo que he reunido.

Nota: Antes del paso 1, había eliminado la cuenta de prueba sandbox en iTunes Connect. No estoy seguro si eso afectaría la solución.

Para resolver el problema esto es lo que hice:

  1. Ejecute su aplicación desde Xcode.
  2. Espere a que aparezca el mensaje. Escriba la contraseña de la cuenta que desea y pulse Aceptar.
  3. Presione el botón de inicio en el dispositivo.
  4. Mata la aplicación desde Xcode.
  5. Elimine la aplicación del dispositivo.
  6. Cierre sesión en iTunes & App Store en la aplicación Configuración.
  7. Apague el dispositivo y luego vuelva a encenderlo.
  8. Compra algo de la App Store. Cuando te lo solicite, inicia sesión con una cuenta de Apple ID de producción. (Asumo que debería poder iniciar sesión con una cuenta de producción en iTunes & App Store bajo la aplicación Configuración, pero así es como lo hice).
  9. Vuelva a Xcode y ejecute su aplicación de nuevo. (Esto debe ser una nueva instalación, ya que eliminó la aplicación antes.)
  10. Espere a que aparezca el mensaje de inicio de sesión.
  11. Pulsa Cancelar. Un diálogo que dice " Iniciar sesión requerido. Pulsa Continuar e inicia sesión para comprobar para descargas. [Entorno: Sandbox]" debería aparecer. Esta fue una diferencia clave con respecto a antes. Nunca tuve este diálogo cuando presioné Cancelar cuando me estaba pidiendo la contraseña.
  12. Pulse Continuar.
  13. Introduzca la contraseña de la cuenta.

Eso es todo. A partir de entonces, el indicador de inicio de sesión dejó de aparecer cada vez que ejecuté mi aplicación y también dejó de aparecer en momentos aleatorios.

Espero que esto ayude!

 6
Author: doraemon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-23 07:01:03

Sospecho que este es un comportamiento correcto. Cuando se establece un delegado SKPaymentQueue tratar de comprobar si hay algunas transacciones para finalizar. Es posible que no haya transacciones no finalizadas, pero el hecho de verificar requiere iniciar sesión en iTunes. Y creo que no puedes hacer nada con él.

Generalmente tiene algún sentido, pero es bastante molesto para los usuarios que han configurado pidiendo una contraseña en cada transacción (alguna protección infantil, por ejemplo). Así que la única manera de luchar con ella es configure delegate explícitamente cuando esté a punto de solicitar iTunes. Por ejemplo, puede agregar algún botón como "Restaurar mis compras". No es muy bonito, pero definitivamente menos molesto.

 3
Author: Maxim Lavrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-09 20:06:40

Hay un problema llamado "bucle sin fin". Fue un gran problema en los primeros días de las energías renovables automáticas cuando, durante aproximadamente una semana, los servidores no limitaron las renovaciones a 5. Un dispositivo que recibe una transacción y no llama a finishTransaction recibirá esa transacción entregada al dispositivo aproximadamente una vez a la semana hasta que ese usuario de prueba en particular inicie sesión y llame a finishTransaction. Si cambia al modo avión, puede "borrar" esas transacciones durante otra semana, pero vuelven.

 3
Author: Peter B. Kramer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-01 04:18:53

NO BORRE LA RESPUESTA AQUÍ. Fue esta pregunta particular de Stackoverflow la que me engañó y me confundió durante días.

Estoy poniendo esto aquí porque hay un montón de respuestas realmente malas que proporcionan información INCORRECTA sobre cómo resolver el problema.

NO:

  • Elimine el usuario de prueba de sandbox. Esto hace que sea imposible resolver el problema y tendrá que ponerse en contacto con el soporte para desarrolladores de Apple para resolver manualmente.
  • Si elimine el usuario de prueba de sandbox, cuando posteriormente se le solicite repetidamente que inicie sesión como ese usuario y complete la transacción, no puede, de ahí el problema del nombre Endless Loop. Tampoco podrá volver a agregar el usuario de prueba eliminado; el portal del desarrollador dice que el id de usuario ya se ha utilizado.
  • Elimine la aplicación o vuelva a instalar iOS o cualquier otra tontería similar. No tiene efecto, no resuelve el problema y desperdicia mucho tiempo.

DO:

  • Finalizar llamada para TODAS las transacciones.
  • Si se interrumpe uno por alguna razón, simplemente complete en una ejecución posterior de la aplicación. La aplicación se enviará repetidamente el aviso de cola de pago hasta que llame finish on it:

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

Eso es todo, Terminar todas las transacciones! De lo contrario, se le enviará al infierno del Bucle Sin Fin de solicitudes de inicio de sesión cada vez que se inicia la aplicación en ese dispositivo.

 3
Author: Cliff Ribaudo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-18 13:00:31

Tengo el mismo problema al probar IAP.
He probado con 3 cuenta de prueba, la aplicación es mantener pedir contraseña para ambas cuentas. incluso si no toqué ningún botón de compra / restauración o addTransactionObserver.
Creo que esto se debe a que alguna transacción anterior no ha terminado correctamente,
pero [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; no puede ayudar en absoluto.
así que esto es lo que hago para resolver este problema:

  1. ingrese la contraseña para cada cuenta sin importar cuántas veces la aplicación tienda preguntar por input I entrada 6 veces para 3 cuenta account hasta que nunca pregunte nuevo.
  2. vaya a la configuración y cierre la sesión del ID de Apple.
  3. salir de la aplicación normalmente--no terminan en xcode. a continuación, matar el proceso en la lista de tareas.
  4. elimine la aplicación del dispositivo (simplemente elimine la aplicación no funcionará, aún pedirá contraseña)
  5. reinicie el dispositivo
  6. Ejecute la aplicación de nuevo desde XCode/en su caso vuelva a instalar la aplicación desde app store.

Inspirado por Secuencia esperada cuando se utiliza el usuario de prueba de iTunes

 1
Author: highwing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

Lo resolví al eliminar la cuenta de usuario de prueba de iTunes Connect relacionada con este problema. Aplicación en realidad pidió una vez más para iniciar sesión, pero luego desapareció (también he eliminado aplicación, reiniciado iPhone e iniciado sesión como un usuario normal no sandbox, hizo una restauración real en otra aplicación no sandbox y luego puso en marcha la aplicación)

 1
Author: Maciek Czarnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-11 14:12:20

Si alguien está viendo esto y está usando GoogleMobileAds.entonces también puede necesitar llamar a

[GADMobileAds disableAutomatedInAppPurchaseReporting];

En -application:didFinishLaunchingWithOptions:

 1
Author: planetmik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 16:03:57

Parece ser un problema irresoluble :) Enviaré una solicitud al soporte técnico de Apple...

 0
Author: Rene Berlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-27 10:08:36

Al eliminar y volver a instalar la aplicación, se eliminarán todas las transacciones antiguas asociadas con otra cuenta de itunes. Si todavía está viendo transacciones publicadas en la cola de notificaciones, es probable que tenga alguna rama en su lógica que no llame a finishTransaction.

Necesita llamar a finishTransaction en todas las transacciones que se publican en paymentQueue:updatedTransactions:, incluso las que tienen SKPaymentTransactionStateFailed.

 0
Author: pschwamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-07 02:18:29

Errores relacionados con las compras en la aplicación corregidos en la actualización de iOS 5.1.1 http://support.apple.com/kb/DL1521

 0
Author: user513790,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-08 21:30:28

Compruebe lo siguiente ya que lo tenía en mi método viewDidLoad. Tuve una aplicación rechazada cuando Apple quería que pasara de no consumible a consumible, sin embargo, dejé la siguiente línea en mi método viewDidLoad: (Pensé que el mensaje de contraseña era un problema con el intercambio del usuario de prueba al usuario normal de vuelta al usuario de prueba)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

Una vez eliminada la solicitud de contraseña se detuvo.

Y me he ido: [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; en y la aplicación ahora ha sido aprobado muy bien.

 0
Author: timv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-29 10:54:36

Ya sabes, resolví este problema haciendo una modificación en mis updatedTransactions. No añadí el [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; para todas las situaciones.

 0
Author: linka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 04:00:53

Así es como puedo reproducir y resolver este problema consistentemente:

IOS 8.4, compilación de desarrollo de la aplicación.

1) Utilice una cuenta de prueba (sandbox) de Apple.

2) Restaurar las transacciones compradas.

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]

3) Cierre inmediatamente la aplicación.

4) Cierre la sesión de la cuenta de prueba (a través de la configuración)

5) Iniciar la aplicación

Ahora cada vez que inicie la aplicación, aparecerá el formulario "iniciar sesión". No importa si introduzco la contraseña o no. No importa si yo realizar compras o restaurar las compras. No importa si elimino y reinstalo la aplicación. Cada vez que abro la aplicación, se presenta el inicio de sesión de iTune.

Arreglo: Reiniciar el dispositivo duro.

Esto es lo que no sé. ¿Sucederá esto en un entorno de producción (aplicación publicada y inicio de sesión real de Apple)? Espero que no.

 0
Author: user3335999,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 05:05:34