SKPaymentQueue addTransactionObserver demande le mot de passe de l'App Store au démarrage après un achat intégré

StackOverflow https://stackoverflow.com/questions/4988663

Question

Mon application utilise les achats intégrés et la plupart de mes utilisateurs peuvent très bien acheter sans aucun problème.Pour ces personnes, mon application télécharge le contenu une fois l'achat réussi et ils sont satisfaits.

Cependant, pour un nombre croissant de mes utilisateurs, une fois qu'ils ont effectué un achat intégré réussi, on leur demande leur mot de passe App Store à chaque fois que l'application démarre par la suite.Je crois que cela se produit lors de l'appel à :

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

que j'appelle au démarrage conformément à l'étape 6 du guide d'achat intégré d'Apple :

Je suppose que, pour une raison quelconque, les serveurs d'achats intégrés d'Apple n'enregistrent pas que la transaction s'est terminée avec succès - même si j'appelle

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

lorsque la transaction est terminée et que mon contenu a été téléchargé avec succès.

2 questions :

  1. Est-ce que quelqu'un d'autre voit ça ?

  2. Quelqu'un a-t-il une suggestion de correctif ?

MODIFICATION DE LA PRIME:

Il s'agit d'une transaction effectuée avec un identifiant Apple différent.C'est pourquoi cela ne peut être terminé que si vous saisissez les bonnes informations d'identification dans la boîte de dialogue.La question doit être soit :

  1. Comment puis-je empêcher de telles transactions mortes (la transaction n'est pas terminée, l'utilisateur n'a pas de réseau et modifie entre-temps l'ID d'application) ?
  2. Comment tailler le SkPaymentQueue?
Était-ce utile?

La solution

J'ai eu le même problème. Assurez-vous d'appeler

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

pour les trois états des transactions :SKPaymentTransactionStatePurchased, SKPaymentTransactionStateRestored, SKPaymentTransactionStateFailed.

Autres conseils

J'ai eu le même problème avec l'invite de connexion qui s'affichait lors de l'appel :

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Cela revenait également de temps en temps, même lorsque je n'utilisais pas mon application (sur l'écran d'accueil ou dans d'autres applications), ce qui était vraiment ennuyeux.En regardant autour de moi, il semble y avoir de nombreuses réponses suggérées à ce problème, mais j'ai finalement trouvé une solution à partir d'une combinaison de ce que j'ai rassemblé.

Note:Avant l'étape 1, j'avais supprimé le compte sandbox de test dans iTunes Connect.Je ne sais pas si cela affecterait la solution.

Pour résoudre le problème voici ce que j'ai fait :

  1. Exécutez votre application depuis Xcode.
  2. Attendez que l'invite apparaisse.Tapez le mot de passe du compte souhaité et appuyez sur OK.
  3. Appuyez sur le bouton Accueil de l'appareil.
  4. Tuez l'application de Xcode.
  5. Supprimez l'application de l'appareil.
  6. Déconnectez-vous d'iTunes et de l'App Store dans l'application Paramètres.
  7. Éteignez l'appareil, puis rallumez-le.
  8. Achetez quelque chose sur l'App Store.Lorsqu'il vous y invite, connectez-vous avec un compte Apple ID de production.(Je suppose que vous devriez pouvoir simplement vous connecter avec un compte de production dans iTunes et App Store sous l'application Paramètres, mais c'est ainsi que j'ai procédé).
  9. Revenez à Xcode et exécutez à nouveau votre application.(Il devrait s'agir d'une nouvelle installation, car vous avez déjà supprimé l'application.)
  10. Attendez que l'invite de connexion apparaisse.
  11. Appuyez sur Annuler.Une boîte de dialogue indiquant « Connexion requise.Appuyez sur Continuer et connectez-vous pour vérifier les téléchargements.[Environnement:Sandbox]" devrait apparaître.C’était une différence clé par rapport à avant.Je n'ai jamais eu cette boîte de dialogue lorsque j'ai appuyé sur Annuler alors qu'elle me demandait le mot de passe.
  12. Appuyez sur Continuer.
  13. Entrez le mot de passe du compte.

C'est ça.À partir de ce moment-là, l’invite de connexion a cessé de s’afficher chaque fois que j’exécutais mon application et a également cessé de s’afficher à des moments aléatoires.

J'espère que cela t'aides!

Il existe un problème appelé « boucle sans fin ».C'était un gros problème au début des énergies renouvelables automatiques lorsque, pendant environ une semaine, les serveurs ne limitaient pas les renouvellements à 5.Un appareil qui reçoit une transaction et n'appelle pas finishTransaction recevra cette transaction sur l'appareil environ une fois par semaine jusqu'à ce que cet utilisateur test particulier se connecte et appelle finishTransaction.Si vous passez en mode avion, vous pouvez « effacer » ces transactions pendant une semaine supplémentaire, mais elles reviennent.

NE SUPPRIMEZ PAS LA RÉPONSE ICI. C'est cette question particulière de Stackoverflow qui m'a induit en erreur et m'a gâché pendant des jours.

Je mets cela ici parce qu'il y a beaucoup de très mauvaises réponses qui fournissent de mauvaises informations sur la façon de résoudre le problème.

NE PAS:

  • Supprimez l’utilisateur test du bac à sable.Cela rend impossible la résolution du problème et vous devrez contacter le support développeur Apple pour le résoudre manuellement.
  • Si vous supprimez l'utilisateur de test sandbox, lorsque vous êtes ensuite invité à plusieurs reprises à vous connecter en tant qu'utilisateur et à terminer la transaction, vous ne pouvez pas, d'où le nom Boucle sans fin problème.Vous ne pourrez pas non plus ajouter à nouveau l'utilisateur test supprimé ;le portail des développeurs indique que l'identifiant utilisateur a déjà été utilisé.
  • Supprimez l'application ou réinstallez iOS ou toute autre absurdité de ce type.Cela n’a aucun effet, ne résout pas le problème et fait perdre beaucoup de temps.

FAIRE:

  • Appelez Finish pour TOUTES les transactions.
  • Si l'on est interrompu pour une raison quelconque, terminez simplement lors d'une exécution ultérieure de l'application.L'application recevra à plusieurs reprises un avis de file d'attente de paiement jusqu'à ce que vous appeliez pour terminer :

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

Voilà, terminez toutes les transactions !Sinon, vous serez envoyé dans l'enfer de la boucle sans fin de demandes de connexion à chaque fois que votre application sera lancée sur cet appareil.

Je soupçonne que c'est un comportement correct.Lorsque vous définissez un délégué SKPaymentQueue, essayez de vérifier s'il y a des transactions à finaliser.Il se peut qu'il n'y ait pas de transactions non terminées mais le fait de vérifier nécessite de se connecter à iTunes.Et je pense que tu ne peux rien faire avec ça.

Cela a généralement un certain sens, mais c'est assez ennuyeux pour les utilisateurs qui ont configuré la demande d'un mot de passe à chaque transaction (certaines protections enfants par exemple).La seule façon de résoudre ce problème est donc de définir explicitement le délégué lorsque vous êtes sur le point de demander iTunes.Par exemple vous pouvez ajouter un bouton comme "Restaurer mes achats".Pas très beau mais nettement moins ennuyeux.

Je l'ai résolu en suppression du compte utilisateur de test iTunes Connect liés à ce problème.L'application a en fait demandé à nouveau de se connecter, mais elle a ensuite disparu (j'ai également supprimé l'application, redémarré l'iPhone et me suis connecté en tant qu'utilisateur normal non-sandbox, effectué une véritable restauration dans une autre application non-sandbox, puis lancé l'application)

Si quelqu'un voit cela et utilise GoogleMobileAds.framework, vous devrez peut-être également appeler

[GADMobileAds disableAutomatedInAppPurchaseReporting];

dans -application:didFinishLaunchingWithOptions:

Voici comment je peux reproduire et résoudre ce problème de manière cohérente :

iOS 8.4, version de développement de l'application.

  1. Utilisez un compte Apple de test (bac à sable).

  2. Restaurez les transactions achetées.

    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
    
  3. Fermez immédiatement l'application.

  4. Déconnectez-vous du compte de test (via les paramètres)

  5. Démarrer l'application

Désormais, chaque fois que je lance l'application, le formulaire de « connexion » apparaîtra.Peu importe que j'entre le mot de passe ou non.Peu importe si j'effectue des achats ou si je restaure les achats.Peu importe si je supprime et réinstalle l'application.Chaque fois que je lance l'application, la connexion iTunes est présentée.

Réparer:Redémarrez dur l'appareil.

Voici ce que je ne sais pas.Cela se produira-t-il dans un environnement de production (application publiée et connexion Apple réelle) ?J'espère que non.

J'ai eu le même problème lors du test d'IAP.

J'ai testé avec 3 comptes de test.L'application n'arrêtait pas de demander le mot de passe pour les deux comptes.Même si je n'ai touché aucun bouton d'achat/restauration ou addTransactionObserver.

Je pense que c'est parce qu'une transaction précédente ne s'est pas terminée correctement, mais [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; Je ne peux pas aider du tout.

Voici donc ce que j'ai fait pour résoudre ce problème :

  1. Saisissez le mot de passe de chaque compte, quel que soit le nombre de fois que l’application magasin demander - j’entre 6 fois pour 3 comptes - jusqu’à ce qu’il ne demande jamais encore.
  2. accédez aux paramètres et déconnectez-vous de l'identifiant Apple.
  3. quittez l'application normalement - ne la terminez pas dans Xcode.puis tuez le processus dans la liste des tâches.
  4. supprimez l'application de l'appareil (supprimez simplement l'application ne fonctionnera pas, elle demandera toujours un mot de passe)
  5. redémarrer l'appareil
  6. Exécutez à nouveau l'application depuis Xcode/dans votre cas, réinstallez l'application depuis l'App Store.

inspiré par Séquence attendue lors de l'utilisation d'un utilisateur test iTunes

La suppression et la réinstallation de l'application supprimeront toutes les anciennes transactions associées à un autre compte iTunes.Si vous voyez toujours des transactions publiées dans la file d'attente de notification, il y a probablement une branche dans votre logique qui n'a pas appelé finishTransaction.

Vous devez appeler finishTransaction le tous les transactions publiées dans paymentQueue:updatedTransactions:, même celles avec SKPaymentTransactionStateFailed.

bugs liés aux achats intégrés corrigés dans la mise à jour iOS 5.1.1http://support.apple.com/kb/DL1521

Vérifiez les éléments suivants tels que je les avais dans ma méthode viewDidLoad.Une application a été rejetée lorsqu'Apple voulait que je passe du non-consommable au consommable, mais j'ai laissé la ligne suivante dans ma méthode viewDidLoad :(Je pensais que l'invite de mot de passe était un problème lors du passage de l'utilisateur test à l'utilisateur normal puis à l'utilisateur test)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

Une fois supprimée, la demande de mot de passe s'est arrêtée.

Et il me reste : [[SKPaymentQueue defaultQueue] addTransactionObserver:self];et l'application a maintenant été très bien approuvée.

Vous savez, j'ai résolu ce problème en apportant une modification à mes transactions mises à jour.je n'ai pas ajouté le [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; pour toutes les situations.

Vous avez dit:

Cependant, pour un nombre croissant de mes utilisateurs, une fois qu'ils ont effectué un achat intégré réussi, ils sont on leur demande leur mot de passe App Store à chaque fois que l'application démarre par la suite.Je crois que cela se produit lors de l'appel à :

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Notez que la documentation pour add(_ observer: / addTransationObserver: déclarer que l'appel peut amener l'utilisateur à s'authentifier auprès de l'App Store, cela semble donc être un comportement attendu.

// Les observateurs ne sont pas retenus.Le tableau des transactions ne sera synchronisé avec le serveur que tant que la file d'attente aura des observateurs. Cela peut nécessiter que l'utilisateur s'authentifie.

open func add(_ observer: SKPaymentTransactionObserver)
open func remove(_ observer: SKPaymentTransactionObserver)

Donc, en plus des autres réponses ici, il se peut que vous devriez arrêter d'appeler add observer jusqu'à ce que vous soyez prêt à afficher potentiellement une invite de connexion à l'App Store.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top