¿Cómo restaurar compras hechas con moneda virtual desde App Store? (iOS)

Quiero otorgar monedas por hacer cosas en mi aplicación y permitirles a los usuarios comprar cosas con las monedas que no son consumibles. También quiero que los usuarios compren monedas como IAP.

¿Cómo puedo realizar un seguimiento de lo que ya se ha comprado entre las reinstalaciones de la aplicación o las nuevas instalaciones del dispositivo? Sé que no se requiere compartir compras de consumibles (monedas) entre dispositivos.

¿Debo configurar mi propio server para realizar un seguimiento?

¿Es posible hacerlo dentro del ecosistema de Apple sin la necesidad de tener mi propio server?

¿Puedo usar el almacenamiento local y no preocuparme por eso?

No estoy completamente seguro de lo que quiere compartir en los dispositivos, las monedas ganadas y compradas o las cosas compradas (llamémosles "sombreros").

Tampoco tengo ninguna experiencia con IAPs, iCloud y CloudKit, lo que aquí digo solo proviene de observaciones y documentation de lectura.

Los IAP se pueden restaurar, puede ver eso en casi cualquier aplicación que los use para desbloquear funciones. Si sus monedas compradas no pueden ser consumidas, eso las ayudará a recuperarlas. Si se pueden consumir, será un poco más complicado, especialmente porque tendrás que tener cuidado con las personas que modifican tu almacenamiento de datos para hacer trampa. En cualquier caso, las monedas compradas no consumidas podrían transferirse como monedas y sombreros ganados (párrafo siguiente).

Las monedas y sombreros ganados deben almacenarse fuera del dispositivo de alguna manera. Usted tiene varias opciones aquí:

  • iCloud: para un contador simple (monedas) y una list de verificación de tamaño fijo / pequeño, simplemente puede almacenarlos en files de preference (google "almacenamiento de valor key de iCloud"). Estos luego se sincronizarán. Por lo que he oído, el almacenamiento de KV a través de iCloud funciona razonablemente bien.
  • CloudKit: Almacenamiento de datos en iCloud usando básicamente su propia lógica definida. Más trabajo que el anterior, pero también más flexible. El límite de almacenamiento no debería importar para el problema que describes.
  • Su propio server: más trabajo y más flexible. También lo libera del ecosistema de Apple, lo que permite, por ejemplo, una versión de Android en el futuro, con transferencia de datos multiplataforma.

Todo depende de tus necesidades, realmente. Elija la opción más alta que se adapte a todas sus necesidades. En cualquier caso, la transferencia de datos entre dispositivos no se puede hacer simplemente con almacenamiento local. Restaurar un nuevo dispositivo desde una copy de security transferiría datos, pero eliminar la aplicación y volver a instalarla purgaría los datos. Y usar tanto un iPhone como un iPad también solo es posible con algún tipo de mecanismo de synchronization basado en la nube (omitiendo las transferencias WiFi iniciadas por el usuario, no creo que quieras eso).

No es necesario tener su propio server. Apple proporciona la capacidad de restaurar compras; los detalles se pueden encontrar aquí .

Simplemente puede agregar un button que llame

[[SKPaymentQueue defaultQueue] restreCompletedTransactions];

una vez que tienes un observador en tu código, que se ve así:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

y las compras serán restauradas.

Puede encontrar más información sobre la class SKPaymentQueue aquí

Personalmente utilizo una input de llavero compartida que permite el intercambio de llavero en las capacidades de su objective. Esto hace la vida mucho más fácil, especialmente dado que este file está respaldado y, por lo tanto, si el usuario cambia el dispositivo, no perderá nada.