React-native-iap: buySubscription renvoie E_UNKNOWN malgré la réussite de l'achat

Créé le 13 oct. 2018  ·  30Commentaires  ·  Source: dooboolab/react-native-iap

Version de react-native-iap

2.2.2 (car toute version plus récente échoue sur iOS en raison de # 279)

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

iOS

Comportement attendu

Aucune erreur ne doit être générée. L'achat a réussi (en direct et en production)

Comportement réel

E_UNKNOWN erreur
Notre suivi des erreurs Sentry.io rapporte ceci:

{"framesToPop":1,"code":"E_UNKNOWN","nativeStackIOS":["0   LuCoaching                          0x000000010062f6fc LuCoaching + 1996540","1   LuCoaching                          0x000000010060aa98 LuCoaching + 1845912","2   LuCoaching                          0x00000001007cad98 __cxa_throw + 438380","3   LuCoaching                          0x00000001007cc62c __cxa_throw + 444672","4   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","5   libdispatch.dylib                   0x000000019d025610 <redacted> + 56","6   LuCoaching                          0x00000001007cc46c __cxa_throw + 444224","7   libdispatch.dylib                   0x000000019d0776c8 <redacted> + 24","8   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","9   libdispatch.dylib                   0x000000019d0249ec <redacted> + 1068","10  CoreFoundation                      0x000000019d5ce1bc <redacted> + 12","11  CoreFoundation                      0x000000019d5c9084 <redacted> + 1964","12  CoreFoundation                      0x000000019d5c85b8 CFRunLoopRunSpecific + 436","13  GraphicsServices                    0x000000019f83c584 GSEventRunModal + 100","14  UIKitCore                           0x00000001ca444bc8 UIApplicationMain + 212","15  LuCoaching                          0x000000010044d110 LuCoaching + 20752","16  libdyld.dylib                       0x000000019d088b94 <redacted> + 4"],"userInfo":{"NSLocalizedDescription":"Verbindung mit iTunes Store nicht möglich"},"domain":"SKErrorDomain","line":26,"column":1877,"sourceURL":"/var/containers/Bundle/Application/818C8439-E250-42E8-AD57-EC4FB5FE5547/LuCoaching.app/main.jsbundle"}

Environnement testé (émulateur? Real Device?)

Appareil réel. Clients en direct. Échec très cohérent

Étapes pour reproduire le comportement

Lors du test de la procédure avec des utilisateurs Sandbox, l'erreur ne peut pas être reproduite.

🐛 bug 📱 iOS

Commentaire le plus utile

: +1: Nous rencontrons ce problème était bien. Cela semble arriver à environ 10% de nos utilisateurs actuellement. Nous allons essayer d'ajouter cet auditeur, mais je ne pense pas que ce soit finalement une excellente solution. @hyochan Existe-t-il un moyen d'obtenir des informations plus détaillées dans les cas où cela se produit, ou s'agit-il d'une réponse standard des API StoreKit? Dans tous les cas d'erreur, le message semble être "Impossible de se connecter à l'iTunes Store", même lorsque l'achat est réussi.

Tous les 30 commentaires

@ Gaia-Nutrition Voulez-vous vérifier ce vieux problème? C'est peut-être la même cause.
https://github.com/dooboolab/react-native-iap/issues/201

@JJMoon dans # 201 l'erreur était E_DEVELOPER_ERROR et a été causée par le non- remplissage de la liste validProducts utilisant getSubscriptions() .
Cependant, j'appelle la fonction avant d'essayer d'effectuer la vérification et j'obtiens également une erreur différente.
Mais maintenant que j'y pense. Il peut arriver qu'il y ait un certain délai entre l'appel getSubscriptions() et buySubscription() dû au fait que l'utilisateur reconsidère s'il souhaite effectuer l'achat. Cela pourrait-il être un problème? L'application peut avoir été mise en arrière-plan entre-temps.
EDIT: Mais là encore, l'achat est exécuté avec succès, le problème doit donc être celui où la réponse de l'App Store est en cours de traitement

Bonjour,

Même problème de comportement avec "buyProductWithoutFinishTransaction" ou "buyProduct".

Version 2.2.1

le retour stocké est
{ "framesToPop": 1, "code": "E_UNKNOWN", "nativeStackIOS": [...], "userInfo": { "NSLocalizedDescription": "Connexion à l’iTunes Store impossible" }, "domain": "SKErrorDomain", "line": 16, "column": 1599, "sourceURL": "..." }

Nous avons mis à jour le module car nous reproduisons ce bogue en production avec les versions précédentes.

La partie intéressante est que l'achat de restauration échoue également pour mes utilisateurs lorsque cela se produit. Cela n'arrive qu'à environ 1% de nos utilisateurs iOS.

@fierysolid Même cas, nous sommes environ 5% des achats sur iOS qui ont échoué. Lorsque le client essaie à nouveau d'acheter, il fait apparaître un achat de restauration.

Salut à tous. J'espère que c'est corrigé dans notre nouvelle version d'aujourd'hui qui est 2.3.15 . J'ai remarqué que l'utilisation de NSDictionary dans iOS n'est pas sûre à utiliser et peut provoquer un comportement inattendu. J'ai corrigé ce problème et j'espère que cela fonctionne correctement sur tous les appareils. Veuillez tester ceci.

Veuillez rouvrir lorsque le problème persiste.

@dooboolab
Je reçois toujours ce problème en utilisant buySubscription() avec un utilisateur de testeur de bac à sable avec iPhone 6S.

{"userInfo":{"NSLocalizedDescription":"Cannot connect to iTunes Store"}}

@danrevah Vous avez donc essayé notre nouvelle version qui est 2.3.15 ? @JJMoon Pouvez-vous tester ceci une fois de plus?

@dooboolab oui

@danrevah Veuillez essayer 2.3.16 .

@dooboolab cela a fonctionné une fois, mais pendant que j'essayais à nouveau, j'ai continué à recevoir ces erreurs. (utilisé v 2.3.17)

@JJMoon Avez-vous une idée à ce sujet? il utilise iPhone6S

J'ai rouvert le numéro. cc @JJMoon

Si plus de gens votent pour ce problème, nous essaierons de creuser plus profondément.

@danrevah J'espère que vous ferez référence à ce document.
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
Pour tester l'abonnement en mode sandbox, vous devez réacheter l'abonnement après un certain temps.
Et vous devrez peut-être l'annuler pour acheter à nouveau.
Et il y a des réactions étranges du serveur Apple sandbox, ce qui rend le test plus difficile.

Si le cas @JJMoon est le problème, nous pouvons le fermer à nouveau. Veuillez rouvrir si vous avez encore besoin d'aide sur celui-ci. @danrevah

@JJMoon J'ai rencontré le même problème. Toute solution? buySubscription lève une exception et pourtant le paiement est déduit. J'ai besoin de données de résultats pour les stocker et les valider.
@hyochans

+1 J'ai le même problème

Essayez également d'utiliser addAdditionalSuccessPurchaseListenerIOS dans buySubscription . C'est le même problème que dans # 307.

Essayez également d'utiliser addAdditionalSuccessPurchaseListenerIOS dans buySubscription . C'est le même problème que dans # 307.

Quelqu'un a-t-il déjà utilisé en production?

@hyochan , j'ai essayé de faire ça mais sans succès.

if (subscription && subscription.success) {
      this.props.subscribe(subscription.result);
    } else {
      if (Platform.OS === 'ios') {
        const sub = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
          this.props.subscribe(purchase); // -> This code is never fired
          sub.remove();
        });
      }
    }

@cbfranca Veuillez suivre le code actuel. Vous n'utilisez même pas promises . Vous devriez écouter addAdditionalSuccessPurchaseListenerIOS après le rejet de la promesse.

De plus, vous n'avez pas besoin de Platform.OS === 'ios' supplémentaires.

@hyochan
Désolé pour mon ignorance, mais je ne pense pas avoir bien compris. J'ai suivi les mêmes bases de l'exemple, en fonction de mon scénario. J'ai créé une abstraction qui traite cette promesse en utilisant async / await. Cet objet d'abonnement est retourné par mon abstraction.

static purchaseSubscription(newSubscriptionID, currentSubscriptionID) {
    if (Platform.OS === 'ios') {
      const purchaseResult = KinvoBilling.purchaseSubscriptionIOS(newSubscriptionID);
      return purchaseResult;
    }

    const purchaseResult = KinvoBilling.purchaseSubscriptionANDROID(newSubscriptionID, currentSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionANDROID = async (newSubscriptionID, currentSubscriptionID) => {
    const hasCurrentSubscription = currentSubscriptionID !== null;

    if (hasCurrentSubscription) {
      const purchaseResult = KinvoBilling.updateSubscription(newSubscriptionID, currentSubscriptionID);
      return purchaseResult;
    }
    const purchaseResult = KinvoBilling.buySubscription(newSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionIOS = async (subscriptionID) => {
    await KinvoBilling.getSubscriptions();
    const purchaseResult = await KinvoBilling.buySubscription(subscriptionID);

    return purchaseResult;
}

@cbfranca
''
static purchaseSubscriptionIOS = async (subscriptionID) => {
attendre KinvoBilling.getSubscriptions ();
essayez {
const purchaseResult = attendre KinvoBilling.buySubscription (subscriptionID);
} catch (err) {
abonnement const = RNIap.addAdditionalSuccessPurchaseListenerIOS (async (achat) => {
// dooboolab => vérifiez l'appel ici.
this.setState ({reçu: purchase.transactionReceipt}, () => this.goToNext ());
abonnement.remove ();
}
}
return purchaseResult;
}
`` ``

Vérifiez le code ci-dessus. Je pense que vous devez refactoriser votre code pour l'adapter à son cycle de vie.

@hyochan ne fonctionne pas pour moi.

Mon cénario de test est:

  • Acheter le plan d'abonnement mensuel - OK
  • Mise à niveau vers le plan d'abonnement annuel - Échec et l'auditeur ne fonctionne pas

Un autre doute: dois-je également utiliser finishTransaction () dans les abonnements?

Je vois aussi cette erreur. Et je pense que je connais une façon de le reproduire.

Version de react-native-iap

^ 2.4.1

Version de react-native

https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz

Plate-forme

iOS, lors d'un test dans TestFlight sur un appareil réel.

Observations

J'ai remarqué que lorsque des fonctions RNIap étaient appelées dans mon application, iOS me demandait de saisir un mot de passe pour un utilisateur précédent d'iTunes / App Store (que j'ai depuis déconnecté et remplacé via les paramètres iOS). J'ai lu quelque part en ligne que c'est un problème qui préoccupe les utilisateurs d'iPhone de temps en temps: parfois une application est achetée avec un compte iTunes, puis le téléphone passe à un nouveau compte iTunes, mais l'application continue de demander le mot de passe pour le ancien compte iTunes.

J'ai essayé de supprimer mon application (et TestFlight) et de réinstaller avec le nouvel utilisateur de l'App Store, en vain. La seule façon de me débarrasser de ce comportement était d'effacer l'appareil. Une fois que j'ai fait cela, je ne pouvais plus reproduire cette erreur.

Comportement réel

  1. acheterAbonnement ()
  2. Sélectionnez Continuer lorsque vous êtes présenté avec les "Conditions d'abonnement" modales iOS.
  3. Sélectionnez OK lorsque présenté avec le modal iOS «Confirmer l'abonnement»
  4. Erreur générée par buySubscription ():
{
   code: E_UNKNOWN, 
   column: 1565, 
   domain: NSURLErrorDomain, 
   framesToPop: 1, 
   line: 20, 
   nativeStackIOS: [...],
   sourceURL: ...,
   userInfo: {
      _kCFStreamErrorCodeKey: -4, 
      _kCFStreamErrorDomainKey: 4, 
      NSErrorFailingURLKey: None, 
      NSErrorFailingURLStringKey: https://p100-sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/inAppBuy, 
      NSLocalizedDescription: Cannot connect to iTunes Store, 
      NSUnderlyingError: {
         code: "-1005", 
         domain: "kCFErrorDomainCFNetwork", 
         message: "underlying error", 
         nativeStackIOS: [...],
         userInfo:{"NSErrorPeerAddressKey":null,"_kCFStreamErrorCodeKey":-4,"_kCFStreamErrorDomainKey":4}
      }
   }
}

Étapes pour reproduire le comportement

  1. Créer un utilisateur test dans App Store Connect
  2. Installez l'application depuis l'App Store (ou invitez l'utilisateur de test à TestFlight et installez TestFlight, puis l'application via TestFlight)
  3. Acheter un abonnement dans l'application
  4. Laisser l'abonnement expirer
  5. Déconnexion de l'identifiant Apple iOS (Paramètres> Identifiant Apple, Déconnexion)
  6. Connectez-vous au nouvel identifiant Apple
  7. Acheter un abonnement dans l'application

J'espère que cela aide quelqu'un!

@hyochan

Après avoir essayé beaucoup de choses, je suis toujours avec le même problème et plus encore. Au code ci-dessous, le RNIap.buySubscription (sku) renvoie undefined. S'il vous plaît, est-ce que quelqu'un l'a résolu?

''
static purchaseSubscriptionIOS = async (subscriptionID) => {
attendre KinvoBilling.getSubscriptions ();

try {
  const purchaseResult = await RNIap.buySubscription(subscriptionID);
  return createResponse(true, purchaseResult);
} catch (error) {
  const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
    // dooboolab => check the call here.
    console.tron.log('--- ERROR ----');
    console.tron.log(error);
    console.tron.log('--- PURCHASE ----');
    console.tron.log(purchase);
    const result = purchase;
    subscription.remove();
    console.tron.log(result);

    if (result) {
      return createResponse(true, result);
    }
    return createResponse(false, result);
  });
}

};
''

: +1: Nous rencontrons ce problème était bien. Cela semble arriver à environ 10% de nos utilisateurs actuellement. Nous allons essayer d'ajouter cet auditeur, mais je ne pense pas que ce soit finalement une excellente solution. @hyochan Existe-t-il un moyen d'obtenir des informations plus détaillées dans les cas où cela se produit, ou s'agit-il d'une réponse standard des API StoreKit? Dans tous les cas d'erreur, le message semble être "Impossible de se connecter à l'iTunes Store", même lorsque l'achat est réussi.

Nous avons un problème très similaire avec 3.4.6: la première tentative d'achat échoue avec E_UNKOWN , la nouvelle tentative réussit. Cependant, pour nous, cela se produit avec buyProduct , pas avec buySubscription . @hyochan pourrait-il toujours être la même cause fondamentale?

salut! Je rencontre le même problème après avoir appelé RNIap.requestSubscription () J'obtiens un résultat indéfini mais le paiement réussit, la carte de crédit est débitée.

Le seul moyen pour cet utilisateur de passer outre est de restaurer l'achat.

Quelqu'un a-t-il trouvé une solution à ce problème? J'utilise la version 3.5.9

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