React-native-iap: تم استدعاء buyUpdatedListener بشكل متكرر

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

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

4.3.0

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

0.60.5

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

كلاهما

سلوك متوقع

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

مثال

 const purchaseListener = purchaseUpdatedListener(purchase => {
      const receipt = purchase.transactionReceipt;
      if (receipt) {
        callCustomEndpoint().then(result => {
          if(result){
            // Subscription is valid
            finishTransaction(purchase);
          }
        }) 
      };
      finishTransaction(purchase);
    });

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

يتم استدعاء أسلوب callCustomEndpoint () عدة مرات. كيف يمكنني منع حدوث ذلك؟ لأنني بحاجة إلى الوصول إلى نقطة النهاية هذه مرة واحدة فقط.

أنا أستخدم مكونًا وظيفيًا بدلاً من مكون فئة إذا كان مهمًا.

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

جهاز حقيقي

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

🙏 help wanted

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

سأضع الحل الخاص بي للخطافات لأولئك الذين سيحتاجون إليه لاحقًا.

خارج مكون دولتك (على الرغم من أنه يعمل أيضًا في الداخل)

var purchaseUpdateSubscription;
var purchaseErrorSubscription;
const loadIAPListeners = () => {
  initConnection(); // important, or else it won't trigger before a random state change
  purchaseUpdateSubscription = purchaseUpdatedListener(
    async (
      purchase: InAppPurchase | SubscriptionPurchase | ProductPurchase,
    ) => {
      console.log('purchaseUpdatedListener', purchase);
      let receipt = purchase.transactionReceipt;
      if (receipt) {
        apis.checkreceipt({data: purchase, platform: Platform.OS}); // I personally don't care about callback
        if (Platform.OS === 'ios') {
          await RNIap.finishTransactionIOS(purchase.transactionId);
        } else if (Platform.OS === 'android') {
          await RNIap.acknowledgePurchaseAndroid(purchase.purchaseToken);
        }
        await RNIap.finishTransaction(purchase, true);
        await RNIap.finishTransaction(purchase, false);
      } else {
        // Retry / conclude the purchase is fraudulent, etc...
      }
    },
  );
  purchaseErrorSubscription = purchaseErrorListener((error: PurchaseError) => {
    console.log('purchaseErrorListener', error);
  });
};

داخل مكون الدولة الخاص بك:

useEffect(() => {
    loadIAPListeners();
    return () => {
      purchaseUpdateSubscription.remove();
      purchaseErrorSubscription.remove();
    };
  }, []);

ال 6 كومينتر

أشك في أنك قمت بتسجيل PurchaseListener عدة مرات عند إعادة عرض المكون.

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

cgathergood أواجه هذه المشكلة أيضًا. هل تمانع في نشر كود معالج الحدث الخاص بك باستخدام خطافات التفاعل؟

cgathergood أرغب في رؤية عينة رمز أيضًا. أنا أعاني قليلاً مع الخطافات.

@ wootwoot1234osmantuna هل يمكن إرضاء تقديم رموز معالج الحدث إذا كنت تمكنت من إصلاح ذلك؟

سأضع الحل الخاص بي للخطافات لأولئك الذين سيحتاجون إليه لاحقًا.

خارج مكون دولتك (على الرغم من أنه يعمل أيضًا في الداخل)

var purchaseUpdateSubscription;
var purchaseErrorSubscription;
const loadIAPListeners = () => {
  initConnection(); // important, or else it won't trigger before a random state change
  purchaseUpdateSubscription = purchaseUpdatedListener(
    async (
      purchase: InAppPurchase | SubscriptionPurchase | ProductPurchase,
    ) => {
      console.log('purchaseUpdatedListener', purchase);
      let receipt = purchase.transactionReceipt;
      if (receipt) {
        apis.checkreceipt({data: purchase, platform: Platform.OS}); // I personally don't care about callback
        if (Platform.OS === 'ios') {
          await RNIap.finishTransactionIOS(purchase.transactionId);
        } else if (Platform.OS === 'android') {
          await RNIap.acknowledgePurchaseAndroid(purchase.purchaseToken);
        }
        await RNIap.finishTransaction(purchase, true);
        await RNIap.finishTransaction(purchase, false);
      } else {
        // Retry / conclude the purchase is fraudulent, etc...
      }
    },
  );
  purchaseErrorSubscription = purchaseErrorListener((error: PurchaseError) => {
    console.log('purchaseErrorListener', error);
  });
};

داخل مكون الدولة الخاص بك:

useEffect(() => {
    loadIAPListeners();
    return () => {
      purchaseUpdateSubscription.remove();
      purchaseErrorSubscription.remove();
    };
  }, []);
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات