ver una suscripción suscripcion puedo porque descargar compra como cancelar apple app aplicaciones anular ios iphone app-store storekit apple-id

una - Actualización del recibo de la aplicación iOS: ¿Cómo determinar si el usuario tendrá que iniciar sesión en la tienda de aplicaciones?



porque no puedo descargar aplicaciones en mi iphone 6 (3)

Estoy implementando el "Gran recibo unificado" de Apple en iOS 7, que permite que la aplicación verifique el recibo de compra de una aplicación localmente sin tener que contactar a los servidores de Apple para la validación y verificación. Esto funciona muy bien si el usuario tiene un recibo almacenado en la aplicación. En el caso de que a la aplicación le falte el recibo, la mejor práctica es solicitar que la aplicación actualice su recibo, como tal:

SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init]; [request setDelegate:self]; [request start];

El problema es que al llamar a este código se le pedirá al usuario que inicie sesión con su ID de Apple. No estoy 100% seguro de que esto ocurra todo el tiempo, o solo si el tiempo de espera del inicio de sesión de la tienda de aplicaciones del usuario. No quiero mostrar la pantalla de inicio de sesión de ID de Apple a los usuarios a menos que sea realmente necesario. No quiero que las personas se preocupen de que se les cobre incorrectamente. Me gustaría mostrar una pantalla que indique al usuario por qué se le pedirá su contraseña de ID de Apple, pero solo si realmente se les solicitará que ingresen su contraseña. Si no necesitan ingresar su contraseña, quiero que sea un proceso transparente y oculto. ¿Cuál es la mejor manera de proceder? Creo que la mejor manera sería verificar si el usuario tendrá que iniciar sesión en la tienda de aplicaciones, pero no estoy seguro de si eso es posible.


En una aplicación de App Store, el recibo por lo general existe. Se descarga desde la App Store junto con la aplicación. Si el usuario carga su aplicación en su dispositivo con iTunes (es decir, desde una copia de seguridad) no habrá un recibo.

El caso de uso principal para el recibo que no está allí es cuando está depurando en Xcode y no ha hecho nada para hacer que se descargue el recibo (como actualizar el recibo o comprar algo).

En producción, solo puede obtener un recibo nuevo (nuevo) después de que el usuario lo haya hecho (compran algo, actualizan el recibo e inician sesión, restauran las compras e inician sesión). No hay manera de refrescar en silencio el recibo.

Si desea obtener un nuevo recibo sin la acción del usuario, debe seguir la ruta del servidor. Envíe el recibo anterior a través de su servidor a iTunes y recupere el último recibo.


Es muy complicado lidiar con esto, por lo que es posible que esta respuesta no sea completamente satisfactoria (y llego tarde, lo sé), pero aún así, espero que esto le ayude un poco con este problema en particular.

Existe la posibilidad de que no esté haciendo esto bien, pero hasta ahora todo funciona y tiene sentido para mí, pero por favor, si estoy "hablando BS" aquí, siéntase libre de corregirme.

Pero de todos modos, realmente no puede evitar que aparezca la alerta de autenticación, pero hay algunas maneras en que puede minimizar la cantidad de veces que aparece.

No necesita volver a descargar un recibo que sabe que no existe. Si el usuario no compró o no ha restaurado el recibo, puede evitar intentar volver a descargar un recibo y evitar la vista de alerta por completo. Esto es algo que he hecho:

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] != YES) { SKReceiptRefreshRequest *refresh = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil]; [refresh start]; }

Puse esto en mi archivo main.m, antes del bucle principal de la aplicación, ya que mi aplicación tiene muchas características "pro" que se desbloquean con IAP, pero realmente puedes poner esto donde lo consideres relevante.

La idea principal es que el recibo es un archivo real almacenado en el directorio de su aplicación. Así que todo lo que estamos haciendo aquí es verificar si el recibo existe realmente. Si no es así, nos ahorramos la molestia de volver a actualizarla y, por lo tanto, la molestia de mostrar la pantalla de autenticación al usuario.

Si lo desea, puede colocar este código en cualquier lugar donde el usuario pueda usar una función "pro" de su aplicación. SKReceiptRefreshRequest hereda de SKRequest y por eso llamará a los métodos SKRequestDelegate . Por lo tanto, en el momento en que un usuario navega a una pantalla con una función profesional, puede actualizar el recibo y luego habilitar la función cuando se llama a los métodos de delegado (y después de hacer el trabajo adicional de verificar el contenido del recibo).

El gran inconveniente de este enfoque es que requiere una conexión a Internet. Si su aplicación funciona sin conexión, el usuario esperará que todos sus IAP también funcionen sin conexión, por lo que volver a descargar el recibo será un problema en ciertos escenarios.


Me gustaría compartir mi experiencia. He estado trabajando en el Sandbox y falta el recibo de la aplicación después de eliminar la aplicación. (Y luego re-comando-R-ing) No sé si esto sucede en la producción, pero suena como si lo hiciera. Pedir una actualización en el primer inicio de la aplicación y pedirle al usuario su contraseña es sorprendente. Esto es un problema, por supuesto.

Parece como si [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] también actualiza en silencio el recibo de la aplicación sin abrir un cuadro de diálogo. Lo que significa que, una vez que se haya restaurado la transacción, solicitar el appReceiptURL + Data devuelve un valor no nulo. Esto es sólo por mi corta cantidad de pruebas. Por favor, haz tus propias pruebas.