5.0.1 рд╣реИ
0.63.3
рдЖрдИрдУрдПрд╕
рдЦрд░реАрдж рдХрдИ рдмрд╛рд░ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
рдХрдИ рдмрд╛рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдмреАрдЪ рдореЗрдВ рднреА
рдЕрд╕рд▓реА рдбрд┐рд╡рд╛рдЗрд╕ (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;
}
};
}, []);
рдХреНрдпрд╛ рдИрд╡реЗрдВрдЯ рд╕рдорд╛рди рдЦрд░реАрдж рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЖрдЧ рд▓рдЧрд╛рддрд╛ рд╣реИ?
рд╣рд╛рдВ, рдпрд╣ рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо / рд░рд╕реАрдж рдХреЗ рд╕рд╛рде рдлрд╛рдпрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╡рд░реНрддрдорд╛рди рд░рд╕реАрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рднреА рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рддреНрдпрд╛рдкрди рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддреА рд╣реИред
рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдШрдЯрдХ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ? рдШрдЯрдХ рдХреЗ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рд╣реЛрдиреЗ рдФрд░ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдХрдИ рдмрд╛рд░ рд░реЛрдиреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореБрджреНрджреЗ рд╕рд╛рдордиреЗ рдЖрдПред рд╡реИрд╕реЗ рдпрд╣ рдХрдард┐рди рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЦреИрд░, рдпрд╣ "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 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
рдореЗрд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ IAP рдЦрд░реАрджрддрд╛ рд╣реИред
- рдкрд░реНрдЪреВрдбреЗрдЯреЗрдб рд▓рд┐рд╕реНрдЯрдирд░ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИред
- рдЦрд░реАрдж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 рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрдЧ рд╣реИ ...ред
рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ : рд░реЗрд╡реЗрдиреНрдпреБрдХреЗрдЯ;)
рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди?
рд░реЗрд╡рдиреНрдпреВрдХреИрдЯ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦрд░реАрджрд╛рд░реА рдХреА рдЕрдзрд┐рдкреНрд░рд╛рдкреНрддрд┐ рд╕реВрдЪреА рдЯреВрдЯ рдЧрдИ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕ asap рдХреЛ рдареАрдХ рдХрд░реЗрдВред рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред