React-native-iap: Eine Reihe von Produkten / Abonnements kann nicht abgerufen werden

Erstellt am 19. Aug. 2019  ·  31Kommentare  ·  Quelle: dooboolab/react-native-iap

Version von react-native-iap

3.3.9

Version von React-Native

0,59,9

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

iOS und Android

Erwartetes Verhalten

Ich erwarte, eine Reihe von Produkten und Abonnements in der Play Console und im Appstore erstellen zu können.

Tatsächliches Verhalten

Die Funktionen RNIap.getProducts und RNIap.getSubscriptions immer leere Arrays zurück.

Getestete Umgebung (Emulator? Reales Gerät?)

iOS Simulator, Android Emulator und Android Real Device

Schritte zum Reproduzieren des Verhaltens

  1. Fügen Sie Produkte in Google Play Console und Apple Appstore Connect hinzu
  2. Ich habe den Code aus dem Beispielordner verwendet
  3. Ich habe die Produkt- / Abonnement-IDs geändert

Ich habe mehr als 24 Stunden gewartet. Ich habe auch die interne und Alpha-Version in der Google Play Console erstellt, erhalte aber immer noch nur leere Arrays zurück.

Ich denke, ich bin mir ein bisschen unklar, wann genau ich damit rechnen soll. Wenn mein Alpha-Test-Rollout beispielsweise noch in der Google Play Console veröffentlicht wird, bedeutet dies, dass react-native-iap nicht funktioniert? Muss ich warten, bis die App veröffentlicht ist, um sie auszuprobieren?

Ich weiß auch, dass ich nicht einmal Testkäufe mit Simulator / Emulator tätigen kann, aber sollte getProducts / getSubscriptions mit Emulatoren funktionieren oder brauche ich ein echtes Gerät, um es zu testen?

const itemSkus = Platform.select({
    ios: ['product_1'],
    android: ['1', '2']
});

const itemSubs = Platform.select({
    ios: ['subscription_1'],
    android: ['subscription_1', 'subscription_2']
});

let purchaseUpdateSubscription;
let purchaseErrorSubscription;

class App extends Component {
    constructor(props) {
        super(props);

        this.state = {
            productList: [],
            receipt: '',
            availableItemsMessage: ''
        };
    }

    async componentDidMount() {
        SplashScreen.hide();
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
        } catch (err) {
            console.warn(err.code, err.message);
        }

        purchaseUpdateSubscription = purchaseUpdatedListener(async purchase => {
            console.log('purchaseUpdatedListener', purchase);
            if (purchase.purchaseStateAndroid === 1 && !purchase.isAcknowledgedAndroid) {
                try {
                    const ackResult = await acknowledgePurchaseAndroid(purchase.purchaseToken);
                    console.log('ackResult', ackResult);
                } catch (ackErr) {
                    console.warn('ackErr', ackErr);
                }
            }
            this.setState({ receipt: purchase.transactionReceipt }, () => this.goNext());
        });

        purchaseErrorSubscription = purchaseErrorListener(error => {
            console.log('purchaseErrorListener', error);
            Alert.alert('purchase error', JSON.stringify(error));
        });
    }

    componentWillMount() {
        if (purchaseUpdateSubscription) {
            purchaseUpdateSubscription.remove();
            purchaseUpdateSubscription = null;
        }
        if (purchaseErrorSubscription) {
            purchaseErrorSubscription.remove();
            purchaseErrorSubscription = null;
        }
    }

    goNext = () => {
        Alert.alert('Receipt', this.state.receipt);
    };

    getItems = async () => {
        try {
            const products = await RNIap.getProducts(itemSkus);            
            console.log('Products', products);
            this.setState({ productList: products });
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    getSubscriptions = async () => {
        try {
            const products = await RNIap.getSubscriptions(itemSubs);
            console.log('Products', products);
            this.setState({ productList: products });
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    getAvailablePurchases = async () => {
        try {
            console.info('Get available purchases (non-consumable or unconsumed consumable)');
            const purchases = await RNIap.getAvailablePurchases();
            console.info('Available purchases :: ', purchases);
            if (purchases && purchases.length > 0) {
                this.setState({
                    availableItemsMessage: `Got ${purchases.length} items.`,
                    receipt: purchases[0].transactionReceipt
                });
            }
        } catch (err) {
            console.warn(err.code, err.message);
            Alert.alert(err.message);
        }
    };

    requestPurchase = async sku => {
        try {
            RNIap.requestPurchase(sku);
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    requestSubscription = async sku => {
        try {
            RNIap.requestSubscription(sku);
        } catch (err) {
            Alert.alert(err.message);
        }
    };

    render() {
        const { productList, receipt, availableItemsMessage } = this.state;
        const receipt100 = receipt.substring(0, 100);

        return (
            <View style={styles.container}>
                <View style={styles.header}>
                    <Text style={styles.headerTxt}>react-native-iap V3</Text>
                </View>
                <View style={styles.content}>
                    <ScrollView style={{ alignSelf: 'stretch' }}>
                        <View style={{ height: 50 }} />
                        <NativeButton
                            onPress={this.getAvailablePurchases}
                            activeOpacity={0.5}
                            style={styles.btn}
                            textStyle={styles.txt}
                        >
                            Get available purchases
                        </NativeButton>

                        <Text style={{ margin: 5, fontSize: 15, alignSelf: 'center' }}>
                            {availableItemsMessage}
                        </Text>

                        <Text style={{ margin: 5, fontSize: 9, alignSelf: 'center' }}>
                            {receipt100}
                        </Text>

                        <NativeButton
                            onPress={() => this.getItems()}
                            activeOpacity={0.5}
                            style={styles.btn}
                            textStyle={styles.txt}
                        >
                            Get Products ({productList.length})
                        </NativeButton>
                        {productList.map((product, i) => {
                            return (
                                <View
                                    key={i}
                                    style={{
                                        flexDirection: 'column'
                                    }}
                                >
                                    <Text
                                        style={{
                                            marginTop: 20,
                                            fontSize: 12,
                                            color: 'black',
                                            minHeight: 100,
                                            alignSelf: 'center',
                                            paddingHorizontal: 20
                                        }}
                                    >
                                        {JSON.stringify(product)}
                                    </Text>
                                    <NativeButton
                                        // onPress={() => this.requestPurchase(product.productId)}
                                        onPress={() => this.requestSubscription(product.productId)}
                                        // onPress={() => this.buyItem(product.productId)}
                                        // onPress={() => this.buySubscribeItem(product.productId)}
                                        activeOpacity={0.5}
                                        style={styles.btn}
                                        textStyle={styles.txt}
                                    >
                                        Request purchase for above product
                                    </NativeButton>
                                </View>
                            );
                        })}
                    </ScrollView>
                </View>
            </View>
        );
    }
}
📱 iOS 🙏 help wanted 🚶🏻 stale 🤖 android

Hilfreichster Kommentar

Natürlich. Nach der Veröffentlichung im Google Play Store werde ich hier bestätigen

AKTUALISIEREN

Nachdem meine App im Google Play Store veröffentlicht wurde, wurden Einkäufe getätigt und funktionierten. Die Genehmigung dauert 3 Tage. Danke an @jvandenaardweg

UPDATE 2

react-native-iap kann auf dem Android-Emulator verwendet werden, wenn der Emulator Google Play Store-Unterstützung bietet.

Alle 31 Kommentare

Sie brauchen nicht real device , um in ios für getProducts / getSubscription real device zu testen, aber nicht in android . Für android benötigen Sie ein echtes Gerät, um es kaufen zu können.

Bei Google lesen Sie bitte meinen Leitfaden , um Ihr Problem zu beheben.
Sie müssen die App nicht zum Testen im Playstore veröffentlichen, sondern müssen die signierte apk hochladen.

Ich habe auch dieses Problem, ich habe bereits ein Produkt in Apple erstellt und kann scheinbar nicht darauf zugreifen.

const itemSkus = Platform.select({
  ios: [
    'product1'
  ],
  android: []
});

RNIap.getProducts(itemSkus).then((products) => {
      console.log(products);  //<< returns empty array
}).catch((error) => console.log(error))

Braucht es Zeit, bis sich das Produkt in Ihrer Erfahrung widerspiegelt?

Vereinbarungen, Steuern und Bankgeschäfte sind alle aktiv
"react-native-iap": "^ 3.4.0",
Und die In-App befindet sich bereits im Status "Bereit zum Senden"

@nateblog Welche Art von Produkt haben Sie erstellt? Ein Abonnement oder etwas anderes?

Haben Sie auch eine Lokalisierung in App Store Connect für Ihr Produkt / Abonnement hinzugefügt? Versuchen Sie in diesem Fall, die auf Ihrem Gerät oder Simulator aktive Lokalisierung hinzuzufügen. Ich erinnere mich, dass ich vorher einige Probleme damit hatte. Mein Simulator und mein Gerätegebietsschema sind in Englisch, daher habe ich für meine Abonnements nur die Lokalisierung "Englisch (USA)" hinzugefügt.

@jvandenaardweg - Vielen Dank für die Antwort. Ja, ich habe die Lokalisierung bereits hinzugefügt, da der In-App-Status nicht auf "Bereit zum Senden" gesetzt wird, wenn ich die Lokalisierung überspringe. Ich habe die Lokalisierung auf "Englisch (USA)" gesetzt, da das von mir verwendete Gerät Englisch verwendet und das Produkt ein Abonnement ist.

AKTUALISIEREN

Ich habe bereits sichergestellt, dass ich die In-App unter Funktionen aktiviert und das Paket auf 2.4.0 heruntergestuft habe, aber immer noch das gleiche Ergebnis. . Ich kann die Produkte nicht erhalten, es wird nur ein leeres Array zurückgegeben.

Außerdem habe ich das Paket manuell verlinkt, da andere Beiträge vorgeschlagen haben, den reaktionsnativen Link nicht zu verwenden, aber immer noch das gleiche Ergebnis. Ich benutze sowohl Simulator als auch reales Gerät.

Entschuldigung, es ist jetzt behoben. Das Problem war die Bundle-ID in meinem Xcode. Ich verwende die falsche Bundle-ID. Jetzt funktioniert alles

Ich hatte eine ähnliche und musste den Verknüpfungsprozess der Bibliothek nur manuell durchführen. (ios)

Ich habe das gleiche Problem, lade keine Produkte von Itunes Connect und bin mir nicht sicher, wo ich nach einem Problem suchen soll. Die App verwendet eine alte Version von RN: 0.43.4. Ich habe die Versionen 3.3.7 und 2.5.5 von RN-IAP ausprobiert. Sollte ich eine ältere Version der Bibliothek verwenden, weil ich eine alte Version von React-Native verwende?

Die Fehlerbehebung scheint schwierig zu sein, da keine Fehlermeldungen und nur keine Daten vorliegen.

Entschuldigung, es ist jetzt behoben. Das Problem war die Bundle-ID in meinem Xcode. Ich verwende die falsche Bundle-ID. Jetzt funktioniert alles

Hey, @nateblog! Ich habe ein ähnliches Problem: Ich erhalte leere Arrays für Produkte und Abonnements und habe zwei Abonnementelemente in App Store Connect erstellt. Könnten Sie bitte näher erläutern, was mit Ihrer Bundle-ID nicht stimmte? Ich glaube nicht, dass ich die richtigen Artikel-SKUs einreiche, da ich keinen Hinweis darauf finden konnte, wie sie aufgebaut sind oder was sie sind - sind sie [Bundle-ID]. [Produkt-ID des Kaufartikels] oder nur [Produkt-ID des Kaufgegenstandes]?

Außerdem möchte ich hinzufügen, dass ich für meine Release- und Debug-Schemata leicht unterschiedliche Bundle-IDs habe:

  • Release - 'domain.appName';
  • Debug - 'domain.appName.dev';
    Die von mir erstellten In-App-Kaufartikel beziehen sich auf die Produktionsversion (dh Release-Version) der App. Bedeutet das, dass ich über die Entwicklerversion der App nicht auf diese Elemente zugreifen konnte?

Jeder Rat wäre sehr dankbar.

Ich hatte eine ähnliche und musste den Verknüpfungsprozess der Bibliothek nur manuell durchführen. (ios)

Du hast meinen Tag gerettet!

Ich habe das react-native-iap integriert und meine signierte apk zur Beta-Version im Play Store hochgeladen und außerdem ein Abonnement hinzugefügt. Ich versuche, die Liste der Abonnements anhand der Abonnement-ID im Debug-Modus abzurufen, der immer ein leeres Array zurückgibt. Kann ich das Abonnement tatsächlich im Debug-Modus testen?

@ ShridharCodewave Ich

React-Native-IAP: 3.3.2

Ich habe das gleiche Problem mit Android Emulator. Ich habe apk in den Google Play Store auf Beta Channel hochgeladen und Produkte hinzugefügt.

image

Zuerst Verbindung init, dann versuche ich Produkte abzurufen, aber auf console.warn wird nichts angezeigt
Keine Ergebnisse hier
Keine Fehler hier

@ismetsezer Die gesamte In-App-Abrechnung für Android funktioniert im Emulator nicht:

Sie können den Emulator nicht zum Testen von Google Play Billing verwenden. Sie müssen Ihre Anwendung auf einem Gerät installieren, um Google Play Billing zu testen.
https://developer.android.com/google/play/billing/billing_testing

Dafür benötigen Sie ein echtes Gerät.

Unter iOS können Sie Abonnementdaten im Simulator abrufen. Man kann es aber nicht kaufen, dafür braucht man auch ein echtes Gerät.

Für die anderen obigen Kommentare: Stellen Sie außerdem sicher, dass versionName und versionCode in android/app/build.gradle mit dem in Google Play Console hochgeladenen

Aufgrund der neuen Überprüfungsrichtlinie von Android benötigen Sie außerdem eine aktiv überprüfte App in einem nicht produktiven Track:

Zuvor konnten Sie eine App testen, indem Sie eine unveröffentlichte "Entwurfs" -Version hochladen. Diese Funktionalität wird nicht mehr unterstützt. Stattdessen müssen Sie Ihre App auf der geschlossenen oder offenen Teststrecke veröffentlichen. Weitere Informationen finden Sie unter Entwürfe von Apps werden nicht mehr unterstützt.
https://developer.android.com/google/play/billing/billing_testing

"Veröffentlichen" in einer geschlossenen / offenen Teststrecke bedeutet, dass der neue Überprüfungsprozess von Google Play durchlaufen werden muss. Dies kann bei neuen Apps einige Tage und bei vorhandenen Apps nur einige Stunden dauern.

Ich weiß nicht genau, welche Schritte ich gemacht habe, aber für mich funktioniert es lokal mit einem Android-Gerät. Es handelt sich also wahrscheinlich nicht um ein React-Native-iap-Paket, sondern eher um eine Konfigurationssache.

Wenn jemand dies bestätigen kann, ist es möglicherweise eine gute Sache, die README-Datei über diese Änderung zu aktualisieren. Da dies seit letztem Monat etwas Neues ist.

Vielen Dank an @jvandenaardweg, als ich zu einem echten Gerät

Gut zu hören @ismetsezer . Können Sie mit einer überprüften / veröffentlichten Test-App bestätigen, ob es für Sie funktioniert? Denn dann können wir die Readme mit diesen neuen Informationen aktualisieren :-)

Natürlich. Nach der Veröffentlichung im Google Play Store werde ich hier bestätigen

AKTUALISIEREN

Nachdem meine App im Google Play Store veröffentlicht wurde, wurden Einkäufe getätigt und funktionierten. Die Genehmigung dauert 3 Tage. Danke an @jvandenaardweg

UPDATE 2

react-native-iap kann auf dem Android-Emulator verwendet werden, wenn der Emulator Google Play Store-Unterstützung bietet.

@kesepara Ich musste einige Stunden warten, nachdem ich das neue Abonnement im Play Store hinzugefügt hatte, damit es auf dem Gerät angezeigt wurde.

Hallo @ismetsezer und @kesepara ,
Ich würde mich sehr über Ihren Beitrag zu Ihrem Entwicklungsfluss freuen, da mir noch etwas nicht klar ist.
Ich habe RN IAP für iOS eingerichtet und es funktioniert jetzt einwandfrei.
Ich fange jetzt an, den Android-Teil zu machen, und ich habe hier festgestellt
Aber in Ihren Kommentaren sagen Sie, dass Sie es auf dem Android-Emulator testen konnten. Ist das richtig?
Wie können wir außerdem debuggen, wenn wir signierte APK im Store verwenden müssen?
Ihre Hilfe wäre sehr dankbar.

Hallo @beeremy, danke für deine guten Meinungen. Sie müssen iap auf einem realen Gerät oder Emulator testen, der Google Play-Unterstützung bietet, um Produkte abzurufen. IAP hat funktioniert, nachdem ich die App im Google Play Store veröffentlicht habe. Dies könnte sich ändern, aber Sie müssen zumindest einen Entwurf im Store hochladen oder erstellen, um diese Funktion zu testen. Die Arbeit dauert jedoch 2 bis 3 Stunden.

Hallo @ismetsezer , danke für dein Feedback.

Für jeden, der nützlich sein kann, konnte ich eine Debug-Konfiguration erstellen, nachdem ich diese Empfehlung befolgt habe :

Ich kann als @ismetsezer bestätigen, dass Abonnements und Produkte in Android funktionieren, nachdem die App in der Google Play Console veröffentlicht wurde. Der Versuch, Abonnements / Produkte zu erhalten, wenn die App noch nicht veröffentlicht wurde, funktioniert nicht für Android.

Unter iOS funktionieren Abonnements und Produkte, ohne dass die App veröffentlicht wurde.

Hey, es sieht so aus, als ob in letzter Zeit keine Aktivitäten zu diesem Thema stattgefunden haben. Wurde das Problem behoben oder erfordert es immer noch die Aufmerksamkeit der Community? Dieses Problem kann geschlossen werden, wenn keine weitere Aktivität auftritt. Sie können diese Ausgabe auch als "Zur Diskussion" oder "Gute erste Ausgabe" bezeichnen, und ich werde sie offen lassen. Vielen Dank für Ihre Beiträge.

RN 0.59.1 auf Android dev hier und ich verwende iap Version 4.4.1

Mein Build befindet sich derzeit auf der Alpha-Spur. Danach habe ich wie gewohnt auf meinem Computer im Debug-Modus neu erstellt. In Platform.select ({}) habe ich die Abonnement-ID wie in der Play Console angegeben und getSubscriptions () aufgerufen, erhalte jedoch ein leeres Array. Liegt das daran, dass es in Alpha ist? Irgendwelche Ideen?

@edgaralienfoe Haben Sie Ihr Abonnement in der Google Play Console aktiviert?

@acostalima sollte aktiviert sein. Ich nahm an, dass es vielleicht ein paar Tage dauert, aber immer noch kein Glück.

@edgaralienfoe Ich

@edgaralienfoe Hast du die Lösung gefunden? Möglicherweise muss Ihre App-Version höher sein als die in Alpha Track

@edgaralienfoe Hast du die Lösung gefunden? Möglicherweise muss Ihre App-Version höher sein als die in Alpha Track

Alpha-Track funktioniert gut. Ich teste IAPs seit einiger Zeit mit Builds, die ohne Probleme auf Alpha bereitgestellt werden. Die interne Spur funktioniert dagegen nicht.

Für alle, die hier in Schwierigkeiten geraten könnten, war der Trick unter iOS für mich, das Projekt manuell zu verknüpfen, wie von @ Kuhne1 vorgeschlagen - es funktionierte nach dem Bereinigen des Build-Ordners und dem manuellen Installieren von Pods.

Hey, es sieht so aus, als ob in letzter Zeit keine Aktivitäten zu diesem Thema stattgefunden haben. Wurde das Problem behoben oder erfordert es immer noch die Aufmerksamkeit der Community? Dieses Problem kann geschlossen werden, wenn keine weitere Aktivität auftritt. Sie können diese Ausgabe auch als "Zur Diskussion" oder "Gute erste Ausgabe" bezeichnen, und ich werde sie offen lassen. Vielen Dank für Ihre Beiträge.

Schließen dieses Problems nach längerer Inaktivität. Wenn dieses Problem in der neuesten Version noch vorhanden ist, können Sie ein neues Problem mit aktuellen Informationen erstellen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen