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:
Est-ce que quelqu'un d'autre voit ça?
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:
SkPaymentQueue
?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.
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:
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!
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.
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.
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:
FAIRE:
[[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.
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:
inspiré par Séquence attendue lors de l'utilisation de l'utilisateur de test iTunes
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).
bogues liés aux achats intégrés résolus dans la mise à jour iOS 5.1.1 http://support.Apple.com/kb/DL1521
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.
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.
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.
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.
Cela semble être un problème insoluble :) Je vais soumettre une demande au support Apple ...