{"id":395697,"date":"2024-06-29T12:22:21","date_gmt":"2024-06-29T12:22:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=395697"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=395697","title":{"rendered":"<span>React Native in-app purchases: \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u044f \u0412\u0430\u043d\u044f \u2014 \u0444\u0443\u043b\u0441\u0442\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 <a href=\"https:\/\/adapty.io?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=blogpost_react-native-iap_configuration-and-retrieveing_products\">Adapty<\/a>. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 in-app \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 React Native.<\/p>\n<p>\u041a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u044e\u0430\u043d\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 React Native \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u043e\u043a\u0443\u043f\u043e\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043c\u0438\u043d\u0443\u0435\u043c\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 React Native \u2014 \u044d\u0442\u043e <a href=\"https:\/\/github.com\/dooboolab\/react-native-iap\"><u>react-native-iap<\/u><\/a>, <a href=\"https:\/\/docs.expo.dev\/versions\/latest\/sdk\/in-app-purchases\/\"><u>expo-in-app-purchases<\/u><\/a>. \u0410 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u044f \u043f\u0440\u043e <a href=\"https:\/\/github.com\/adaptyteam\/AdaptySDK-React-Native\"><u>react-native-adapty<\/u><\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n<ul>\n<li>\n<p>\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p>\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0444\u0438\u0447\u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432 \u043e\u0442 <a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/original_api_for_in-app_purchase\/subscriptions_and_offers\/implementing_promotional_offers_in_your_app\"><u>\u043f\u0440\u043e\u043c\u043e-\u043e\u0444\u0444\u0435\u0440\u043e\u0432<\/u><\/a> \u0434\u043e <a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/original_api_for_in-app_purchase\/subscriptions_and_offers\/implementing_introductory_offers_in_your_app\"><u>\u043e\u043f\u043b\u0430\u0442\u044b \u043d\u0430\u043f\u0435\u0440\u0451\u0434<\/u><\/a>, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0439 \u0431\u044b\u0441\u0442\u0440\u043e;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0449\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437-\u0446\u0438\u043a\u043b\u0430: \u043d\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0435\u0442\u044b \u0438 \u0436\u0434\u0430\u0442\u044c \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Adapty SDK \u0434\u0430\u0451\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u043e\u043d\u0443\u0441\u043e\u0432: \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c, \u043a\u043e\u0433\u043e\u0440\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a, A\/B \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u043e\u0432, \u043f\u0440\u043e\u043c\u043e-\u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e \u0433\u0438\u0431\u043a\u0438\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 in-app purchases \u043d\u0430 React Native. \u0412\u043e\u0442 \u0447\u0442\u043e \u043d\u0430\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Expo \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f in-app purchases \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 React Native.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u2014 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Adapty:<br \/>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f App Store<br \/>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Play Store<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <code>react-native-adapty<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043a\u043e\u0442\u043e\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u044e\u0437\u0435\u0440\u0430\u043c, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u2014 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Expo \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f in-app purchases \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 React Native<\/h3>\n<p>> TL;DR \u2014 <a href=\"https:\/\/docs.expo.dev\/introduction\/managed-vs-bare\/\"><u>Expo managed<\/u><\/a> \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043a\u0443\u043f\u043a\u0430\u043c\u0438 (\u0441\u0442\u043e\u0440\u043a\u0438\u0442\u043e\u0432). \u041d\u0443\u0436\u0435\u043d \u043b\u0438\u0431\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0447\u0438\u0441\u0442\u044b\u0439 RN, \u043b\u0438\u0431\u043e Expo bare workflow.<\/p>\n<p>\u0422\u0435\u0445, \u043a\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Expo, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043e\u043d \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f. Expo \u2014 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f React Native, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a\/\u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0438\u0445 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 workflow \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. Expo \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u0432\u043e\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 (\u0442\u043e\u043b\u044c\u043a\u043e js), \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043a\u0438\u0442\u043e\u0432. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 js \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0434\u043e <a href=\"https:\/\/docs.expo.dev\/expokit\/eject\/\"><u>\u044d\u0434\u0436\u0435\u043a\u0442\u0438\u0442\u044c\u0441\u044f<\/u><\/a>.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0438 \u0434\u043b\u044f iOS, \u0438 \u0434\u043b\u044f Android. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0437\u0430\u0439\u043c\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 20 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0432 App Store Connect \u0438\/\u0438\u043b\u0438 Google Play Console, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/adapty\/blog\/507664\/\"><u>\u0414\u043b\u044f iOS<\/u><\/a> \u2014 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u00ab\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 SKProduct\u00bb \u2014 \u0442\u0430\u043c \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/adapty\/blog\/568902\/\"><u>\u0414\u043b\u044f Android<\/u><\/a> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u043e \u00ab\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438\u00bb.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Adapty<\/h3>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>react-native-adapty<\/code> \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434 Adapty. \u042d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0437\u0430\u0442\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u043e\u043c, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430.\u00a0<\/p>\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f App Store \u0438 Google Play:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c00\/b96\/5da\/c00b965da54cddd0d501067e04c5c686.png\" width=\"1999\" height=\"1437\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c00\/b96\/5da\/c00b965da54cddd0d501067e04c5c686.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 iOS \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0443\u043a\u0430\u0437\u0430\u0442\u044c Bundle ID;<\/p>\n<\/li>\n<li>\n<p>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c App Store Server Notifications;<\/p>\n<\/li>\n<li>\n<p>App Store Connect shared secret.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438.<\/p>\n<p>\u041a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u0435\u0441\u0442\u044c Read how \u2014 \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0435 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u044b, \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0442\u0443\u0434\u0430.\u00a0<\/p>\n<p>Bundle ID \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ID \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 Xcode \u0432 Targets > [App Name] > General:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b08\/edf\/a9a\/b08edfa9ae3702649a764337992f05a8.png\" width=\"1999\" height=\"576\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b08\/edf\/a9a\/b08edfa9ae3702649a764337992f05a8.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f Android \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b Package Name \u0438 Service Account Key File.\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 Read how. <code>Package name<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <code>Bundle ID<\/code> \u0441 iOS. \u041d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043a\u043e\u0434\u0435. \u041d\u0430\u0439\u0442\u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>\/android\/app\/build.gradle<\/code> \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <code>android.defaultConfig.applicationId<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/796\/9c6\/d51\/7969c6d51efe854dbf18734031cb583f.png\" width=\"1999\" height=\"1334\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/796\/9c6\/d51\/7969c6d51efe854dbf18734031cb583f.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Adapty SDK \u0432 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0438\u0434\u0435\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u0448 \u043a\u043b\u044e\u0447 (Public SDK key) \u2014 \u043e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/e1c\/d1d\/a1a\/e1cd1da1a9d76c768982864e2576a8b9.jpeg\" width=\"2048\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e1c\/d1d\/a1a\/e1cd1da1a9d76c768982864e2576a8b9.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0432 Adapty\u00a0 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b. \u0423 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0444\u043e\u0442\u043e \u043a\u043e\u0442\u043e\u0432, \u043d\u043e \u043d\u0430 \u043c\u0435\u0441\u044f\u0446, \u043f\u043e\u043b\u0433\u043e\u0434\u0430, \u0433\u043e\u0434. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 \u0432 Adapty.\u00a0<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0418\u0434\u0435\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Products &amp; A\/B Tests \u2192 Products, \u043a\u043b\u0438\u043a\u0430\u0435\u043c Create product.\u00a0<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u2014 \u0442\u043e, \u043a\u0430\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Adapty.\u00a0<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c App Store Product ID \u0438 Play Store Product ID. \u041f\u0435\u0440\u0438\u043e\u0434 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0439. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/78c\/883\/6d2\/78c8836d2353de0a50939981365f4caf.png\" width=\"2048\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/78c\/883\/6d2\/78c8836d2353de0a50939981365f4caf.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b \u2014 \u044d\u043a\u0440\u0430\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043a\u0443\u043f\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443. \u0412 \u043f\u0435\u0439\u0432\u043e\u043b\u043b \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 Products &amp; A\/B Tests \u2192 Paywalls \u043a\u043b\u0438\u043a\u0430\u0435\u043c Create paywall.\u00a0<\/p>\n<ul>\n<li>\n<p>\u0412 Paywall name \u0432\u043d\u043e\u0441\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430. \u0412\u0430\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u0430\u043a\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0438 \u0432\u044b, \u0438 \u0432\u0430\u0448\u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043c\u043e\u0433\u043b\u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u0435\u0439\u0432\u043e\u043b\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0412 Paywall ID \u044f \u043d\u0430\u043f\u0438\u0448\u0443 cats_paywall \u2014 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 ID \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u043c\u0435\u043d\u044e Product \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/523\/876\/ec8\/523876ec8e7cd4d98e0a57bd5a1a781f.png\" width=\"2048\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/523\/876\/ec8\/523876ec8e7cd4d98e0a57bd5a1a781f.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u0434\u0438\u0442\u044c.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 react-native-adapty<\/h3>\n<p>1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"bash\">yarn add react-native-adapty<\/code><\/pre>\n<p>2. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u044b \u0434\u043b\u044f iOS. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 CLI <code>pod<\/code>, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e <a href=\"https:\/\/cocoapods.org\/\"><u>\u0441\u043a\u0430\u0447\u0430\u0442\u044c<\/u><\/a>. \u041e\u043d\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437 \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0432 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435.<\/p>\n<pre><code class=\"bash\"># \u043f\u043e\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 iOS \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u043f\u0430\u043f\u043a\u0430 \/ios pod install --project-directory=ios<\/code><\/pre>\n<p>3. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430 iOS React Native \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Obj-C, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c Swift Bridging Header, \u0447\u0442\u043e\u0431\u044b Obj-C \u043c\u043e\u0433 \u0447\u0438\u0442\u0430\u0442\u044c Swift \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0435\u043c \u0432 Xcode \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043b\u044e\u0431\u043e\u0439 Swift \u0444\u0430\u0439\u043b. Xcode \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c bridging header \u2014 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u043d\u0443\u0436\u043d\u043e. \u0421\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u043c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c3e\/4d6\/9cc\/c3e4d69cc95a909f94df1c11bf0553e3.png\" width=\"2048\" height=\"865\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c3e\/4d6\/9cc\/c3e4d69cc95a909f94df1c11bf0553e3.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eaf\/db2\/1c9\/eafdb21c90bf7934c4f0b2513ddc7f43.png\" width=\"1716\" height=\"1526\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eaf\/db2\/1c9\/eafdb21c90bf7934c4f0b2513ddc7f43.png\"\/><figcaption><\/figcaption><\/figure>\n<p>4. \u0414\u043b\u044f Android \u043d\u0430\u0434\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 (\/android\/build.gradle \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443) \u0441\u0442\u043e\u0438\u0442\u00a0 <code>kotlin-gradle-plugin<\/code> \u0432\u0435\u0440\u0441\u0438\u0438 1.4.0 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"javascript\">... buildscript {    ... dependencies {      ... classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0\"    }  } ...<\/code><\/pre>\n<p>5. \u0414\u043b\u044f Android \u043d\u0430\u0434\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c multiDex, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\/android\/app\/build.gradle \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443):<\/p>\n<pre><code class=\"javascript\">...  android {    ... defaultConfig {      ... multiDexEnabled true    }  }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e <s>\u043e\u0442\u0434\u044b\u0445\u0430\u0442\u044c<\/s> \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043a\u043e\u0434\u0438\u0442\u044c! ?<\/p>\n<h3>\u041a\u043e\u0434\u0438\u043c: \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h3>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c <code>react-native-adapty<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0448\u0442\u0443\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441, \u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0436\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u043b\u043e\u0443. \u0418\u0434\u0435\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0448\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 <code>App.tsx<\/code>) \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f:<\/p>\n<pre><code class=\"javascript\">\/\/ \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 import { activateAdapty } from 'react-native-adapty';  \/\/ \u0423 \u043c\u0435\u043d\u044f \u0432 \u043a\u043e\u0440\u043d\u0435 \u0431\u044b\u043b \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 App const App: React.FC = () => {   ...   \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u043d\u0430 \u043c\u0430\u0443\u043d\u0442\u0435   useEffect(() => {     activateAdapty({ sdkKey: 'MY_PUBLIC_KEY' });   },[]);   ... }<\/code><\/pre>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u043c\u0435\u0441\u0442\u043e <code>MY_PUBLIC_KEY<\/code> \u043f\u0438\u0448\u0435\u043c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 Public SDK \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u0435\u0442\u043e\u0434 <code>activateAdapty()<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430, \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435 Adapty:\u00a0<\/p>\n<pre><code class=\"javascript\">import { adapty } from 'react-native-adapty';  async function getProducts() { const {paywalls, products} = await adapty.paywalls.getPaywalls();  return products; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u043e\u0432 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044e \u0441\u0435\u0431\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u0422\u0430\u043a\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0434\u0443 \u043d\u0430 typescript, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0433\u0434\u0435 \u043a\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0442. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0431\u0443\u0434\u0443 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0441\u0442\u0430\u0440\u0435\u043d\u044c\u043a\u043e\u043c iPhone 8 \u2014 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 iOS 14, App Store \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043a\u0438\u0442\u044b \u043d\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u044b.<\/p>\n<p>1. \u0418\u0442\u0430\u043a, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>App.tsx<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0439\u0432\u043e\u043b\u043b. \u042f \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/wix\/react-native-navigation\">react-native-navigation<\/a>. \u041a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u043e\u043d \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u0447\u0435, \u0447\u0435\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 <code>react-navigation<\/code>.\u00a0<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 App.tsx<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">import React, { useEffect, useState } from \"react\"; import { Button, StyleSheet, View } from \"react-native\"; import { adapty, activateAdapty, AdaptyPaywall } from \"react-native-adapty\";  export const App: React.FC = () => {   const [paywalls, setPaywalls] = useState&lt;AdaptyPaywall[]>([]);    useEffect(() => {     async function fetchPaywalls(): Promise&lt;void> {       await activateAdapty({ sdkKey: \"MY_PUBLIC_KEY\" });        const result = await adapty.paywalls.getPaywalls();       setPaywalls(result.paywalls);     }      fetchPaywalls();   }, []);    return (     &lt;View style={styles.container}>       &lt;Button         title=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\"         onPress={() => {           const paywall = paywalls.find(             (paywall) => paywall.developerId === \"cats_paywall\"           );            if (!paywall) {             return alert(\"\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430!\");           } \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043f\u0435\u0439\u0432\u043e\u043b\u043b...         }}       \/>     &lt;\/View>   ); };  const styles = StyleSheet.create({   container: { flex: 1, alignItems: \"center\", justifyContent: \"center\" }, });<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041f\u0440\u0438 \u043c\u0430\u0443\u043d\u0442\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fetchPaywalls()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 SDK \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u044b \u0432 \u0441\u0442\u0435\u0439\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0442\u0430\u0447\u0435 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0436\u0434\u0430\u0442\u044c \u0444\u0435\u0442\u0447\u0430. \u041d\u0430 \u0432\u044c\u044e \u0443 \u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u044b \u0432 \u0441\u0442\u0435\u0439\u0442, \u0430 \u0444\u0435\u0442\u0447\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u0442\u0443\u0442 \u2014 <code>adapty.paywalls.getPaywalls()<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u0438\u0445 \u0438\u0437 \u043a\u044d\u0448\u0430 (\u0430 \u0437\u0430\u043a\u044d\u0448\u0438\u0442 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f), \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u043c\u0435\u0442\u043e\u0434 \u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0412\u043e\u0442, \u0447\u0442\u043e \u0432\u044b\u0448\u043b\u043e:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee2\/b7d\/7df\/ee2b7d7df8758c7741a0c1f2cf3be2e9.gif\" width=\"320\" height=\"551\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee2\/b7d\/7df\/ee2b7d7df8758c7741a0c1f2cf3be2e9.gif\"\/><figcaption><\/figcaption><\/figure>\n<p>2. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0444\u0430\u0439\u043b\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ \u0442\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 import React, { useEffect, useState } from \"react\"; import {   Button,   SafeAreaView,   StyleSheet,   Text,   View,   PlatformColor, } from \"react-native\"; import {   adapty,   activateAdapty,   AdaptyPaywall,   AdaptyProduct, } from \"react-native-adapty\"; import { Navigation } from \"react-native-navigation\";  \/\/ ...  interface PaywallProps {   paywall: AdaptyPaywall;   onRequestBuy: (product: AdaptyProduct) => void | Promise&lt;void>; } export const Paywall: React.FC&lt;PaywallProps> = ({ paywall, onRequestBuy }) => {   const [isLoading, setIsLoading] = useState&lt;boolean>(false);    return (     &lt;SafeAreaView style={styles.container}>       {paywall.products.map((product) => (         &lt;View key={product.vendorProductId}>           &lt;Text>{product.localizedTitle}&lt;\/Text>           &lt;Button             title={`\u041a\u0443\u043f\u0438\u0442\u044c \u0437\u0430 ${product.localizedPrice}`}             disabled={isLoading}             onPress={async () => {               try {                 setIsLoading(true);                 await onRequestBuy(product);               } catch (error) {                 alert(\"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 :(\");               } finally {                 setIsLoading(false);               }             }}           \/>         &lt;\/View>       ))}     &lt;\/SafeAreaView>   ); };  \/\/ \u0422\u043e\u0436\u0435 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 const styles = StyleSheet.create({   container: { flex: 1, alignItems: \"center\", justifyContent: \"center\" },   paywallContainer: {     flex: 1,     alignItems: \"center\",     justifyContent: \"space-evenly\",     backgroundColor: PlatformColor(\"secondarySystemBackground\"),   }, });<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u043f\u0438\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438\u0437 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430 \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u043a\u0443\u043f\u043a\u0438.\u00a0<\/p>\n<p>3. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u044d\u043a\u0440\u0430\u043d \u0432 <code>react-native-navigation<\/code>. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433. \u041c\u043e\u0439 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 <code>index.js<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 index.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">import \"react-native-gesture-handler\"; import { Navigation } from \"react-native-navigation\";  import { App, Paywall } from \".\/App\";  Navigation.registerComponent(\"Home\", () => App); Navigation.registerComponent(\"Paywall\", () => Paywall);  Navigation.events().registerAppLaunchedListener(() => {   Navigation.setRoot({     root: { stack: { children: [{ component: { name: \"Home\" } }] } },   }); });<\/code><\/pre>\n<\/div>\n<\/details>\n<p>4. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0442\u0430\u043f \u043a\u043d\u043e\u043f\u043a\u0438 &#171;\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b&#187;; \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>Navigation<\/code>:<\/p>\n<pre><code class=\"javascript\">Navigation.showModal&lt;PaywallProps>({     component: {       name: \"Paywall\",       passProps: {         paywall,         onRequestBuy: async (product) => {           const purchase = await adapty.purchases.makePurchase(product);           \/\/ \u0414\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e...           console.log(\"purchase\", purchase);         },       },     },   });<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0412\u0435\u0441\u044c \u0444\u0430\u0439\u043b App.tsx<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">import React, { useEffect, useState } from \"react\"; import {   Button,   SafeAreaView,   StyleSheet,   Text,   View,   PlatformColor, } from \"react-native\"; import {   adapty,   activateAdapty,   AdaptyPaywall,   AdaptyProduct, } from \"react-native-adapty\"; import { Navigation } from \"react-native-navigation\"; export const App: React.FC = () => {   const [paywalls, setPaywalls] = useState&lt;AdaptyPaywall[]>([]);   useEffect(() => {     async function fetchPaywalls(): Promise&lt;void> {       await activateAdapty({         sdkKey: \"MY_PUBLIC_KEY\",       });        const result = await adapty.paywalls.getPaywalls();       setPaywalls(result.paywalls);     }      fetchPaywalls();   }, []);    return (     &lt;View style={styles.container}>       &lt;Button         title=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\"         onPress={() => {           const paywall = paywalls.find(             (paywall) => paywall.developerId === \"cats_paywall\"           );            if (!paywall) {             return alert(\"\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430!\");           }            Navigation.showModal&lt;PaywallProps>({             component: {               name: \"Paywall\",               passProps: {                 paywall,                 onRequestBuy: async (product) => {                   const purchase = await adapty.purchases.makePurchase(product);                   \/\/ \u0414\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e                   console.log(\"purchase\", purchase);                 },               },             },           });         }}       \/>     &lt;\/View>   ); };  interface PaywallProps {   paywall: AdaptyPaywall;   onRequestBuy: (product: AdaptyProduct) => void | Promise&lt;void>; } export const Paywall: React.FC&lt;PaywallProps> = ({ paywall, onRequestBuy }) => {   const [isLoading, setIsLoading] = useState&lt;boolean>(false);    return (     &lt;SafeAreaView style={styles.paywallContainer}>       {paywall.products.map((product) => (         &lt;View key={product.vendorProductId}>           &lt;Text>{product.localizedTitle}&lt;\/Text>           &lt;Button             title={`\u041a\u0443\u043f\u0438\u0442\u044c \u0437\u0430 ${product.localizedPrice}`}             disabled={isLoading}             onPress={async () => {               try {                 setIsLoading(true);                 await onRequestBuy(product);               } catch (error) {                 alert(\"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 :(\");               } finally {                 setIsLoading(false);               }             }}           \/>         &lt;\/View>       ))}     &lt;\/SafeAreaView>   ); };  const styles = StyleSheet.create({   container: { flex: 1, alignItems: \"center\", justifyContent: \"center\" },   paywallContainer: {     flex: 1,     alignItems: \"center\",     justifyContent: \"space-evenly\",     backgroundColor: PlatformColor(\"secondarySystemBackground\"),   }, });<\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4d0\/589\/c45\/4d0589c45f6a667c27236a09b80af742.gif\" width=\"319\" height=\"551\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4d0\/589\/c45\/4d0589c45f6a667c27236a09b80af742.gif\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435! \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u044b \u044e\u0437\u0435\u0440\u0430\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u043d\u0430 iOS \u0441\u044d\u043d\u0434\u0431\u043e\u043a\u0441\u0435, \u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/help.apple.com\/app-store-connect\/#\/dev8b997bee1\"><u>\u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0441\u044d\u043d\u0434\u0431\u043e\u043a\u0441-\u0442\u0435\u0441\u0442\u0435\u0440 \u0430\u043a\u043a\u0430\u0443\u043d\u0442<\/u><\/a>. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u044d\u043d\u0434\u0431\u043e\u043a\u0441-\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u0438 \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435; \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u044b.<\/p>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044e\u0437\u0435\u0440\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0435\u0433\u043e \u043f\u0440\u0435\u043c\u0438\u0443\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442. \u0417\u0434\u0435\u0441\u044c Adapty \u043d\u0430\u043c \u0442\u043e\u0436\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u2014 \u043e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043a\u0443\u043f\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a: \u0435\u0441\u043b\u0438 \u0443 \u044e\u0437\u0435\u0440\u0430 \u043d\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438, \u0442\u043e \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u0435\u0441\u0442\u044c, \u0442\u043e \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0442\u0430.<\/p>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u044d\u0448\u0430 \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0434\u0435\u0440. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0435\u0439\u0442\u044b <code>isLoading<\/code> \u0438 <code>isPremium<\/code>:<\/p>\n<pre><code class=\"javascript\">\/\/ ... export const App: React.FC = () => { const [isLoading, setIsLoading] = useState&lt;boolean>(true); const [isPremium, setIsPremium] = useState&lt;boolean>(false);   const [paywalls, setPaywalls] = useState&lt;AdaptyPaywall[]>([]);  useEffect(() => {     async function fetchPaywalls(): Promise&lt;void> {       try {         await activateAdapty({           sdkKey: \"MY_PUBLIC_KEY\",         });          const profile = await adapty.purchases.getInfo();         const isSubscribed = profile.accessLevels.premium.isActive;         setIsPremium(isSubscribed);          if (!isSubscribed) {           const result = await adapty.paywalls.getPaywalls();           setPaywalls(result.paywalls);         }       } finally {         setIsLoading(false);       }     }      fetchPaywalls();   }, []);    \/\/ ... } \/\/ ...<\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c: \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0434\u0432\u0430 \u0444\u043b\u0430\u0433\u0430 \u0432 \u0441\u0442\u0435\u0439\u0442\u0435. \u0412\u0441\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>fetchPaywalls()<\/code> \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0432 <code>try-catch<\/code>, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0434 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0434\u043e\u0445\u043e\u0434\u0438\u043b \u0434\u043e <code>setIsLoading(false)<\/code> \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438. \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u044e\u0437\u0435\u0440\u0430 (\u0442\u0430\u043c \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0435\u0433\u043e \u043f\u043e\u043a\u0443\u043f\u043a\u0430\u0445), \u0438 \u0434\u0430\u043b\u0435\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>profile.accessLevels.premium.isActive<\/code>. <code>accessLevels<\/code> \u2014 \u044d\u0442\u043e \u0443\u0440\u043e\u0432\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Gold, Premium \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e,\u00a0 \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443. \u0410\u0434\u0430\u043f\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0441 premium, \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043b\u044e\u0434\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0438\u0442. <code>isActive<\/code> \u0431\u0443\u0434\u0435\u0442 <code>true<\/code>, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c access level.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0435\u0441\u043b\u0438 \u0443 \u044e\u0437\u0435\u0440\u0430 \u043f\u0440\u0435\u043c\u0438\u0443\u043c, \u0442\u043e \u043d\u0430\u043c \u0438 \u043d\u0435 \u043d\u0430\u0434\u043e \u0444\u0435\u0442\u0447\u0438\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0440\u0443\u0431\u0430\u0435\u043c \u043b\u043e\u0434\u0435\u0440 \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442:<\/p>\n<pre><code class=\"javascript\">export const App: React.FC = () => { \/\/ ... const renderContent = (): React.ReactNode => {   if (isLoading) {     return &lt;Text>Loading...&lt;\/Text>;   }    if (isPremium) {     return (       &lt;Image         source={{           uri: \"https:\/\/25.media.tumblr.com\/tumblr_lugj06ZSgX1r4xjo2o1_500.gif\",           width: Dimensions.get(\"window\").width * 0.8,           height: Dimensions.get(\"window\").height * 0.8,         }}       \/>     );   }    return (     &lt;Button       title=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\"       onPress={() => {         const paywall = paywalls.find(           (paywall) => paywall.developerId === \"cats_paywall\"         );          if (!paywall) {           return alert(\"\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430!\");         }          Navigation.showModal&lt;PaywallProps>({           component: {             name: \"Paywall\",             passProps: {             paywall,           onRequestBuy: async (product) => {             const purchase = await adapty.purchases.makePurchase(product);               const isSubscribed =               purchase.purchaserInfo.accessLevels?.premium.isActive;                 setIsPremium(isSubscribed);                 Navigation.dismissAllModals();               },             },           },         });       }}     \/>   ); };  return &lt;View style={styles.container}>{renderContent()}&lt;\/View>; };<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 <code>onRequestBuy<\/code> \u043a\u0443\u0441\u043e\u043a \u043b\u043e\u0433\u0438\u043a\u0438 \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u0439\u0442\u0430 <code>isPremium<\/code> \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u044b\u0448\u043b\u043e:\u00a0<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/406\/194\/199\/406194199359f5f1b62c234c94e2a734.gif\" width=\"319\" height=\"549\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/406\/194\/199\/406194199359f5f1b62c234c94e2a734.gif\"\/><figcaption><\/figcaption><\/figure>\n<details class=\"spoiler\">\n<summary>\u0412\u0435\u0441\u044c \u0444\u0430\u0439\u043b <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">import React, { useEffect, useState } from \"react\"; import {   Button,   SafeAreaView,   StyleSheet,   Text,   View,   PlatformColor,   Image,   Dimensions, } from \"react-native\"; import {   adapty,   activateAdapty,   AdaptyPaywall,   AdaptyProduct, } from \"react-native-adapty\"; import { Navigation } from \"react-native-navigation\";  export const App: React.FC = () => {   const [isLoading, setIsLoading] = useState&lt;boolean>(true);   const [isPremium, setIsPremium] = useState&lt;boolean>(false);   const [paywalls, setPaywalls] = useState&lt;AdaptyPaywall[]>([]);    useEffect(() => {     async function fetchPaywalls(): Promise&lt;void> {       try {         await activateAdapty({           sdkKey: \"MY_PUBLIC_KEY\",         });          const profile = await adapty.purchases.getInfo();         const isSubscribed = profile.accessLevels.premium.isActive;         setIsPremium(isSubscribed);          if (!isSubscribed) {           const result = await adapty.paywalls.getPaywalls();           setPaywalls(result.paywalls);         }       } finally {         setIsLoading(false);       }     }      fetchPaywalls();   }, []);    const renderContent = (): React.ReactNode => {     if (isLoading) {       return &lt;Text>Loading...&lt;\/Text>;     }      if (isPremium) {       return (         &lt;Image           source={{             uri: \"https:\/\/25.media.tumblr.com\/tumblr_lugj06ZSgX1r4xjo2o1_500.gif\",             width: Dimensions.get(\"window\").width * 0.8,             height: Dimensions.get(\"window\").height * 0.8,           }}         \/>       );     }      return (       &lt;Button         title=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\"         onPress={() => {           const paywall = paywalls.find(             (paywall) => paywall.developerId === \"cats_paywall\"           );            if (!paywall) {             return alert(\"\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430!\");           }            Navigation.showModal&lt;PaywallProps>({             component: {               name: \"Paywall\",               passProps: {                 paywall,                 onRequestBuy: async (product) => {                   const purchase = await adapty.purchases.makePurchase(product);                   const isSubscribed =                     purchase.purchaserInfo.accessLevels?.premium.isActive;                   setIsPremium(isSubscribed);                   Navigation.dismissAllModals();                 },               },             },           });         }}       \/>     );   };    return &lt;View style={styles.container}>{renderContent()}&lt;\/View>; }; interface PaywallProps {   paywall: AdaptyPaywall;   onRequestBuy: (product: AdaptyProduct) => void | Promise&lt;void>; } export const Paywall: React.FC&lt;PaywallProps> = ({ paywall, onRequestBuy }) => {   const [isLoading, setIsLoading] = useState&lt;boolean>(false);    return (     &lt;SafeAreaView style={styles.paywallContainer}>       {paywall.products.map((product) => (         &lt;View key={product.vendorProductId}>           &lt;Text>{product.localizedTitle}&lt;\/Text>           &lt;Button             title={`\u041a\u0443\u043f\u0438\u0442\u044c \u0437\u0430 ${product.localizedPrice}`}             disabled={isLoading}             onPress={async () => {               try {                 setIsLoading(true);                 await onRequestBuy(product);               } catch (error) {                 alert(\"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 :(\");               } finally {                 setIsLoading(false);               }             }}           \/>         &lt;\/View>       ))}     &lt;\/SafeAreaView>   ); };  const styles = StyleSheet.create({   container: { flex: 1, alignItems: \"center\", justifyContent: \"center\" },   paywallContainer: {     flex: 1,     alignItems: \"center\",     justifyContent: \"space-evenly\",     backgroundColor: PlatformColor(\"secondarySystemBackground\"),   }, });<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435<\/h3>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0443 \u043d\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <s>\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435<\/s> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430\u043c\u0438. \u0422\u0435, \u043a\u0442\u043e \u043f\u043b\u0430\u0442\u044f\u0442, \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u0442\u043e\u0432, \u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0439\u0432\u043e\u043b\u043b. \u042d\u0442\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0445\u0432\u0430\u0442\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0410 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0442\u043e\u0440\u043a\u0438\u0442\u043e\u0432 \u0447\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442. \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<h2>\u041f\u0440\u043e Adapty<\/h2>\n<p>Adapty \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a:<\/p>\n<ul>\n<li>\n<p>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u043e\u0440\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441,\u00a0<a href=\"https:\/\/habr.com\/ru\/company\/adapty\/blog\/564748\/\"><u>\u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0430<\/u><\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/adapty.io\/paywalls-ab-testing\">\u0410\/\u0411 \u0442\u0435\u0441\u0442\u044b<\/a>\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0432\u044b\u0440\u0443\u0447\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0430\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/adapty.io\/return-subscribers?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=blogpost_android-iap_server-validation\">\u041f\u0440\u043e\u043c\u043e \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438<\/a>\u00a0\u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0442 \u043e\u0442\u0442\u043e\u043a \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>Open source SDK \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0438 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/adapty.io\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=blogpost_android-iap_server-validation\"><u>\u041f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438<\/u><\/a>, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0432 \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/576850\/\"> https:\/\/habr.com\/ru\/articles\/576850\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u044f \u0412\u0430\u043d\u044f \u2014 \u0444\u0443\u043b\u0441\u0442\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 <a href=\"https:\/\/adapty.io?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=blogpost_react-native-iap_configuration-and-retrieveing_products\">Adapty<\/a>. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 in-app \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 React Native.<\/p>\n<p>\u041a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u044e\u0430\u043d\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 React Native \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u043e\u043a\u0443\u043f\u043e\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043c\u0438\u043d\u0443\u0435\u043c\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 React Native \u2014 \u044d\u0442\u043e <a href=\"https:\/\/github.com\/dooboolab\/react-native-iap\"><u>react-native-iap<\/u><\/a>, <a href=\"https:\/\/docs.expo.dev\/versions\/latest\/sdk\/in-app-purchases\/\"><u>expo-in-app-purchases<\/u><\/a>. \u0410 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u044f \u043f\u0440\u043e <a href=\"https:\/\/github.com\/adaptyteam\/AdaptySDK-React-Native\"><u>react-native-adapty<\/u><\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n<ul>\n<li>\n<p>\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p>\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0444\u0438\u0447\u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432 \u043e\u0442 <a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/original_api_for_in-app_purchase\/subscriptions_and_offers\/implementing_promotional_offers_in_your_app\"><u>\u043f\u0440\u043e\u043c\u043e-\u043e\u0444\u0444\u0435\u0440\u043e\u0432<\/u><\/a> \u0434\u043e <a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/original_api_for_in-app_purchase\/subscriptions_and_offers\/implementing_introductory_offers_in_your_app\"><u>\u043e\u043f\u043b\u0430\u0442\u044b \u043d\u0430\u043f\u0435\u0440\u0451\u0434<\/u><\/a>, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0439 \u0431\u044b\u0441\u0442\u0440\u043e;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0449\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437-\u0446\u0438\u043a\u043b\u0430: \u043d\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0435\u0442\u044b \u0438 \u0436\u0434\u0430\u0442\u044c \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Adapty SDK \u0434\u0430\u0451\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u043e\u043d\u0443\u0441\u043e\u0432: \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c, \u043a\u043e\u0433\u043e\u0440\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a, A\/B \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u043e\u0432, \u043f\u0440\u043e\u043c\u043e-\u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e \u0433\u0438\u0431\u043a\u0438\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 in-app purchases \u043d\u0430 React Native. \u0412\u043e\u0442 \u0447\u0442\u043e \u043d\u0430\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Expo \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f in-app purchases \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 React Native.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u2014 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Adapty:<br \/>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f App Store<br \/>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Play Store<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <code>react-native-adapty<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043a\u043e\u0442\u043e\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u044e\u0437\u0435\u0440\u0430\u043c, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u2014 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Expo \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f in-app purchases \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 React Native<\/h3>\n<p>> TL;DR \u2014 <a href=\"https:\/\/docs.expo.dev\/introduction\/managed-vs-bare\/\"><u>Expo managed<\/u><\/a> \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043a\u0443\u043f\u043a\u0430\u043c\u0438 (\u0441\u0442\u043e\u0440\u043a\u0438\u0442\u043e\u0432). \u041d\u0443\u0436\u0435\u043d \u043b\u0438\u0431\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0447\u0438\u0441\u0442\u044b\u0439 RN, \u043b\u0438\u0431\u043e Expo bare workflow.<\/p>\n<p>\u0422\u0435\u0445, \u043a\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Expo, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043e\u043d \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f. Expo \u2014 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f React Native, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a\/\u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0438\u0445 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 workflow \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. Expo \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u0432\u043e\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 (\u0442\u043e\u043b\u044c\u043a\u043e js), \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043a\u0438\u0442\u043e\u0432. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 js \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0434\u043e <a href=\"https:\/\/docs.expo.dev\/expokit\/eject\/\"><u>\u044d\u0434\u0436\u0435\u043a\u0442\u0438\u0442\u044c\u0441\u044f<\/u><\/a>.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0438 \u0434\u043b\u044f iOS, \u0438 \u0434\u043b\u044f Android. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0437\u0430\u0439\u043c\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 20 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0432 App Store Connect \u0438\/\u0438\u043b\u0438 Google Play Console, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/adapty\/blog\/507664\/\"><u>\u0414\u043b\u044f iOS<\/u><\/a> \u2014 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u00ab\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 SKProduct\u00bb \u2014 \u0442\u0430\u043c \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/adapty\/blog\/568902\/\"><u>\u0414\u043b\u044f Android<\/u><\/a> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u043e \u00ab\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438\u00bb.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Adapty<\/h3>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>react-native-adapty<\/code> \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434 Adapty. \u042d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0437\u0430\u0442\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u043e\u043c, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430.\u00a0<\/p>\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f App Store \u0438 Google Play:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 iOS \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0443\u043a\u0430\u0437\u0430\u0442\u044c Bundle ID;<\/p>\n<\/li>\n<li>\n<p>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c App Store Server Notifications;<\/p>\n<\/li>\n<li>\n<p>App Store Connect shared secret.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438.<\/p>\n<p>\u041a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u0435\u0441\u0442\u044c Read how \u2014 \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0435 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u044b, \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0442\u0443\u0434\u0430.\u00a0<\/p>\n<p>Bundle ID \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ID \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 Xcode \u0432 Targets > [App Name] > General:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f Android \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b Package Name \u0438 Service Account Key File.\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 Read how. <code>Package name<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <code>Bundle ID<\/code> \u0441 iOS. \u041d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043a\u043e\u0434\u0435. \u041d\u0430\u0439\u0442\u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>\/android\/app\/build.gradle<\/code> \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <code>android.defaultConfig.applicationId<\/code>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Adapty SDK \u0432 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0438\u0434\u0435\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u0448 \u043a\u043b\u044e\u0447 (Public SDK key) \u2014 \u043e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435: <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0432 Adapty\u00a0 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b. \u0423 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0444\u043e\u0442\u043e \u043a\u043e\u0442\u043e\u0432, \u043d\u043e \u043d\u0430 \u043c\u0435\u0441\u044f\u0446, \u043f\u043e\u043b\u0433\u043e\u0434\u0430, \u0433\u043e\u0434. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 \u0432 Adapty.\u00a0<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0418\u0434\u0435\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Products &amp; A\/B Tests \u2192 Products, \u043a\u043b\u0438\u043a\u0430\u0435\u043c Create product.\u00a0<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u2014 \u0442\u043e, \u043a\u0430\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Adapty.\u00a0<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c App Store Product ID \u0438 Play Store Product ID. \u041f\u0435\u0440\u0438\u043e\u0434 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0439. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b \u2014 \u044d\u043a\u0440\u0430\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043a\u0443\u043f\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443. \u0412 \u043f\u0435\u0439\u0432\u043e\u043b\u043b \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 Products &amp; A\/B Tests \u2192 Paywalls \u043a\u043b\u0438\u043a\u0430\u0435\u043c Create paywall.\u00a0<\/p>\n<ul>\n<li>\n<p>\u0412 Paywall name \u0432\u043d\u043e\u0441\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430. \u0412\u0430\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u0430\u043a\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0438 \u0432\u044b, \u0438 \u0432\u0430\u0448\u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043c\u043e\u0433\u043b\u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u0435\u0439\u0432\u043e\u043b\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0412 Paywall ID \u044f \u043d\u0430\u043f\u0438\u0448\u0443 cats_paywall \u2014 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 ID \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u043c\u0435\u043d\u044e Product \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u0434\u0438\u0442\u044c.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 react-native-adapty<\/h3>\n<p>1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"bash\">yarn add react-native-adapty<\/code><\/pre>\n<p>2. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u044b \u0434\u043b\u044f iOS. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 CLI <code>pod<\/code>, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e <a href=\"https:\/\/cocoapods.org\/\"><u>\u0441\u043a\u0430\u0447\u0430\u0442\u044c<\/u><\/a>. \u041e\u043d\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437 \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0432 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435.<\/p>\n<pre><code class=\"bash\"># \u043f\u043e\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 iOS \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u043f\u0430\u043f\u043a\u0430 \/ios pod install --project-directory=ios<\/code><\/pre>\n<p>3. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430 iOS React Native \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Obj-C, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c Swift Bridging Header, \u0447\u0442\u043e\u0431\u044b Obj-C \u043c\u043e\u0433 \u0447\u0438\u0442\u0430\u0442\u044c Swift \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0435\u043c \u0432 Xcode \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043b\u044e\u0431\u043e\u0439 Swift \u0444\u0430\u0439\u043b. Xcode \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c bridging header \u2014 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u043d\u0443\u0436\u043d\u043e. \u0421\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u043c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>4. \u0414\u043b\u044f Android \u043d\u0430\u0434\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 (\/android\/build.gradle \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443) \u0441\u0442\u043e\u0438\u0442\u00a0 <code>kotlin-gradle-plugin<\/code> \u0432\u0435\u0440\u0441\u0438\u0438 1.4.0 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"javascript\">... buildscript {    ... dependencies {      ... classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0\"    }  } ...<\/code><\/pre>\n<p>5. \u0414\u043b\u044f Android \u043d\u0430\u0434\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c multiDex, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\/android\/app\/build.gradle \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443):<\/p>\n<pre><code class=\"javascript\">...  android {    ... defaultConfig {      ... multiDexEnabled true    }  }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e <s>\u043e\u0442\u0434\u044b\u0445\u0430\u0442\u044c<\/s> \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043a\u043e\u0434\u0438\u0442\u044c! ?<\/p>\n<h3>\u041a\u043e\u0434\u0438\u043c: \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h3>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c <code>react-native-adapty<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0448\u0442\u0443\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441, \u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0436\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u043b\u043e\u0443. \u0418\u0434\u0435\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0448\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 <code>App.tsx<\/code>) \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f:<\/p>\n<pre><code class=\"javascript\">\/\/ \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 import { activateAdapty } from 'react-native-adapty';  \/\/ \u0423 \u043c\u0435\u043d\u044f \u0432 \u043a\u043e\u0440\u043d\u0435 \u0431\u044b\u043b \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 App const App: React.FC = () => {   ...   \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u043d\u0430 \u043c\u0430\u0443\u043d\u0442\u0435   useEffect(() => {     activateAdapty({ sdkKey: 'MY_PUBLIC_KEY' });   },[]);   ... }<\/code><\/pre>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u043c\u0435\u0441\u0442\u043e <code>MY_PUBLIC_KEY<\/code> \u043f\u0438\u0448\u0435\u043c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 Public SDK \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u0435\u0442\u043e\u0434 <code>activateAdapty()<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430, \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435 Adapty:\u00a0<\/p>\n<pre><code class=\"javascript\">import { adapty } from 'react-native-adapty';  async function getProducts() { const {paywalls, products} = await adapty.paywalls.getPaywalls();  return products; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u043e\u0432 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044e \u0441\u0435\u0431\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u0422\u0430\u043a\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0434\u0443 \u043d\u0430 typescript, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0433\u0434\u0435 \u043a\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0442. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0431\u0443\u0434\u0443 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0441\u0442\u0430\u0440\u0435\u043d\u044c\u043a\u043e\u043c iPhone 8 \u2014 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 iOS 14, App Store \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043a\u0438\u0442\u044b \u043d\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u044b.<\/p>\n<p>1. \u0418\u0442\u0430\u043a, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>App.tsx<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0439\u0432\u043e\u043b\u043b. \u042f \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/wix\/react-native-navigation\">react-native-navigation<\/a>. \u041a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u043e\u043d \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u0447\u0435, \u0447\u0435\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 <code>react-navigation<\/code>.\u00a0<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 App.tsx<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">import React, { useEffect, useState } from \"react\"; import { Button, StyleSheet, View } from \"react-native\"; import { adapty, activateAdapty, AdaptyPaywall } from \"react-native-adapty\";  export const App: React.FC = () => {   const [paywalls, setPaywalls] = useState&lt;AdaptyPaywall[]>([]);    useEffect(() => {     async function fetchPaywalls(): Promise&lt;void> {       await activateAdapty({ sdkKey: \"MY_PUBLIC_KEY\" });        const result = await adapty.paywalls.getPaywalls();       setPaywalls(result.paywalls);     }      fetchPaywalls();   }, []);    return (     &lt;View style={styles.container}>       &lt;Button         title=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0439\u0432\u043e\u043b\u043b\"         onPress={() => {           const paywall = paywalls.find(             (paywall) => paywall.developerId === \"cats_paywall\"           );            if (!paywall) {             return alert(\"\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0430!\");           } \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043f\u0435\u0439\u0432\u043e\u043b\u043b...         }}       \/>     &lt;\/View>   ); };  const styles = StyleSheet.create({   container: { flex: 1, alignItems: \"center\", justifyContent: \"center\" }, });<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041f\u0440\u0438 \u043c\u0430\u0443\u043d\u0442\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fetchPaywalls()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 SDK \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u044b \u0432 \u0441\u0442\u0435\u0439\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0442\u0430\u0447\u0435 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0436\u0434\u0430\u0442\u044c \u0444\u0435\u0442\u0447\u0430. \u041d\u0430 \u0432\u044c\u044e \u0443 \u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u0435\u0439\u0432\u043e\u043b\u043b\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0435<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-395697","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/395697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=395697"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/395697\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=395697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=395697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=395697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}