React-native-iap: purchaseUpdatedListener berulang kali dipanggil

Dibuat pada 3 Feb 2020  ·  6Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

4.3.0

Versi react-native

0.60.5

Platform yang Anda hadapi kesalahan (IOS atau Android atau keduanya?)

Kedua

Perilaku yang diharapkan

Mengikuti contoh saya ingin memanggil metode kustom setelah langganan saya dibeli. Apakah pemahaman saya bahwa setelah mengakui pembelian, pendengar harus disingkirkan? Saya telah mencoba menelepon remove secara eksplisit tetapi tidak berhasil.

Contoh

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

Perilaku sebenarnya

Metode callCustomEndpoint () dipanggil beberapa kali. Bagaimana saya bisa menghentikan ini terjadi? Karena saya hanya perlu mencapai titik akhir ini sekali.

Saya menggunakan komponen fungsional daripada komponen kelas jika itu penting.

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat Nyata

Langkah-langkah untuk mereproduksi perilaku

🙏 help wanted

Komentar yang paling membantu

Saya akan meletakkan solusi saya untuk pengait bagi mereka yang akan membutuhkannya nanti.

di luar komponen negara Anda (meskipun mungkin juga berfungsi di dalam):

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);
  });
};

di dalam komponen negara Anda:

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

Semua 6 komentar

Saya curiga Anda telah mendaftarkan purchaseListener beberapa kali saat komponen dirender.

Terima kasih, saya telah menulis ulang ini menggunakan kait sehingga tidak dipanggil pada setiap render. Kesalahan saya mencoba untuk mengambil contoh yang disediakan di dokumen komponen kelas dan mem-portnya ke komponen fungsional. Kerja bagus di perpustakaan!

@cgathergood Saya mengalami masalah ini juga. Apakah Anda keberatan memposting kode event handler Anda menggunakan react hooks?

@cgathergood saya ingin melihat contoh kode juga. saya sedikit berjuang dengan kail.

@ wootwoot1234 @osmantuna Bisakah Anda memberikan kode penanganan kejadian jika Anda berhasil memperbaikinya?

Saya akan meletakkan solusi saya untuk pengait bagi mereka yang akan membutuhkannya nanti.

di luar komponen negara Anda (meskipun mungkin juga berfungsi di dalam):

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);
  });
};

di dalam komponen negara Anda:

useEffect(() => {
    loadIAPListeners();
    return () => {
      purchaseUpdateSubscription.remove();
      purchaseErrorSubscription.remove();
    };
  }, []);
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

safciplak picture safciplak  ·  3Komentar

makarsky picture makarsky  ·  3Komentar

jvandenaardweg picture jvandenaardweg  ·  4Komentar

ramondelmondo picture ramondelmondo  ·  4Komentar

sanilcgs picture sanilcgs  ·  3Komentar