web-dev-qa-db-fra.com

Comment tester SKPaymentTransactionStateDeferred?

iOS 8 sera bientôt disponible. Nous avons Xcode beta 6 atm, mais nous ne trouvons toujours aucune documentation sur comment tester correctement le partage de la famille (ou ai-je oublié quelque chose?). Ma question est de savoir comment configurer correctement Sandbox avec parent/enfant? J'ai essayé de le faire fonctionner en version bêta 1 sans joie.

Des allusions les gars?

Mise à jour:

Deux histoires liées sur le forum des développeurs Apple:

  1. Comment créer un compte sandbox pour enfants sur iTunes Connect? ( https://devforums.Apple.com/message/1030357#1030357 )
  2. Tester "Demandez à acheter" dans le bac à sable ( https://devforums.Apple.com/message/1005569#1005569 )
23
Maciek Czarnik

J'ai un peu progressé sur ce sujet, alors j'ai pensé en faire rapport. De plus, j'ai trouvé un bogue apparent, que j'ai signalé à Apple.

Ce que j'ai fait est le suivant:

1) Créez un compte de test parent (bac à sable) dans iTunes Connect, puis créez un compte de test enfant. Ce ne sont en réalité que deux comptes de test dans iTunes Connect. Appelez-les P et C pour parent et enfant. 

2) Avec les deux comptes, accédez à https://appleid.Apple.com et modifiez leur année en fonction de leur âge. iTunes Connect ne vous laisse pas faire cela. Pour une raison quelconque, le processus de partage de la famille ne fonctionne que si les âges ont un an. J'ai constaté que vous devez faire la sélection deux fois dans la liste des années à https://appleid.Apple.com . Impair. Je règle mon P plus vieux (un peu l'âge adulte) et mon C plus jeune.

3) Sur un appareil Apple (mon iPhone, iOS8), je configure le partage de la famille sous Paramètres> iCloud pour le compte P. Je suis connecté à iTunes sur cet appareil avec mon vrai iTunes ID Apple (qui contient mes informations de paiement).

4) J'invite ensuite mon identifiant Apple C à faire partie de ma famille, sous Paramètres> iCloud.

5) J'accepte l'invitation de P (sur mon iPad, exécutant également iOS8), qui implique de se connecter à iCloud sur cet autre appareil en tant que C.

6) Sur mon iPhone, j'active "Demander à acheter" pour le membre de la famille C.

Maintenant, je suis prêt à essayer un achat test en tant que C sur mon application en mode bac à sable. Après avoir suivi le processus habituel dans la boutique de mon application, l'alerte suivante s'affiche:

enter image description here

quand je tape sur "Demander", je reçois l'alerte suivante:

enter image description here

Maintenant, j'ai essayé deux options, avec des achats séparés. J'ai essayé l'option "OK", qui devrait envoyer une notification au compte P. Je n'ai pas encore reçu cette notification sur mon compte P (toujours connecté à iCloud comme celui sur mon iPad).

J'ai également essayé l'option "Approuver en personne" sur l'iPad "enfant". J'utilise le compte P et j'indique que si à la prochaine alerte:

enter image description here

Je ne reçois plus d'erreur par la suite, alors il semblerait que l'approbation en personne a fonctionné, mais je n'ai pas encore converti cet achat en état SKPaymentTransactionStatePurchased. Tous les achats différés sont toujours dans la file d'attente de paiement de l'application, chacun avec l'état SKPaymentTransactionStateDeferred. Lorsque je redémarre l'application, l'état de chaque achat, toujours dans la file d'attente, est différé.

Ensuite, je me suis demandé s'il y avait un problème avec le compte iTunes de test particulier pour C; j'ai donc créé un deuxième compte enfant, appelé C2 et essayé de l'installer comme enfant sous P sur mon iPhone. Cependant, je rencontre un autre problème là-bas. Je reçois l'alerte (sur l'iPad) lorsque j'essaie d'accepter l'invitation d'être un membre de la famille sous P pour C2:

enter image description here

Pour moi, cette limitation sur le compte iCloud ne devrait pas s'appliquer aux comptes de test. C’est le bogue apparent que j’ai signalé à Apple.

En résumé, je ne suis donc pas encore convaincu à 100% que mon implémentation SKPaymentTransactionStateDeferred fonctionne. Nous verrons si Apple me répondra.

22
Chris Prince

Depuis iOS 8.3, un nouveau drapeau est disponible pour SKPayment: simulatesAskToBuyInSandbox.

Ainsi, si vous devez tester SKPaymentTransactionStateDeferred, vous initialisez New SKMutablePayment et définissez simulatesAskToBuyInSandbox = YES.

https://developer.Apple.com/library/prerelease/ios/releasenotes/General/iOS83APIDiffs/frameworks/StoreKit.html

PS. ATTENTION: les gens se plaignent que cette API ne fonctionne pas correctement (voir les commentaires)

7
kas-kad

iOS 9.2.1, Xcode 7.2.1, ARC activé

Confirmé! La propriété simulatesAskToBuyInSandbox n'oblige pas l'observateur de la file d'attente de paiement à enregistrer l'état SKPaymentTransactionStateDeferred. Au lieu de cela, il ne fait que traiter le paiement et l'observateur enregistre l'état SKPaymentTransactionStatePurchased.

SKMutablePayment *payment = [SKMutablePayment
   paymentWithProduct:productUserRequested];

payment.simulatesAskToBuyInSandbox = true;
[[SKPaymentQueue defaultQueue] addPayment:payment];

Le seul test que j'ai pu effectuer a été d'appeler ma méthode pour le paiement différé lorsque l'observateur a enregistré l'état SKPaymentTransactionStatePurchased au lieu de ma méthode habituelle et n'a pas appelé:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

Cela persiste la transaction sur l'application. résiliation et vous donne la possibilité de tester l’utilisateur qui n’achève pas l’achat (par exemple, une perte de réception au cours des étapes finales de l’achat) et l’achat différé. Ceci suppose que votre méthode d’achat passe un paramètre différé, comme décrit dansListing 4-2 Réponse aux statuts de transactiondans Guide d’achat intégré: Livrer des produits . Voici à quoi ressemblerait la méthode:

Pour simuler un achat suspendu:

[self showTransactionAsInProgress:transaction deferred:NO];

Pour simuler différé:

[self showTransactionAsInProgress:transaction deferred:YES];

Note: sur app. redémarrer, l'application Apple in. Le mécanisme d’achat vous demandera vos informations d’identification si vous n’avez pas traité d’autres paiements, n’avez pas désinstallé l’application ou si vous vous êtes déconnecté de «iTunes et App Store» dans «Paramètres». En outre, si vous cliquez sur "Annuler" ici, la transaction n'échouera pas, car l'observateur de la file d'attente de paiement continuera à enregistrer l'état SKPaymentTransactionStatePurchased.

UPDATE 3/4/2016:

J'ai trouvé cette suggestion d'Apple qui pourrait s'avérer utile, c'est une manière élégante de faire ce que j'ai suggéré:

Tester une transaction interrompue

Définissez un point d'arrêt dans la méthode De l'observateur de la file d'attente des transactions, méthode paymentQueue: updatedTransactions: afin de pouvoir contrôler si Livre le produit. Faites ensuite un achat comme d'habitude dans l'environnement de test Et utilisez le point d'arrêt pour ignorer temporairement la transaction , Par exemple, en revenant de la méthode immédiatement À l'aide de la commande thread return. dans LLDB.

Terminez et relancez votre application. Store Kit appelle la méthode PaymentQueue: updatedTransactions: à nouveau peu de temps après son lancement; Cette fois, laissez votre application répondre normalement. Vérifiez que votre application Livre correctement le produit et complète la transaction.

J'espère que cela t'aides! À votre santé.

5
serge-k

Lorsque vous créez un compte enfant en fonction de la réponse de Chris Prince , assurez-vous de définir son "âge" entre 13 et 18 ans. Si vous définissez une valeur inférieure à 13, vous ne pourrez pas vérifier son âge (même si vous ajoutez une carte de crédit à votre compte P). S'il est supérieur à 18 ans - l'option d'activer Demander à acheter est partie. J'ai passé des heures à essayer de comprendre ce que je faisais mal. 

En outre, vous devez créer un compte C via iTunes Connect, et non via l'option "Créer un compte pour l'enfant" dans l'écran de partage familial. 

J'aimerais pouvoir commenter, mais comme je n'ai pas 50 points de réputation, je dois créer une réponse distincte.

3

Il semble en effet que l’environnement du sandbox ne prend pas en charge la relation parent-enfant. Par conséquent, les messages ne seront pas envoyés lorsque les comptes en question sont configurés, comme indiqué dans la réponse de @ChrisPrince.

L'article que j'ai déterré se trouve ici: https://forums.developer.Apple.com/thread/38561#117143

Le bout d’importance de la réponse du membre du personnel d’Apple est

En ce qui concerne le support Ask-To-Buy, il n’existe aucun support pour cette fonction dans le bac à sable. "Ask to Buy" n'est pas une implémentation d'API, mais un processus de support implémenté par iTunesConnect qui nécessite une interaction de StoreKit avec un compte iTunes spécifique. Ce support n'existe que dans l'environnement de production. Pour que ce processus fonctionne dans l'environnement sandbox, ITC doit être implémenté pour que les comptes de test fassent référence à d'autres comptes pour accorder une approbation pour les achats.

La suite de l'article met en évidence les lignes directrices et les flux relatifs au support Demander à acheter, mais les tests doivent être effectués dans l'environnement de production où la relation de compte enfant/parent est active.

0
James