React-native-iap: buySubscription gibt trotz erfolgreichem Kauf E_UNKNOWN zurück

Erstellt am 13. Okt. 2018  ·  30Kommentare  ·  Quelle: dooboolab/react-native-iap

Version von react-native-iap

2.2.2 (weil jede neuere Version unter iOS aufgrund von # 279 fehlschlägt)

Plattformen, auf denen Sie den Fehler hatten (IOS oder Android oder beides?)

iOS

Erwartetes Verhalten

Es sollte kein Fehler ausgegeben werden. Der Kauf war erfolgreich (live und in Produktion)

Tatsächliches Verhalten

E_UNKNOWN Fehler wird von Promise zurückgegeben
Unsere Sentry.io-Fehlerverfolgung meldet Folgendes:

{"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"}

Getestete Umgebung (Emulator? Reales Gerät?)

Echtes Gerät. Live-Kunden. Sehr konsequent versagt

Schritte zum Reproduzieren des Verhaltens

Beim Testen des Verfahrens mit Sandbox-Benutzern kann der Fehler nicht reproduziert werden.

🐛 bug 📱 iOS

Hilfreichster Kommentar

: +1: Wir haben festgestellt, dass dieses Problem gut war. Es scheint derzeit etwa 10% unserer Benutzer zu passieren. Wir werden versuchen, diesen Listener hinzuzufügen, aber ich denke nicht, dass dies letztendlich eine großartige Lösung ist. @hyochan Gibt es eine Möglichkeit, in den Fällen, in denen dies

Alle 30 Kommentare

@ Gaia-Nutrition Würden Sie diese alte Ausgabe überprüfen? Es könnte die gleiche Ursache sein.
https://github.com/dooboolab/react-native-iap/issues/201

@JJMoon in # 201 war der Fehler E_DEVELOPER_ERROR und wurde dadurch verursacht, dass die Liste validProducts mit getSubscriptions() gefüllt wurde .
Ich rufe jedoch die Funktion auf, bevor ich versuche, die Prüfung durchzuführen, und es wird auch ein anderer Fehler angezeigt.
Aber jetzt, wo ich darüber nachdenke. Es kann vorkommen, dass zwischen dem Anruf von getSubscriptions() und buySubscription() gewisse Zeitverzögerung liegt, die dadurch verursacht wird, dass der Benutzer überlegt, ob er den Kauf durchführen möchte. Könnte dies ein Problem sein? Die App wurde möglicherweise in der Zwischenzeit im Hintergrund ausgeführt.
BEARBEITEN: Andererseits wird der Kauf erfolgreich ausgeführt, sodass das Problem darin bestehen muss, wo die App Store-Antwort verarbeitet wird

Hallo,

Gleiches Problemverhalten bei "buyProductWithoutFinishTransaction" oder "buyProduct".

Version 2.2.1

Die gespeicherte Rückgabe ist
{ "framesToPop": 1, "code": "E_UNKNOWN", "nativeStackIOS": [...], "userInfo": { "NSLocalizedDescription": "Connexion à l’iTunes Store impossible" }, "domain": "SKErrorDomain", "line": 16, "column": 1599, "sourceURL": "..." }

Wir haben das Modul aktualisiert, da wir diesen Fehler in der Produktion mit früheren Versionen reproduzieren.

Der interessante Teil ist, dass der Wiederherstellungskauf auch für meine Benutzer fehlschlägt, wenn dies geschieht. Es passiert nur etwa 1% unserer iOS-Benutzer.

@fierysolid Im gleichen Fall sind etwa 5% der Einkäufe unter iOS fehlgeschlagen. Wenn der Kunde erneut versucht zu kaufen, wird ein Popup-Fenster für den Wiederherstellungskauf angezeigt.

Hallo allerseits. Ich hoffe, dass es in unserer neuen Version heute behoben ist, die 2.3.15 . Ich habe festgestellt, dass die Verwendung von NSDictionary in ios rein nicht sicher ist und zu unerwartetem Verhalten führen kann. Ich habe das behoben und hoffe, dass es jetzt auf jedem Gerät funktioniert. Bitte testen Sie dies aus.

Bitte öffnen Sie erneut, wenn das Problem weiterhin besteht.

@dooboolab
Ich bekomme dieses Problem immer noch, wenn ich buySubscription() mit einem Sandbox-Tester-Benutzer mit iPhone 6S verwende.

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

@danrevah Du hast also unsere neue Version ausprobiert, die 2.3.15 ? @JJMoon Kannst du das bitte noch einmal testen?

@dooboolab ja

@danrevah Bitte versuchen Sie 2.3.16 .

@dooboolab es hat einmal funktioniert, aber während ich es erneut versuchte, bekam ich immer wieder diese Fehler. (verwendet v 2.3.17)

@JJMoon Hast du eine Ahnung davon? Er benutzt das iPhone6S

Ich habe das Problem erneut geöffnet. cc @JJMoon

Wenn mehr Menschen für dieses Thema stimmen, werden wir uns mehr bemühen, dies tiefer zu untersuchen.

@danrevah Ich hoffe, Sie verweisen auf dieses Dokument.
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
Um das Abonnement im Sandbox-Modus zu testen, müssen Sie das Abonnement nach einiger Zeit erneut erwerben.
Möglicherweise müssen Sie es stornieren, um es erneut zu kaufen.
Und es gibt einige seltsame Reaktionen vom Apple Sandbox Server, die den Test schwieriger machen.

Wenn @JJMoon case das Problem ist, können wir dies wieder schließen. Bitte öffnen Sie erneut, wenn Sie hierzu noch Hilfe benötigen. @ Danrevah

@JJMoon Ich habe das gleiche Problem konfrontiert. irgendeine Lösung? buySubscription löst eine Ausnahme aus und dennoch wird die Zahlung abgezogen. Ich benötige Ergebnisdaten, um sie zu speichern und zu validieren.
@ Hyochans

+1 Ich habe das gleiche Problem

Versuchen Sie, addAdditionalSuccessPurchaseListenerIOS auch in buySubscription . Dies ist das gleiche Problem wie in # 307.

Versuchen Sie, addAdditionalSuccessPurchaseListenerIOS auch in buySubscription . Dies ist das gleiche Problem wie in # 307.

Hat jemand schon in der Produktion?

@hyochan , ich habe versucht, das zu tun, aber ohne Erfolg.

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 Bitte folgen Sie dem aktuellen Code. Sie verwenden nicht einmal promises . Sie sollten addAdditionalSuccessPurchaseListenerIOS nach der Ablehnung des Versprechens anhören.

Außerdem benötigen Sie keine zusätzlichen Platform.OS === 'ios' .

@ Hyochan
Entschuldigen Sie meine Unwissenheit, aber ich glaube nicht, dass ich richtig verstanden habe. Ich folgte den gleichen Grundlagen des Beispiels und passte zu meinem Szenario. Ich habe eine Abstraktion erstellt, die dieses Versprechen mit async / await behandelt. Dieses Abonnementobjekt wird von meiner Abstraktion zurückgegeben.

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
`` `
statischer KaufSubscriptionIOS = asynchron (Abonnement-ID) => {
warte auf KinvoBilling.getSubscriptions ();
Versuchen {
const purchaseResult = warte auf KinvoBilling.buySubscription (Abonnement-ID);
} catch (err) {
const Abonnement = RNIap.addAdditionalSuccessPurchaseListenerIOS (asynchron (Kauf) => {
// dooboolab => überprüfe den Aufruf hier.
this.setState ({quittung: purchase.transactionReceipt}, () => this.goToNext ());
Abonnement.entfernen ();
}}
}}
RückkaufkaufErgebnis;
}}
`` ``

Überprüfen Sie den obigen Code. Ich denke, Sie müssen Ihren Code umgestalten, um ihn an seinen Lebenszyklus anzupassen.

@ Hyochan Funktioniert nicht für mich.

Mein Test-Szenario ist:

  • Kaufen Sie das monatliche Abonnement - Ok
  • Upgrade auf Jahresabonnement - Fehler und Listener funktionieren nicht

Ein weiterer Zweifel: Muss ich finishTransaction () auch in Abonnements verwenden?

Ich sehe diesen Fehler auch. Und ich glaube, ich kenne einen Weg, es zu reproduzieren.

Version von react-native-iap

^ 2.4.1

Version von React-Native

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

Plattform

iOS beim Testen in TestFlight auf einem realen Gerät.

Beobachtungen

Ich habe festgestellt, dass iOS mich beim Aufrufen von RNIap-Funktionen in meiner App auffordert, ein Kennwort für einen früheren iTunes / App Store-Benutzer einzugeben (das ich seitdem abgemeldet und über die iOS-Einstellungen ersetzt habe). Ich habe irgendwo online gelesen, dass dies ein Problem ist, das iPhone-Benutzer von Zeit zu Zeit verfolgen: Manchmal wird eine App mit einem iTunes-Konto gekauft, dann wird das Telefon auf ein neues iTunes-Konto umgestellt, aber die App fragt weiterhin nach dem Passwort für das altes iTunes-Konto.

Ich habe versucht, meine App (und TestFlight) zu löschen und mit dem neuen App Store-Benutzer neu zu installieren, ohne Erfolg. Die einzige Möglichkeit, dieses Verhalten zu beseitigen, bestand darin, das Gerät zu löschen. Sobald ich dies getan habe, konnte ich diesen Fehler nicht mehr reproduzieren.

Tatsächliches Verhalten

  1. buySubscription ()
  2. Wählen Sie Weiter, wenn iOS-modale "Abonnementbedingungen" angezeigt werden.
  3. Wählen Sie OK, wenn das iOS-Modal "Abonnement bestätigen" angezeigt wird.
  4. Fehler von buySubscription () ausgelöst:
{
   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}
      }
   }
}

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie einen Testbenutzer in App Store Connect
  2. Installieren Sie die App aus dem App Store (oder laden Sie den Testbenutzer zu TestFlight ein und installieren Sie TestFlight und anschließend die App über TestFlight).
  3. Kaufen Sie ein Abonnement in der App
  4. Lassen Sie das Abonnement ablaufen
  5. Abmelden iOS Apple ID (Einstellungen> Apple ID, Abmelden)
  6. Neue Apple ID anmelden
  7. Kaufen Sie ein Abonnement in der App

Hoffe das hilft jemandem!

@ Hyochan

Nachdem ich viele Dinge ausprobiert habe, habe ich immer noch das gleiche Problem und mehr. Im folgenden Code gibt das RNIap.buySubscription (sku) undefiniert zurück. Bitte, hat es jemand gelöst?

`` `
statischer KaufSubscriptionIOS = asynchron (Abonnement-ID) => {
warte auf 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: Wir haben festgestellt, dass dieses Problem gut war. Es scheint derzeit etwa 10% unserer Benutzer zu passieren. Wir werden versuchen, diesen Listener hinzuzufügen, aber ich denke nicht, dass dies letztendlich eine großartige Lösung ist. @hyochan Gibt es eine Möglichkeit, in den Fällen, in denen dies

Wir haben ein sehr ähnliches Problem mit 3.4.6: Der erste Kaufversuch schlägt mit E_UNKOWN fehl, ein erneuter Versuch ist erfolgreich. Für uns geschieht dies jedoch mit buyProduct , nicht mit buySubscription . @hyochan könnte dies immer noch die gleiche Grundursache sein?

Hallo! Nach dem Aufrufen von RNIap.requestSubscription () tritt das gleiche Problem auf. Ich erhalte ein undefiniertes Ergebnis, aber die Zahlung ist erfolgreich. Die Kreditkarte wird belastet.

Die einzige Möglichkeit für diesen Benutzer, dies zu überwinden, besteht darin, den Kauf wiederherzustellen.

Hat jemand eine Lösung dafür? Ich verwende Version 3.5.9

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen