2017-02-16 3 views
0

Je suis un peu novice, mais je me suis presque appris à coder à partir de rien au cours des trois derniers mois (merci youtube!). Alors s'il vous plaît excusez-moi si je fais une erreur évidente.iOS IAPs - Gestion de la restauration sans achat préalable

Mon application est à peu près prête, mais j'ai un bug que je n'arrive pas à trouver une solution en ligne.

Essentiellement, mon processus IAP fonctionne correctement, tout comme la fonction de restauration la plupart du temps. Cependant, je rencontre un bug lorsqu'un utilisateur appuie sur le bouton de restauration mais n'a pas fait d'achats in-app non-consommables auparavant. Mon application reste simplement dans l'état 'restauration' avec un spinner et interactionEvents ignoré. Je ne suis pas sûr de l'endroit où placer le code pour annuler le spinner et de ne plus tenir compte des événements d'interaction dans une situation où le fichier paymentQueue ne renvoie aucune transaction restaurée.

J'ai essayé de placer cette sous .default pour ce qui suit:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    for transaction in transactions { 
     switch transaction.transactionState 

, mais il ne semble pas de ne pas travailler.

Est-ce que quelqu'un a déjà rencontré cela et a des suggestions sur la façon de gérer cette situation?

Cordialement, Gavin

Répondre

0

Lorsque vous lancez la restauration, la méthode d'observation paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) est appelé avec les transactions achetées précédemment. Si aucun achat n'a été effectué, cette méthode n'est pas appelée.

Une fois la restauration des achats terminée, la méthode d'observation paymentQueueRestoreCompletedTransactionsFinished(_:) est appelée. C'est la méthode où vous devriez mettre à jour votre interface utilisateur pour indiquer que la restauration est terminée; cacher le fileur etc.

+0

Oh wow! haha, j'ai même cette fonction dans mon code, mais il n'a rien fait. Cela prend tout son sens, cependant, lorsque je déplace mes fonctions de mise à jour de l'interface utilisateur (suppression de spinners etc ...) depuis la fonction 'paymentQueue (_ queue: SKPaymentQueue, updatedTransactions ...' vers 'paymentQueueRestoreCompletedTransfinedFinished (_ :)' ne pas mettre à jour pour les situations où: 1) L'utilisateur a déjà fait un achat IAP non-consommable, ou 2) L'utilisateur n'a jamais fait un achat IAP avant ... Qu'est-ce que je manque? –

+0

Vous envoyez vos mises à jour de l'interface utilisateur dans la file d'attente principale? – Paulw11

+0

Paulw11, merci beaucoup pour vos réponses rapides! Bon, pour vous dire la vérité je ne suis pas vraiment sûr ... mais je n'ai pas avancé et consciemment créé des files d'attente supplémentaires, donc je suppose que la restauration se passe dans la file d'attente principale dans la fonction suivante: 'func paymentQueue (_ queue: SKPaymentQueue, transactionsTransactions mises à jour: [SKPaymentTransaction]) '. Nous savons que cette fonction s'exécute parce que nous obtenons une sortie dans la console à partir du commutateur transaction.transactionState ... case SKPaymentTransactionState.restored fonction.