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 рд░реЗрдЯрд┐рдВрдЧреНрд╕