2.2.2
(weil jede neuere Version unter iOS aufgrund von # 279 fehlschlägt)
iOS
Es sollte kein Fehler ausgegeben werden. Der Kauf war erfolgreich (live und in Produktion)
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"}
Echtes Gerät. Live-Kunden. Sehr konsequent versagt
Beim Testen des Verfahrens mit Sandbox-Benutzern kann der Fehler nicht reproduziert werden.
@ 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:
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.
^ 2.4.1
https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz
iOS beim Testen in TestFlight auf einem realen Gerät.
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.
{
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}
}
}
}
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
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