web-dev-qa-db-fra.com

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

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

Toutefois, pour un nombre croissant de mes utilisateurs, une fois qu'ils ont effectué un achat intégré avec succès, on leur demande leur mot de passe pour l'App Store chaque fois que l'application démarre par la suite. Je crois que cela se passe 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:

À mon avis, pour une raison quelconque, les serveurs d’achats intégrés d’Apple ne déclarent pas que la transaction a abouti - 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 at-il une solution suggérée?

BOUNTY EDIT :

C'est une transaction qui a été faite avec un identifiant Apple différent. C'est pourquoi il ne peut pas être terminé à moins que vous ne saisissiez les bonnes informations d'identification dans la boîte de dialogue. La question devrait ê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, en attendant, change App-ID)?
  2. Comment pouvez-vous élaguer le SkPaymentQueue?
56
montuno

J'ai eu le même problème. Assurez-vous que vous appelez 

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

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

31
Ilker Baltaci

J'ai eu le même problème d'avoir l'invite de connexion à venir à l'appel:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Cela apparaissait aussi 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, il semble y avoir tellement de 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é.

Remarque: avant l'étape 1, j'avais supprimé le compte de test sandbox 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 à partir de Xcode.
  2. Attendez que l'invite apparaisse. Tapez le mot de passe du compte souhaité et tapez sur OK.
  3. Appuyez sur le bouton Accueil de l'appareil.
  4. Tuez l'application depuis Xcode.
  5. Supprimer l'application de l'appareil.
  6. Déconnectez-vous d'iTunes & App Store dans l'application Paramètres.
  7. Éteignez l'appareil, puis rallumez-le.
  8. Achetez quelque chose sur l'App Store. Lorsque vous y êtes invité, connectez-vous avec un compte Apple ID de production. (Je suppose que vous devriez pouvoir vous connecter simplement avec un compte de production sur iTunes & App Store sous l'application Paramètres, mais c'est comme cela que je l'ai fait).
  9. Retournez à Xcode et exécutez votre application à nouveau. (Cela devrait être une nouvelle installation, comme vous avez supprimé l'application avant.)
  10. Attendez que l'invite de connexion apparaisse.
  11. Appuyez sur Annuler. Une boîte de dialogue disant "Connexion requise. Appuyez sur Continuer et connectez-vous pour vérifier les téléchargements. [Environnement: Bac à sable]" devrait s'afficher. C'était une différence essentielle par rapport à avant. Je n'ai jamais eu cette boîte de dialogue lorsque j'ai appuyé sur Annuler quand il m'a demandé le mot de passe.
  12. Appuyez sur Continuer.
  13. Entrez le mot de passe pour le compte.

C'est tout. À partir de ce moment, l’invite de connexion a cessé d’être affichée à chaque fois que j’exécutais mon application, mais aussi d’arriver à des heures aléatoires. 

J'espère que cela t'aides!

6
doraemon

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

Cela a généralement un sens, mais cela est plutôt gênant pour les utilisateurs qui ont configuré pour demander un mot de passe pour chaque transaction (une protection de l’enfant par exemple). La seule façon de lutter contre ce problème consiste donc à définir explicitement le délégué lorsque vous êtes sur le point de demander iTunes. Par exemple, vous pouvez ajouter des boutons tels que "Restaurer mes achats". Pas très beau mais certainement moins énervant.

3
Maxim Lavrov

Il y a un problème appelé "boucle sans fin". C'était un gros problème aux débuts de l'auto-renouvelable quand, pendant environ une semaine, les serveurs ne limitaient pas les renouvellements à 5. Un appareil qui obtient une transaction sans appeler finishTransaction l'obtiendra à peu près une fois. une semaine jusqu'à ce que cet utilisateur de test se connecte et appelle finishTransaction. Si vous passez en mode avion, vous pouvez effacer ces transactions pendant une semaine supplémentaire, mais elles reviennent.

3
Peter B. Kramer

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

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

NE PAS:

  • Supprimer l'utilisateur de 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 test du bac à sable, lorsque vous êtes par la suite invité de manière répétée à vous connecter en tant qu'utilisateur et à terminer la transaction, vous ne pouvez pas, d'où le nom Endless Loop problem. Vous ne pourrez pas non plus ajouter l'utilisateur de test supprimé à nouveau; le portail des développeurs indique que l'ID utilisateur a déjà été utilisé.
  • Supprimez l'application ou réinstallez iOS ou tout autre non-sens. Cela n'a aucun effet, ne résout pas le problème et fait perdre beaucoup de temps.

FAIRE:

  • Appelez Terminer pour TOUTES les transactions.
  • Si vous êtes interrompu pour une raison quelconque, complétez simplement lors d'une exécution ultérieure de l'application. L’application recevra à plusieurs reprises l’avis de la file d’attente de paiement jusqu’à ce que vous appeliez la fin:

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

Ça y est, terminez toutes les transactions! Sinon, vous serez envoyé à l'enfer de la boucle infinie de demandes de connexion chaque fois que votre application sera lancée sur cet appareil.

3
Cliff Ribaudo

J'ai le même problème lorsque je teste l'IAP.
J'ai testé avec 3 comptes de test, l'application est de garder demander un 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 n’a pas abouti correctement,
mais [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; ne peut pas aider du tout.
Alors voici ce que je fais pour résoudre ce problème:

  1. entrez le mot de passe pour chaque compte, peu importe le nombre de fois que appstore vous le demande - je saisis 6 fois pour 3 comptes - jusqu'à ce qu'il ne demande plus jamais.
  2. allez dans les paramètres et déconnectez-vous de l'identifiant Apple.
  3. quittez l'application normalement - ne la terminez pas par xcode. puis tuez le processus dans la liste des tâches.
  4. supprimer l'application de l'appareil (simplement supprimer l'application ne fonctionnera pas, il demandera toujours un mot de passe)
  5. redémarrer l'appareil
  6. Exécutez à nouveau l'application à partir de XCode/dans votre cas, réinstallez-la à partir de l'App Store.

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

1
highwing

Je l'ai résolu en en supprimant le compte d'utilisateur de test iTunes Connect lié à ce problème. En réalité, l'application a de nouveau demandé de se connecter, mais elle a ensuite disparu (j'ai également supprimé une application, redémarré l'iPhone et connecté en tant qu'utilisateur normal autre qu'un bac à sable, effectué une restauration réelle dans une autre application autre qu'un bac à sable, puis lancé l'application).

1
Maciek Czarnik

bogues liés aux achats intégrés résolus dans la mise à jour iOS 5.1.1 http://support.Apple.com/kb/DL1521

0
user513790

Voici comment je peux toujours reproduire et résoudre ce problème:

iOS 8.4, développement de l'application.

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

2) Restaurez les transactions achetées.

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]

3) Fermez immédiatement l'application.

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

5) Lancer l'application

Maintenant, chaque fois que je lance l'application, le formulaire de "connexion" s'affiche. Peu importe si j'entre le mot de passe ou non. Peu importe si je fais des achats ou si je les restitue. Peu importe si je supprime et réinstalle l'application. Chaque fois que je lance l'application, la connexion iTune est présentée.

Correction: redémarrez l'appareil avec force.

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

0
user3335999

Vous savez, j'ai résolu ce problème en effectuant une modification dans mes updatedTransactions. Je n'ai pas ajouté le [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; pour toutes les situations.

0
linka

Vérifiez ce qui suit comme je l'ai eu dans ma méthode viewDidLoad. Une application a été rejetée quand Apple voulait que je passe de consommable à consommable. Cependant, j’ai laissé la ligne suivante dans ma méthode viewDidLoad: test utilisateur)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

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

Et j'ai laissé: [[SKPaymentQueue defaultQueue] addTransactionObserver:self];in et l'application a été approuvée très bien.

0
timv

Si vous supprimez et réinstallez l'application, toutes les anciennes transactions associées à un autre compte iTunes seront supprimées. Si vous voyez toujours des transactions enregistrées dans la file d'attente des notifications, il y a probablement une branche dans votre logique qui n'a pas appelé finishTransaction.

Vous devez appeler finishTransaction sur all transactions enregistrées dans paymentQueue: updatedTransactions:, même avec SKPaymentTransactionStateFailed.

0
pschwamb

Cela semble être un problème insoluble :) Je vais soumettre une demande au support Apple ...

0
Rene Berlin