React-native-iap: खरीद के बाद भी कई बार कॉल किया गया

को निर्मित 26 अक्तू॰ 2020  ·  22टिप्पणियाँ  ·  स्रोत: dooboolab/react-native-iap

प्रतिक्रिया-देशी-आईएपी का संस्करण

5.0.1 है

प्रतिक्रिया-मूल का संस्करण

0.63.3

जिन प्लेटफ़ॉर्मों में आपको त्रुटि हुई (IOS या Android या दोनों?)

आईओएस

अपेक्षित् व्यवहार

खरीद कई बार नहीं बुलाया जा रहा है

वास्तविक व्यवहार

कई बार स्टार्टअप पर कॉल किया जाता है, कभी-कभी बीच में भी

परीक्षणित वातावरण (एमुलेटर? रियल डिवाइस?)

असली डिवाइस (iOS 14, टेस्ट फ्लाइट में 13 और AppStore में)

व्यवहार को पुन: पेश करने के लिए कदम

(नेविगेटर घटक)

const itemSkus = ['01', '02'];

const processNewPurchase = async (purchase) => {
  const { productId, transactionReceipt } = purchase;
  if (transactionReceipt !== undefined && transactionReceipt) {
       //backend call with fetch - validating receipt 
        if (data.ack === 'success') {
          console.log('finished');
          await finishTransaction(purchase);
      } else if (data.ack === 'failure') {
          props.setProcessing(false);
          console.log('error');
      }
    }
};


const getProductsIAP = useCallback(async () => {
  await clearProductsIOS();
  await clearTransactionIOS();

 try {
   const result = await initConnection();
   const products = await getProducts(itemSkus);
   props.setProducts(products);
   console.log('result', result);
 } catch (err) {
   console.warn(err.code, err.message);
 }

  purchaseUpdateSubscription = purchaseUpdatedListener(
    async (purchase) => {
      const receipt = purchase.transactionReceipt;
      console.log('purchaseUpdatedListener');
      if (receipt) {
        try {
          await processNewPurchase(purchase);
        } catch (ackErr) {
           console.log('ackErr', ackErr);
        }
      } else {
        console.log('purchaseUpdatedListener error: receipt');
      }
    },
  );

  purchaseErrorSubscription = purchaseErrorListener(
    (error: PurchaseError) => {
      console.log('purchaseErrorListener', error);
      console.log(JSON.stringify(error));
    },
  );

  setLoading(false);
}, []);


useEffect(() => {
  getProductsIAP();

  return () => {
    if (purchaseUpdateSubscription) {
      purchaseUpdateSubscription.remove();
      purchaseUpdateSubscription = null;
    }
    if (purchaseErrorSubscription) {
      purchaseErrorSubscription.remove();
      purchaseErrorSubscription = null;
    }
  };
}, []);

📱 iOS 🙏 help wanted

सबसे उपयोगी टिप्पणी

अभी भी वही समस्या है। ऐसा लगता है कि यह खरीदारी की अधिप्राप्ति सूची टूट गई है। कृपया इस asap को ठीक करें। कोई समाधान नहीं मिला।

सभी 22 टिप्पणियाँ

क्या ईवेंट समान खरीद परिणामों पर आग लगाता है?

हां, यह सफल परिणाम / रसीद के साथ फायर करता है। यदि कोई वर्तमान रसीद नहीं है, तो यह भी आग लग जाती है, लेकिन सत्यापन सर्वर पर विफल रहती है।

क्या आप जाँच सकते हैं कि क्या आपका घटक फिर से तैयार नहीं है? घटक के पुन: प्रस्तुत होने और श्रोताओं के कई बार रोने पर बहुत सारे मुद्दे सामने आए। वैसे यह कठिन जारी किया जाना चाहिए लेकिन हमें आपके मामले को फिर से पेश करने की आवश्यकता है।

खैर, यह "NavigatorContainer" है, जिसका मतलब है कि मैं अलग-अलग राज्यों की स्थापना कर रहा हूं, सामान को अपडेट कर रहा हूं। परंतु केवल विभिन्न राज्यों, सहारा के अद्यतन के लिए एक और फिर "रेंडरर्स" का प्रतिपादन करता है ...

लेकिन इसके लिए श्रोताओं को अनसब्सक्राइब करना है - इससे बचने के लिए।

useEffect(() => {
  getProductsIAP();

  return () => {
    if (purchaseUpdateSubscription) {
      purchaseUpdateSubscription.remove();
      purchaseUpdateSubscription = null;
    }
    if (purchaseErrorSubscription) {
      purchaseErrorSubscription.remove();
      purchaseErrorSubscription = null;
    }
  };
}, []);

खैर, यह "NavigatorContainer" है, जिसका मतलब है कि मैं अलग-अलग राज्यों की स्थापना कर रहा हूं, सामान को अपडेट कर रहा हूं। लेकिन विभिन्न राज्यों, सहारा के अद्यतन के लिए केवल एक और फिर "रेंडरर्स" का प्रतिपादन ...

लेकिन इसके लिए श्रोताओं को अनसब्सक्राइब करना है - इससे बचने के लिए।

useEffect(() => {
  getProductsIAP();

  return () => {
    if (purchaseUpdateSubscription) {
      purchaseUpdateSubscription.remove();
      purchaseUpdateSubscription = null;
    }
    if (purchaseErrorSubscription) {
      purchaseErrorSubscription.remove();
      purchaseErrorSubscription = null;
    }
  };
}, []);

हां मैंने भी इसका उल्लेख किया है। अभी पिछले अंक को याद करता हूं। हमें प्रजनन की आवश्यकता है।

इसके अलावा, लेन-देन को साफ़ करने या अलग-अलग टेस्टफ़लाइट खाते की कोशिश करने से मदद मिल सकती है।

const getProductsIAP = useCallback(async () => {
  await clearProductsIOS();
  await clearTransactionIOS();

.....

TestFlight, उत्पादन और विभिन्न उपकरणों में परीक्षण किया गया।

अलग खाता?

हां, वही परिणाम।

अजीब। क्या आप हमारे IapExample प्रोजेक्ट में कोड स्निपेट भी आज़मा सकते हैं?

मेरा निम्नलिखित व्यवहार है।

1) उपयोगकर्ता IAP खरीदता है।
2) खरीदUpdatedListener कहा जाता है।
3) उपयोगकर्ता एप्लिकेशन को पुनर्स्थापित करता है।
4) उपयोगकर्ता ऐप पर वापस आता है।
5) खरीदUpdatedListener ट्रिगर हो जाता है और एक पाश में चला जाता है।

मैं कक्षाओं का उपयोग कर रहा हूं, लेकिन मुझे कोई पुन: रेंडर नहीं दिख रहा है।

मैं "प्रतिक्रिया-मूल-आईएपी" पर हूं: "4.4.1" और "प्रतिक्रिया-मूलक": "0.63.3"।

मैंने 5.0.0 में अपग्रेड करने की कोशिश की है, लेकिन मुझे वही व्यवहार मिल रहा है।

मेरा निम्नलिखित व्यवहार है।

  1. उपयोगकर्ता IAP खरीदता है।
  2. पर्चूडेटेड लिस्टनर को कहा जाता है।
  3. उपयोगकर्ता एप्लिकेशन को अनइंस्टॉल करता है।
  4. उपयोगकर्ता एप्लिकेशन पर लौटता है।
  5. खरीदUpdatedListener आग और एक पाश रूपों।

मैं कक्षाओं का उपयोग कर रहा हूं, लेकिन मुझे कोई दोहराव नहीं दिख रहा है।

मैं "रिएक्ट-देशी-आईएपी": "4.4.1" और "रिएक्शन-नेटिव": "0.63.3" में हूं।

मैंने 5.0.0 तक अपडेट करने की कोशिश की, लेकिन मुझे वही व्यवहार मिलता है।

एक सवाल नमस्कार। क्या आपको इसका हल मिला?

अभी भी वही समस्या है। ऐसा लगता है कि यह खरीदारी की अधिप्राप्ति सूची टूट गई है। कृपया इस asap को ठीक करें। कोई समाधान नहीं मिला।

इसके साथ एक ही मुद्दा रहा। यह कैसे संभव है कि यह महीनों तक तय न हो? क्या यह एक महत्वपूर्ण मुद्दा नहीं है या किसी को इसके लिए वर्कअराउंड मिल गया है? इसके अलावा अगर यह मदद करता है, मुझे लगता है कि मुझे केवल इस मुद्दे का सामना करना पड़ा जब मैंने अपने डिवाइस को iOS 13 से iOS 14. में अपग्रेड किया था। जहां तक ​​मुझे याद है कि यह iOS 13 पर ठीक काम कर रहा था, लेकिन मुझसे गलती हो सकती है।

एक ही मुद्दा यहाँ।
मैंने देखा कि ऐसा हर बार होता है जब मैं कोड को सहेजता हूं और ऐप गर्म होता है।
इस परिदृश्य में रूट घटक unmounted है, और उसके बाद remounted है।

यह मेरा useIap() हुक है

const useIap=()=>{

const purchaseUpdateSubscription = useRef<EmitterSubscription[]>([]);
    const purchaseErrorSubscription = useRef<EmitterSubscription[]>([]);

const init = useCallback(async () => {
        console.taggedLog(logTag, 'call iap init');

        await RNIap.initConnection();

        await RNIap.flushFailedPurchasesCachedAsPendingAndroid();

        purchaseUpdateSubscription.current.push(RNIap.purchaseUpdatedListener(async purchase => {
            console.taggedLog(logTag, 'purchaseUpdatedListener', purchase);

            try {
                await finalizePurchase(purchase);
            } catch (err) {
                handleFailedPurchase();
            }
        }));

        // use array to be sure to not accidentally overwrite subscriptions and lose access to them.
        // being an array I can always iterate and call `remove` on them
        purchaseErrorSubscription.current.push(RNIap.purchaseErrorListener(error => {
            handleFailedPurchase(error);
        }));

        updateProducts();
        return clear;
    }, []);

  const clear = useCallback(() => {
        console.taggedLog(logTag, 'clearing all');
        clearPurchaseEventListeners();
    }, [clearPurchaseEventListeners]);


 const clearPurchaseEventListeners = useCallback(() => {
        console.taggedLog(logTag, 'clearing purchase event listener', purchaseUpdateSubscription.current.length, purchaseErrorSubscription.current.length);
        purchaseUpdateSubscription.current.forEach(sub => sub.remove());
        purchaseErrorSubscription.current.forEach(sub => sub.remove());
        purchaseUpdateSubscription.current = [];
        purchaseErrorSubscription.current = [];
    }, []);

return {init,clear}
}

और फिर मैं रूट कोड में इस कोड का उपयोग करता हूं

const iap=useIap();
 useEffect(() => {
        console.log("root component mounted");
        iap.init();

        return () => {
            console.log("root component unmounted");
            iap.clear();
        };
    }, []);

रूट घटक अनमाउंट और रिमूव होने के लिए हो सकता है, clear विधि को हालांकि कहा जाता है, और मुझे लॉग 'क्लियरिंग खरीद इवेंट श्रोता', 1,1 भी दिखाई देता है, जिसका अर्थ है कि यह उन्हें साफ़ करने वाला है।

यहां तक ​​कि इस स्थिति में, खरीद की खरीद UDdatedListener अभी भी कई बार कहा जाता है, तों

कोई भी समाधान?

एक ही मुद्दा है।
यहां तक ​​कि इसे अलग-अलग स्क्रीनों में भी बुलाया जाता है।
इस पर कोई अपडेट?

मेरे लिए भी यही मुद्दा है। जब पिछली बार आईएपी प्रारंभ होता है तो यह पिछले प्राप्तियों को कॉल करता है।

मुझे वही समस्या थी और मुझे एहसास हुआ कि वही हो रहा था क्योंकि मैं घटक को सही ढंग से इकट्ठा नहीं कर रहा था और इस तरह एक ही समय में कई श्रोताओं को खोल रहा था।

componentWillUnmount() { if (this.purchaseUpdateSubscription) { this.purchaseUpdateSubscription.remove(); this.purchaseUpdateSubscription = null; } }
हर बार खरीदारी की जाती है और घटक को डिसाइड किया जाता है ताकि श्रोता / सदस्यता को हटाकर घटक को जोड़ते समय एक नया जोड़ा जा सके।
यह त्रुटि Android पर नहीं होती है, क्यों? मुझे नहीं पता, लेकिन क्योंकि यह एंड्रॉइड पर काम करता है, तो यह आपको लगता है कि त्रुटि आईओएस में है और कोड में नहीं है।

एक संभावित वर्कअराउंड, टेस्टिंग मैंने देखा कि यह कभी-कभी पिछली प्राप्तियों (सर्वर को भेजे गए) को दिखाता है, इसलिए मैंने जो भी किया है वह तुरंत प्राप्त प्रत्येक सूचना के लेनदेन को संग्रहीत करता है, इसलिए आप हमेशा डेटाबेस की जांच करें कि क्या यह लेन-देन संसाधित किया गया है और यदि तो फिर अनदेखा करें (यह एक डुप्लिकेट है) यदि नहीं तो आप आगे बढ़ सकते हैं। यदि नोटिफिकेशन पहले ऐप (सर्वर के बजाय) पर आता है तो आप इसे नियंत्रित करने के लिए कुछ तर्क रख सकते हैं यानी आपको एक निश्चित बटन क्लिक होने के बाद केवल 1 प्राप्त करना चाहिए आदि।
बड़े पैमाने पर परीक्षण के बाद कुछ समय बाद नकल करना बंद हो गया, कुछ चल रहा था।

हां, कुछ स्केचरी वर्कअराउंड हैं, लेकिन वे सभी सुंदर हैं ...।
कृपया इस समस्या को ठीक करें। यह निश्चित रूप से अक्टूबर 2020 से एक महत्वपूर्ण और प्रोजेक्ट ब्रेकिंग बग है ...।

केवल एक ही समाधान है, उपयोग करने के लिए है : रेवेन्युकेट;)

कोई भी समाधान?

रेवन्यूकैट

क्या यह पृष्ठ उपयोगी था?
0 / 5 - 0 रेटिंग्स