2.3.0
Android
let sub = wait RNIApp.buySubscription("some");
devrait attendre que l'utilisateur appuie sur acheter sur le mode de paiement dans l'application
je ne peux pas vérifier si l'utilisateur a accepté l'abonnement, car en faisant :
let sub = wait RNIApp.buySubscription("some");
si(sous){
faire des choses..
}
le bloc if(sub) s'exécute immédiatement après l'ouverture de la fenêtre contextuelle, mais l'utilisateur n'accepte toujours pas l'abonnement
Appareil réel
Des idées?
Il existe d'autres méthodes telles que getAvailablePurchases qui renvoient également une promesse et fonctionnent correctement.
Le problème est que buySubscription doit renvoyer le rappel de l'entrée utilisateur et ce n'est pas
J'utilise RN 57, aussi, l'abonnement est terminé, je peux vérifier sur le Playstore que l'achat est ok mais la promesse d'achat d'abonnement revient indéfinie
de l'aide?
Eh bien, je suis passé à la 2.2.2 et ça marche... donc je pense que vous avez raté quelque chose dans votre nouvelle version
@ marcosmartinez7 Désolé pour le bris pourriez-vous essayer 2.3.1
?
Salut merci!
Je n'ai pas le temps maintenant mais je le ferai
@ marcosmartinez7 Merci de revenir.
@dooboolab Issue est également présent sur iOS. J'ai essayé à la fois 2.3.1
ainsi que 2.3.2
. Comme mentionné par @ marcosmartinez7 2.2.2
fonctionne bien
Je pense que c'est corrigé dans 2.3.3
. Veuillez rouvrir lorsque cela se produit encore.
@dooboolab Je suis désolé, je viens d'installer et de relier 2.3.5
. await RNIap.buySubscription(iapProductId)
renvoie toujours immédiatement undefined
sur iOS
@Gaia-Nutrition Je pense que votre problème est différent car le code ios
n'a pas changé. Pourriez-vous essayer de dissocier et de lier à nouveau ?
@dooboolab J'ai essayé de lier et de dissocier. Chaque fois que je reviens à 2.2.2
il recommence à fonctionner. Mais je revérifierai demain. Peut-être que je vais essayer d'installer manuellement le composant natif
@dooboolab Ok, j'ai maintenant lié manuellement la nouvelle version 2.3.6
. Toujours en train undefined
recevoir
Quelqu'un peut-il confirmer cela? Cela ne devrait pas arriver surtout dans ios.
@dooboolab Je peux confirmer que sur iOS, la version 2.3.6 n'exécute pas les promesses mais la version 2.2.2 le fait (en utilisant un appareil iPhone 5, React Native 0.56)
Je rencontre également ce problème sur 2.3.7. Lorsque j'essaie d'utiliser await
la ligne suivante est appelée tout de suite au lieu d'attendre la promesse, et lorsque j'utilise RNIap.buySubscription(subId).then(purchase => {})
elle plante avec une erreur, impossible de lire la propriété alors de non définie
Nous y travaillons actuellement. De plus, tous ceux qui sont confrontés à cela, avez-vous appelé getSubscriptions
avant d'appeler buySubscription
?
Je viens de tester l'achat dans l'application RNExample. J'ai acheté un abonnement avec la méthode buyProductWithoutFinishTransaction().
Je suggère de tester tout comme RNExample. Et mettez à jour Xcode, le paramètre de construction sur « legacy » .. Je suppose que le processus de construction dans Xcode a changé cette mise à jour.
Et utilisez un nouveau testeur de bac à sable.
@JJMoon très intéressant. La combinaison de buyProductWithoutFinishTransaction()
et finishTransaction()
fonctionne sur 2.3.7
alors que buySubscription()
directement échoue toujours !
@Gaia-Nutrition OK. Ensuite, utilisez buyProductWithoutFinishTransaction
et finishTransaction
au lieu de buySubscription
. L'action d'achat est exactement la même.
@Gaia-Nutrition Pouvez-vous essayer 2.3.8
? Aussi, avez-vous appelé getSubscriptions
avant buySubscription
?
@dooboolab 2.3.8
échoue toujours en utilisant buySubscription
et encore : Oui, j'ai appelé getSubscriptions
auparavant. Je ne pense pas que buyProductWithoutFinishTransaction()
fonctionnerait autrement.
J'ai testé buySubscription sur un appareil iOS en mode sandbox.
Il a réussi, mais il affiche un message d'erreur.
Et l'abonnement renouvelable automatiquement ne délivre pas de reçu.
Je suggère d'utiliser buyProductWithoutFinishTransaction et finishTransaction au lieu de buySubscription.
Actuellement, je n'ai pas d'appareil à tester, je suivrai ce problème plus tard.
On dirait que ce problème n'est actuellement que dans iOS
. Ai-je raison?
@dooboolab Non, se produit également sur Android. La fonction renvoie undefined avant même que la première ligne de buyItemByType ne soit appelée.
@dooboolab Le problème est causé par index.js:105. Vous devriez changer les lignes en quelque chose comme
export const buySubscription = (sku, oldSku, prorationMode) => Platform.select({
ios: () => RNIapIos.buyProduct(sku),
android: () => RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, -1),
})();
(Je sais que cela ignore prorationMode)
Cependant, après s'être abonné avec succès, il y a un problème :
E/UncaughtException: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
at com.dooboolab.RNIap.RNIapModule$11.onPurchasesUpdated(RNIapModule.java:427)
at com.android.billingclient.api.BillingClientImpl$1.onReceive(BillingClientImpl.java:136)
at com.android.billingclient.api.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:303)
at com.android.billingclient.api.LocalBroadcastManager.access$000(LocalBroadcastManager.java:44)
at com.android.billingclient.api.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:114)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
@mfentross À quelle version de react-native-iap
êtes-vous ? Il y a une ligne vide dans RNIapModule.java:427
. Veuillez réessayer pour le récent.
Ma faute : j'ai édité quelques lignes. Mais la solution au problème principal consiste à modifier la fonction buySubscription pour
`
export const buySubscription = (sku, oldSku, prorationMode) =>
Platform.select({
ios : () => RNIapIos.buyProduct(sku),
androïde : () => {
if (!prorationMode) prorationMode = -1;
return RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, prorationMode);
},
})();
`
Il y avait des crochets inutiles.
@mfentross mon mauvais. J'ai raté la déclaration return
. Je viens de publier sur 2.3.11
. Alors maintenant, l'androïde fonctionne?
@dooboolab Merci, ça marche maintenant 👍
@mfentross @JJMoon D'accord ! Il ne nous reste donc que le problème iOS.
@JJMoon Il dit que si la méthode wrap avec async
et await
, cela fonctionne. Cependant, je ne sais pas trop comment cela pourrait être possible. Envelopper avec async
et await
est redondant dans la valeur de retour, n'est-ce pas ?
J'ai publié sur 2.3.13
. J'espère que vous essayerez tous ça.
Veuillez rouvrir lorsque cela se produit encore. Merci pour toutes les aides.
Commentaire le plus utile
Nous y travaillons actuellement. De plus, tous ceux qui sont confrontés à cela, avez-vous appelé
getSubscriptions
avant d'appelerbuySubscription
?