React-native-iap: getAvailablePurchases sur iOS laisse apparaître une boîte de dialogue "Se connecter à l'iTunes Store"

Créé le 1 oct. 2019  ·  21Commentaires  ·  Source: dooboolab/react-native-iap

Version de react-native-iap

3.4.13

Version de react-native

0,60,5

Plateformes sur lesquelles vous avez rencontré l'erreur (IOS ou Android ou les deux?)

iOS

Comportement attendu

getAvailablePurchases n'a pas d'effets secondaires

Comportement réel

L'appel de getAvailablePurchases sur iOS fait apparaître une boîte de dialogue "Se connecter à l'iTunes Store".

Cela ne se produit pas sur Android.

IMG_0020

J'appelle getAvailablePurchases pendant le démarrage de l'application pour restaurer les articles achetés. D'après la documentation, j'ai compris que c'était la méthode courante, non?

Pour restaurer les articles achetés, j'appelle getAvailablePurchases fonction des changements d' AppState . Malheureusement, l'AppState n'est pas seulement déclenché au démarrage de l'application, mais aussi p.ex. après être revenu à l'application à partir d'une boîte de dialogue (causée par l'application) p.ex. Connectez-vous à iTunes ... :(

Pour l'utilisateur, cela dérange. Surtout si l'utilisateur n'a pas l'intention d'acheter quelque chose, il ne voudrait pas entrer ses informations d'identification pour se débarrasser de cette boîte de dialogue.

Environnement testé (émulateur? Real Device?)

appareil réel

Étapes pour reproduire le comportement

appeler getAvailablePurchases

❓ question 📱 iOS 🙏 help wanted 🚶🏻 stale

Commentaire le plus utile

Existe-t-il un moyen de savoir avant d'appeler getAvailablePurchases que l'invite apparaîtra? Ou en d'autres termes, comment puis-je détecter si l'utilisateur est connecté à iTunes ou non?

Tous les 21 commentaires

Lors du développement, cela montre que vous pouvez vous connecter avec votre compte sandbox. Je ne pense pas que les documents soient très clairs à ce sujet.

Je pense que pour la production, il peut également afficher une invite à chaque appel de cette fonction, non? La façon dont j'ai implémenté cela est que j'appelle cela lorsque l'utilisateur appuie sur "restaurer l'achat" et après que purchaseUpdatedListener est appelé. Pour savoir si l'utilisateur a un abonnement dans le futur, je le stocke dans le backend et le présente à l'application.

Hey @voxspox @alexpchin a raison. @alexpchin Puisque nous travaillons sur le pont, nous supposons que les gens en savent peut-être peu sur IAP en natif. Mettre tout ce qui existe déjà dans chaque plate-forme est un fardeau pour les responsables. S'il y a des travaux sur le document qui vous semblent utiles, n'hésitez pas à ajouter quoi que ce soit et à envoyer un PR .

@mifi Je n'ai jamais vu une application avec un bouton "restaurer mes achats". Du point de vue UX, un tel bouton est un fardeau et également inutile, car l'application doit savoir ce que j'ai acheté;)

@hyochan J'obtiens l'invite également après avoir distribué l'application via TestFlight (je suppose que c'est le mode production?!)

J'ai vu quelques applications avec cette fonction. Je ne me souviens pas très bien maintenant mais je pense que c'est nécessaire (ou requis par Apple) dans certains cas. Également dans les exemples de directives de l'App Store d'Apple, ils ont ce bouton:
https://developer.apple.com/app-store/subscriptions/

De plus, je pensais que ce serait une mauvaise UX si l'utilisateur devait un jour saisir son identifiant Apple lors de l'ouverture de mon application, je pense que ce serait déroutant. (J'ai déjà vu cela se produire si la session est expirée ou si quelque chose se passe avec SSL MITM, ce qui est souvent le cas avec les pages de destination wifi publiques)

edit: semble en fait que Apple l'exige

Existe-t-il un moyen de savoir avant d'appeler getAvailablePurchases que l'invite apparaîtra? Ou en d'autres termes, comment puis-je détecter si l'utilisateur est connecté à iTunes ou non?

1+ même

Salut les gars, une réponse à ce sujet? si je comprends bien, il s'agit d'une fonctionnalité de débogage, mais je teste avec testflight et je veux éviter que cela se produise, est-il possible de quitter le mode sandbox?

En attendant, j'ai trouvé une solution pour moi. J'ai introduit une nouvelle variable isRestorePurchasesEnabled qui est stockée en permanence par mon application.

Init:

isRestorePurchasesEnabled = false

Au démarrage de l'application:

if (Android || isRestorePurchasesEnabled) {
  call getAvailablePurchases
  on error.code === 'E_USER_CANCELLED' -> isRestorePurchasesEnabled= false
}

A l'achat:

isRestorePurchasesEnabled = true
requestSubscription ...

Réglages:

Button "restore purchases" -> isRestorePurchasesEnabled = true

L'utilisateur ne verra plus jamais l'invite connect-iTunes. La restauration n'a lieu qu'après qu'un achat a été effectué et donc les informations d'identification ont déjà été saisies + stockées et l'invite ne sera pas affichée.
Le seul cas où l'invite sera affichée, mais une seule fois, est si l'utilisateur se déconnecte dans Paramètres / iTunes / Compte Sandbox. Je ne sais pas si c'est là en mode production.

Salut, il semble qu'il n'y ait eu aucune activité sur ce problème récemment. Le problème a-t-il été résolu ou nécessite-t-il toujours l'attention de la communauté? Ce problème peut être résolu si aucune autre activité ne se produit. Vous pouvez également étiqueter ce problème comme "Pour discussion" ou "Bon premier numéro" et je le laisserai ouvert. Merci pour vos contributions.

Bonjour,
Je suis vraiment confus sur un sujet, quelqu'un peut-il m'aider?
Je veux construire un contrôleur qui vérifie si l'utilisateur possède toujours le produit ou non?
Comment puis-je détecter l'annulation de l'utilisateur en utilisant cette bibliothèque pour Apple et Google Play Store?
Je ne sais même pas si cela est lié à cette méthode getAvailablePurchase.
Merci.

  • même

J'aimerais savoir si cela se produirait également en production, plutôt que juste TestFlight.
Nous utilisons actuellement cette fonction au fur et à mesure que l'application se charge, plutôt qu'en appuyant sur un bouton.

Apple nous conseille toujours de ne pas appeler cette fonction sur l'application automatiquement ou au démarrage

Ne restaurez pas automatiquement les achats, en particulier lorsque votre application est lancée. La restauration des achats demande les informations d'identification de l'App Store de l'utilisateur, ce qui interrompt le flux de votre application.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restore% 20Completed% 20Transactions, of% 20your% 20app's% 20completed% 20transactions.

La façon dont je l'ai implémenté consiste à envoyer le reçu au backend lorsque l'utilisateur appuie sur acheter ou restaurer l'achat. Ensuite, le backend peut fournir à l'application l'état de l'abonnement à l'avenir.

Apple nous conseille toujours de ne pas appeler cette fonction automatiquement ou au démarrage

Ne restaurez pas automatiquement les achats, en particulier lorsque votre application est lancée. La restauration des achats demande les informations d'identification de l'App Store de l'utilisateur, ce qui interrompt le flux de votre application.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restore% 20Completed% 20Transactions, of% 20your% 20app's% 20completed% 20transactions.

La façon dont je l'ai implémenté consiste à envoyer le reçu au backend lorsque l'utilisateur appuie sur acheter ou restaurer l'achat. Ensuite, le backend peut fournir à l'application l'état de l'abonnement à l'avenir.

Pour un abonnement à renouvellement automatique, comment obtenir le dernier reçu sans téléchargement du client?

En exécutant un sondage périodique dans le backend qui valide périodiquement chaque achat comme celui-ci , prenez le dernier reçu de la validation (qui provient du serveur google / apple) et enregistrez-le dans la base de données.

En exécutant un sondage périodique dans le backend qui valide périodiquement chaque achat comme celui-ci , prenez le dernier reçu de la validation (qui provient du serveur google / apple) et enregistrez-le dans la base de données.

Salut @mifi Merci pour la réponse rapide! J'ai stocké le latestReceipt sur le serveur après la transaction d'origine. Ainsi, lors de l'interrogation avec l'original latestReceipt une nouvelle latestReceipt est-elle renvoyée?

Oui, la fonction iap.validate sur le backend appellera les apis apple / google qui renverront le dernier reçu. cela peut facilement être vu lors du test d'abonnements renouvelables avec un intervalle de développement (5min par période d'abonnement)

Merci @mifi Cela m'a vraiment aidé à comprendre! Il semblait juste étrange d'envoyer le "latestReceipt" pour recevoir le "latestReceipt"

Salut, il semble qu'il n'y ait eu aucune activité sur ce problème récemment. Le problème a-t-il été résolu ou nécessite-t-il toujours l'attention de la communauté? Ce problème peut être résolu si aucune autre activité ne se produit. Vous pouvez également étiqueter ce problème comme "Pour discussion" ou "Bon premier numéro" et je le laisserai ouvert. Merci pour vos contributions.

Clôture de ce numéro après une période d'inactivité prolongée. Si ce problème est toujours présent dans la dernière version, n'hésitez pas à créer un nouveau problème avec des informations à jour.

Cette page vous a été utile?
0 / 5 - 0 notes