React-native-iap: [Android] يتم تشغيل PurchaseUpdatedListener مرة واحدة فقط ، وليس في كل معاملة اشتراك

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

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

"react-native-iap": "4.5.4",

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

"react-native": "0.61.4",

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

Android ، لم يتم اختباره على iOS

سلوك متوقع

يتم تشغيل PurchaseUpdatedListener في كل مرة يتم فيها استلام عملية شراء

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

يتم إطلاق buyUpdatedListener مرة واحدة فقط للإيصال الأول ، ثم لا يحدث شيء

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

جهاز حقيقي ، يعمل في dev env مع اختبار google account (يتكرر الاشتراك كل 5 دقائق - البريد الإلكتروني وارد ولكن الإيصال ليس كذلك).

كود مبسط أستخدمه:

import React from 'react';
import { Text, View, TouchableOpacity, Alert } from 'react-native';
import RNIap, {
  purchaseUpdatedListener,
  purchaseErrorListener,
} from 'react-native-iap';

import { SpinnerOverlay } from '../components/SpinnerOverlay';

import { itemSkus } from '../config/in-app';
import { validateRecipt } from '../utils/validateRecipt';
import { logger } from '../utils/logger';

export class SubscriptionScreenInner extends React.Component {
  purchaseUpdateSubscription = null;
  purchaseErrorSubscription = null;

  constructor(props) {
    super(props);
    this.state = {
      products: [],
      productsLoaded: false,
      isProcessing: false
    };
  }

  componentDidMount = async () => {
    try {
      if (itemSkus) {
        await RNIap.initConnection();
        await RNIap.flushFailedPurchasesCachedAsPendingAndroid();
        const products = await RNIap.getSubscriptions(itemSkus);
        this.setState({ products, productsLoaded: true });

        this.purchaseUpdateSubscription = purchaseUpdatedListener(
          async (purchase) => {
            try {
              const receipt = purchase.transactionReceipt;
              if (receipt) {
                const validate = await validateRecipt(purchase);

                if (validate) {
                  await RNIap.finishTransaction(purchase, false);
                  this.props.fetchUserProfile();
                  this.resetScreenState();
                  Alert.alert('receipt validated', 'cool');
                }
              }
            } catch (error) {
              this.resetScreenState();
              logger('Validate recipt error', error);
            }
          }
        );

        this.purchaseErrorSubscription = purchaseErrorListener((error) => {
          this.resetScreenState();
          logger('Purchase error during loading', error);
        });
      }
    } catch (error) {
      logger('Store prroducts error', error);
    }
  };

  componentWillUnmount() {
    if (this.purchaseUpdateSubscription) {
      this.purchaseUpdateSubscription.remove();
    }

    if (this.purchaseErrorSubscription) {
      this.purchaseErrorSubscription.remove();
    }

    RNIap.endConnection();
  }

  requestSubscription = async (sku) => {
    this.setState({ isProcessing: true }, async () => {
      await RNIap.requestSubscription(sku);
    });
  };

  resetScreenState = () => {
    this.setState({ isProcessing: false });
  };

  render() {
    const { products, productsLoaded, isProcessing } = this.state;

    if (!productsLoaded || isProcessing) {
      return (
        <View>
          <SpinnerOverlay />
        </View>
      );
    }

    return (
      <View>
        <View>
          <View>
            <View>
              <Text>Buy monthly subscription</Text>
            </View>

            <View>
              <TouchableOpacity onPress={() => this.requestSubscription(products[0].productId)}>
                <Text>Buy</Text>
              </TouchableOpacity>
            </View>
          </View>
        </View>
      </View>
    );
  }
}
🙏 help wanted 🤖 android 🧪 test

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

حسنا أرى ذلك. أنت تواجه مشكلة في حدث الاشتراك التالي. اسمحوا لي أن أختبر هذا وأعود.

ال 27 كومينتر

لقد قمت بترقية React Native إلى 0.63.2 لكنها لم تساعد.

بعد الاصطدام برد الفعل الأصلي- iap إلى 4.6.3 لا تغيير.

لدي نفس المشكلة بالضبط ، اعتدت أن تكون على 4.4.9 ، صدمت إلى 4.6.3 وما زالت تحدث
هل كنت قادرًا على إصلاحه أو هل توصلت إلى حل بديل؟

للأسف ليس لدي حل لهذا.

هذا غريب جدا. هل تقول أنك تحاول الشراء مرة أخرى بعد عملية الشراء الأولى ، فإن purchaseUpdatedListener لم يتم إطلاقه؟ لقد اختبرت هذا سابقًا ويجب أن يستمر في إطلاق النار حتى تقتل المستمع.

حسنا أرى ذلك. أنت تواجه مشكلة في حدث الاشتراك التالي. اسمحوا لي أن أختبر هذا وأعود.

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

أي حل لهذا؟

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

مرحبًاhyochan
أي فكرة متى سيتم حل هذا؟

شكرا

شكرا للتذكير! سأختبر هذا غدا.

تضمين التغريدة
أعلم أنك ما زلت تعمل على حل المشكلة ، أردت فقط معرفة تاريخ التصحيح التالي لهذه المشكلة لأن فريقنا بأكمله ينتظر هذه المشكلة.
شكرا لك

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

ذات صلة بـ iOS في # 1160

تضمين التغريدة
نقدر ذلك!!

Kalesberg هل يمكنك التفضل بالتحقق من android.test.purchased عدة مرات أيضًا؟

@ hyochan سيفعل ذلك!

تضمين التغريدة
منتجنا مخصص فقط لقاعدة الاشتراك ، لذلك لا يمكن إثبات أفضل شهادة على android.test.purchased .
لذا حاولت استخدام تطبيقك التجريبي في هذه المكتبة وأضفت test.sub1 لكنني لم أتمكن من الحصول على أي منتج به
Screenshot 2020-11-04 at 6 53 06 PM

Kalesberg هل يمكنك وضع android logcat حيث يتم تشغيل purchaseUpdatedListener ؟

من فضلك قل لي ما هو قادم في billingResult و purchases .

hyochan ، آمل أن يساعد
أتطلع حقًا إلى إصدار التصحيح هذا

أحاول النظر في هذا الآن. بالمناسبة هل يمكنك أن تعطيني تنسيق ملف أفضل؟ يصعب فتح ملف rtf في محيطي وهو chromeos . يمكنك أيضًا إرسال بريد إلكتروني إلي ([email protected]) إذا كنت تعتقد أن هناك مشكلة تتعلق بالخصوصية.

تضمين التغريدة
هل هذا يعني أنه لا يوجد خطأ في هذا البرنامج المساعد؟

يعمل إصدار iOS بشكل جيد ولكن الهواتف التي تعمل بنظام Android فقط هي التي تمثل مشكلة

نحن فقط نكتشف المشكلة. ومع ذلك ، باتباع logcat الذي قدمته ، يبدو لي أن acknowledgePurchase وهو finishTransaction لم يعمل بشكل صحيح منذ أن كانت عملية الشراء على الهواء. لقد شاركت نظام Stackoverflow الذي يتحدث أيضًا عن الموقف المماثل.

تضمين التغريدة
استمرت المشكلة حتى في وضع الاشتراك التجريبي الذي يجب أن ينجح دائمًا

hyochan ، أي تحديثات على البرنامج المساعد؟

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