React-native-iap: لا يمكن الحصول على مجموعة من المنتجات / الاشتراكات

تم إنشاؤها على ١٩ أغسطس ٢٠١٩  ·  31تعليقات  ·  مصدر: dooboolab/react-native-iap

نسخة من رد فعل - أصلية - IAP

3.3.9

نسخة من رد الفعل الأصلي

0.59.9

المنصات التي واجهت الخطأ فيها (IOS أو Android أو كليهما؟)

iOS و Android

سلوك متوقع

أتوقع أن أتمكن من الحصول على مجموعة من المنتجات والاشتراكات التي تم إنشاؤها في Play Console و Appstore.

السلوك الفعلي

تُرجع الدالتان RNIap.getProducts و RNIap.getSubscriptions دائمًا مصفوفات فارغة.

بيئة اختبار (محاكي؟ جهاز حقيقي؟)

محاكي iOS ومحاكي Android وجهاز Android حقيقي

خطوات إعادة إنتاج السلوك

  1. أضف منتجات في Google Play Console و Apple Appstore Connect
  2. لقد استخدمت الرمز من مثال المجلد
  3. لقد غيرت معرّفات المنتجات / الاشتراكات

لقد انتظرت أكثر من 24 ساعة. لقد أنشأت أيضًا إصدارًا داخليًا وإصدار ألفا في Google Play Console ، لكنني ما زلت أحصل على مصفوفات فارغة فقط.

أعتقد أنني لست واضحًا إلى حد ما بشأن متى يجب أن أتوقع بالضبط بدء العمل. على سبيل المثال ، عندما لا يزال طرح اختبار ألفا الخاص بي قيد النشر في Google Play Console ، فهل هذا يعني أن react-native-iap لن يعمل؟ هل يجب علي الانتظار حتى يتم نشر التطبيق لتجربته؟

أعلم أيضًا أنني لن أتمكن من إجراء عمليات شراء تجريبية على المحاكي / المحاكي ، ولكن هل ينبغي أن يعمل getProducts / getSubscriptions على المحاكيات أم أحتاج إلى جهاز حقيقي لاختباره؟

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

التعليق الأكثر فائدة

بالطبع بعد نشره في متجر google play ، سأؤكد هنا

تحديث

بعد نشر تطبيقي على متجر Google Play ، ظهرت عمليات الشراء وعملت. تستغرق الموافقة 3 أيام. بفضل jvandenaardweg

تحديث 2

يمكن أن يعمل React-native-iap على محاكي android ، إذا كان المحاكي يدعم متجر google play.

ال 31 كومينتر

لا تحتاج إلى real device للاختبار في ios مقابل getProducts / getSubscription ولكن ليس في android . android ستحتاج إلى جهاز حقيقي لشرائه.

بالنسبة إلى google ، يرجى مراجعة دليلي لحل مشكلتك.
لا يتعين عليك في الواقع نشر التطبيق على playstore للاختبار ولكنك تحتاج إلى تحميل ملف apk الموقع.

لدي أيضًا هذه المشكلة ، لقد قمت بالفعل بإنشاء منتج في Apple ولا يمكنني الوصول إليه.

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

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

هل يستغرق المنتج وقتًا لينعكس في تجربتك؟

الاتفاقيات والضرائب والخدمات المصرفية كلها نشطة
"رد فعل-أصلي-إيب": "^ 3.4.0"،
والتطبيق داخل التطبيق في حالة "جاهز للإرسال" بالفعل

nateblog ما نوع المنتج الذي

أيضًا ، هل أضفت ترجمة في App Store Connect لمنتجك / اشتراكك؟ إذا كان الأمر كذلك ، فحاول إضافة الترجمة التي نشطتها على جهازك أو جهاز محاكاة. أتذكر أنني واجهت بعض المشاكل مع ذلك من قبل. لغة جهاز المحاكي وجهازي باللغة الإنجليزية ، لذلك أضفت فقط ترجمة "الإنجليزية (الولايات المتحدة)" لاشتراكاتي.

jvandenaardweg - شكرًا لك على الرد ، نعم لقد أضفت الترجمة بالفعل لأن الحالة داخل التطبيق لن يتم تعيينها على "جاهز للإرسال" إذا تخطيت الترجمة. لقد قمت بتعيين الترجمة على "الإنجليزية (الولايات المتحدة)" نظرًا لأن الجهاز الذي أستخدمه يستخدم اللغة الإنجليزية ونعم المنتج عبارة عن اشتراك.

تحديث

لقد تأكدت بالفعل من أنني قمت بتمكين التطبيق في إطار الإمكانات وخفضت الحزمة إلى 2.4.0 ولكن لا تزال نفس النتيجة. . لا يمكنني الحصول على المنتجات ، إنها ترجع فقط مجموعة فارغة.

لقد قمت أيضًا بربط الحزمة يدويًا لأن المنشورات الأخرى اقترحت عدم استخدام رابط التفاعل الأصلي ولكن لا تزال نفس النتيجة. أنا أستخدم جهاز محاكاة وجهاز حقيقي.

عذرًا ، تم حلها الآن ، المشكلة كانت معرف الحزمة في xcode الخاص بي ، أنا أستخدم معرف الحزمة الخاطئ ، كل شيء يعمل الآن

كان لدي شيء مشابه ، وكنت بحاجة فقط إلى القيام بعملية ربط المكتبة يدويًا. (دائرة الرقابة الداخلية)

أواجه نفس المشكلة ، ولا أحمل أي منتجات من Itunes Connect ، ولست متأكدًا من أين أبدأ في البحث عن مشكلة. يستخدم التطبيق إصدارًا قديمًا من RN: 0.43.4. لقد جربت الإصدارين 3.3.7 و 2.5.5 من RN-IAP. هل يجب أن أستخدم إصدارًا أقدم من المكتبة لأنني أستخدم إصدارًا قديمًا من React-Native؟

يبدو أنها مشكلة يصعب استكشافها وإصلاحها حيث لا توجد رسائل خطأ ، فقط لا توجد بيانات.

عذرًا ، تم حلها الآن ، المشكلة كانت معرف الحزمة في xcode الخاص بي ، أنا أستخدم معرف الحزمة الخاطئ ، كل شيء يعمل الآن

ياnateblog! أواجه مشكلة مماثلة: أحصل على مصفوفات فارغة للمنتجات والاشتراكات وقمت بإنشاء عنصرين اشتراك داخل App Store Connect. هل يمكنك توضيح ما هو الخطأ في معرف الحزمة الخاص بك؟ لا أعتقد أنني أرسل وحدات SKU للعنصر الصحيح لأنني لم أتمكن من العثور على أي مرجع حول كيفية إنشائها أو ماهيتها - هل هي [معرف الحزمة]. [ProductId of the Purchase item] أو [ProductId من عنصر الشراء]؟

أيضًا ، أود أن أضيف أن لدي معرّفات حزمة مختلفة قليلاً لأنظمة الإصدار وتصحيح الأخطاء الخاصة بي:

  • الإصدار - 'domain.appName' ؛
  • تصحيح - 'domain.appName.dev' ؛
    ترتبط عناصر الشراء داخل التطبيق التي قمت بإنشائها بإصدار الإنتاج (أي الإصدار) من التطبيق. هل هذا يعني أنه لا يمكنني الوصول إلى هذه العناصر من إصدار مطور التطبيق؟

أي نصيحة سيكون موضع تقدير كبير.

كان لدي شيء مشابه ، وكنت بحاجة فقط إلى القيام بعملية ربط المكتبة يدويًا. (دائرة الرقابة الداخلية)

لقد أنقذت يومي!

لقد قمت بدمج رد فعل - أصلية - iap وقمت بتحميل ملف apk الموقع الخاص بي لإصدار بيتا في متجر play وأضفت أيضًا خطة اشتراك واحدة. أحاول الحصول على قائمة الاشتراك عن طريق معرف الاشتراك في وضع التصحيح الذي يعرض دائمًا مجموعة فارغة. هل يمكنني بالفعل اختبار الاشتراك في وضع التصحيح؟

ShridharCodewave أواجه نفس المشكلة. يرجى إعلامي إذا كان بإمكانك حل المشكلة :(

رد فعل - أصلي - IAP: 3.3.2

أواجه نفس المشكلة على Android Emulator. لقد قمت بتحميل apk إلى متجر Google Play على قناة Beta وأضفت المنتجات.

image

أولاً ، بدء الاتصال ثم أحاول إحضار المنتجات ولكن لا يظهر شيء على console.warn
لا توجد نتائج هنا
لا توجد أخطاء هنا

ismetsezer لن تعمل فوترة In App بالكامل لنظام Android في المحاكي:

لا يمكنك استخدام المحاكي لاختبار Google Play Billing ؛ يجب عليك تثبيت التطبيق الخاص بك على جهاز لاختبار Google Play Billing.
https://developer.android.com/google/play/billing/billing_testing

أنت بحاجة إلى جهاز حقيقي لذلك.

في iOS ، يمكنك جلب بيانات الاشتراك في جهاز المحاكاة. لكن لا يمكنك شرائه ، لذلك تحتاج أيضًا إلى جهاز حقيقي.

للتعليقات الأخرى أعلاه: تأكد أيضًا من أن versionName و versionCode في android/app/build.gradle هو نفسه أو أعلى من ذلك الذي تم تحميله في Google Play Console.

أنت بحاجة أيضًا إلى تطبيق تمت مراجعته نشطًا في مسار غير إنتاجي ، بسبب سياسة المراجعة الجديدة لنظام Android:

في السابق كان بإمكانك اختبار أحد التطبيقات عن طريق تحميل نسخة "مسودة" غير منشورة. هذه الوظيفة لم تعد مدعومة. بدلاً من ذلك ، يجب عليك نشر تطبيقك في مسار الاختبار المغلق أو المفتوح. لمزيد من المعلومات ، راجع مسودة التطبيقات لم تعد مدعومة.
https://developer.android.com/google/play/billing/billing_testing

يعني "النشر" في مسار اختبار مغلق / مفتوح أنه يحتاج إلى المرور بعملية المراجعة الجديدة في Google Play. الأمر الذي قد يستغرق يومين بالنسبة للتطبيقات الجديدة ، وساعتين فقط للتطبيقات الحالية.

لا أعرف بالضبط الخطوات التي قمت بها ، ولكن بالنسبة لي ، إنها تعمل محليًا باستخدام جهاز Android. لذلك من المحتمل ألا تكون مشكلة حزمة رد فعل أصلي ، ولكنها مشكلة تكوين.

إذا تمكن شخص ما من تأكيد ما ورد أعلاه ، فربما يكون من الجيد تحديث README حول هذا التغيير. لأن هذا شيء جديد منذ الشهر الماضي.

شكرًا jvandenaardweg عندما قمت بالتبديل إلى جهاز حقيقي ، نعم إنه يعمل والاتصال ناجح ولكن كما قلت ووفقًا للرابط ، يجب أن أنتظر تطبيق الاختبار ليتم نشره على قناة Beta لأن مجموعة المنتجات تأتي فارغة

من الجيد سماع ismetsezer . هل يمكنك تأكيد ما إذا كان سيبدأ العمل من أجلك باستخدام تطبيق اختبار تمت مراجعته / نشره؟ لأنه بعد ذلك يمكننا تحديث الملف التمهيدي بهذه المعلومات الجديدة :-)

بالطبع بعد نشره في متجر google play ، سأؤكد هنا

تحديث

بعد نشر تطبيقي على متجر Google Play ، ظهرت عمليات الشراء وعملت. تستغرق الموافقة 3 أيام. بفضل jvandenaardweg

تحديث 2

يمكن أن يعمل React-native-iap على محاكي android ، إذا كان المحاكي يدعم متجر google play.

kesepara اضطررت إلى الانتظار لبضع ساعات بعد إضافة خطة الاشتراك الجديدة في متجر play حتى تظهر على الجهاز.

مرحبًا ismetsezer و kesepara ،
سأكون ممتنًا حقًا لتعليقاتك حول تدفق التطوير الخاص بك لأن شيئًا ما لا يزال غير واضح بالنسبة لي.
لقد قمت بإعداد RN IAP لنظام iOS وهو يعمل بشكل جيد الآن.
لقد بدأت الآن في القيام بجزء Android ، ووجدت هنا أنه يتعين علينا استخدام ملف APK موقع تم تحميله على مسار مغلق (على الأقل) حتى نتمكن من اختبار ميزات الدفع.
لكن في تعليقاتك تقول إنك تمكنت من اختباره على محاكي Android ، فهل هذا صحيح؟
علاوة على ذلك ، إذا كان علينا استخدام ملف APK موقّع على المتجر ، فكيف يمكننا تصحيح الأخطاء؟
سوف مساعدتكم سيكون محل تقدير كبير جدا.

مرحبا beeremy شكرا على آرائك الجيدة. يجب عليك اختبار iap على جهاز حقيقي أو محاكي يحتوي على دعم google play لجلب المنتجات. عملت IAP بعد أن نشرت التطبيق على متجر Google Play ، وقد يتغير هذا ولكن على الأقل يجب عليك تحميل أو تقديم مسودة في المتجر لاختبار هذه الميزة. ولكن يستغرق العمل من 2 - 3 ساعات.

مرحبًا ismetsezer ، شكرًا على ملاحظاتك.

لأي شخص يمكن أن يكون مفيدًا ، فقد تمكنت من إنشاء تهيئة تصحيح أخطاء تعمل بعد اتباع هذه التوصية: https://stackoverflow.com/questions/36113347/is-it-possible-to-debug-locally-google-plays -in-app-billing-in-android-studio

يمكنني أن أؤكد باسم ismetsezer أن الاشتراكات والمنتجات ستعمل في نظام Android بعد نشر التطبيق في وحدة تحكم google play. لن تعمل محاولة الحصول على اشتراكات / منتجات عندما لا يتم نشر التطبيق بعد على نظام Android.

على اشتراكات iOS والمنتجات تعمل دون نشر التطبيق.

مرحبًا ، يبدو أنه لم يكن هناك أي نشاط بشأن هذه المشكلة مؤخرًا. هل تم إصلاح المشكلة أم أنها لا تزال تتطلب اهتمام المجتمع؟ قد يتم إغلاق هذه المشكلة في حالة عدم حدوث أي نشاط آخر. يمكنك أيضًا تصنيف هذه المشكلة على أنها "للمناقشة" أو "مشكلة أولى جيدة" وسأتركها مفتوحة. شكرا لمساهماتكم.

RN 0.59.1 على Android dev هنا وأنا أستخدم الإصدار 4.4.1 من iap

بنيتي حاليًا على مسار ألفا. بعد ذلك ،

edgaralienfoe هل قمت بتنشيط اشتراكك في Google Play Console؟

acostalima يجب تفعيله. افترضت أنه ربما يستغرق الأمر بضعة أيام للقيام بذلك ، لكن لم يحالفني الحظ.

edgaralienfoe أسأل لأنني أتذكر أن هناك خيارًا لتنشيط الاشتراك بشكل صريح على Google Play Console ، وإذا لم يكن نشطًا ، فلن يظهر الاشتراك في تطبيقك. ولكن ، إذا قلت ذلك ، فقد تكون هناك مشكلة أخرى بعد ذلك.

edgaralienfoe هل وجدت الحل؟ ربما يجب أن يكون إصدار تطبيقك أعلى من الإصدار الموجود في مسار ألفا

edgaralienfoe هل وجدت الحل؟ ربما يجب أن يكون إصدار تطبيقك أعلى من الإصدار الموجود في مسار ألفا

مسار ألفا يعمل بشكل جيد. لقد كنت أختبر IAPs لبعض الوقت الآن مع إصدارات تم نشرها في Alpha دون مشاكل. المسار الداخلي ، من ناحية أخرى ، لا يعمل.

لكل شخص قد يواجه مشكلة هنا ، ما الذي فعلته الحيلة على iOS بالنسبة لي هو ربط المشروع يدويًا كما اقترح @ Kuhne1 - لقد الإنشاء وتثبيت Pods يدويًا أيضًا ، آمل أن يكون مفيدًا لأي شخص!

مرحبًا ، يبدو أنه لم يكن هناك أي نشاط بشأن هذه المشكلة مؤخرًا. هل تم إصلاح المشكلة أم أنها لا تزال تتطلب اهتمام المجتمع؟ قد يتم إغلاق هذه المشكلة في حالة عدم حدوث أي نشاط آخر. يمكنك أيضًا تصنيف هذه المشكلة على أنها "للمناقشة" أو "مشكلة أولى جيدة" وسأتركها مفتوحة. شكرا لمساهماتكم.

إغلاق هذه القضية بعد فترة طويلة من عدم النشاط. إذا كانت هذه المشكلة لا تزال موجودة في الإصدار الأخير ، فلا تتردد في إنشاء مشكلة جديدة بمعلومات محدثة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات