#android #react-native #in-app-purchase #expo
#Android #реагирует на родной #покупка в приложении #expo
Вопрос:
У меня возникли проблемы при попытке заставить InAppPurchases работать в моем приложении React Native с использованием Expo. https://docs.expo.io/versions/latest/sdk/in-app-purchases
Это простое приложение для рабочего процесса, которое я извлек из стандартного приложения Expo.
Я убедился, что внимательно следил за приведенными здесь инструкциями по установке: https://docs.expo.io/bare/installing-unimodules /
Я проверил, правильно ли установлены unimodules:
import { Constants } from "react-native-unimodules";
useEffect(() => {
alert("installed: " JSON.stringify(Constants.systemFonts));
}, []);
Приведенный выше код сработал.
Я использую react-native-unimodules
версию 0.11.0
.
Вот мой код:
useEffect(() => {
(async function init() {
try {
const connect_res = await connectAsync();
alert("connect: " JSON.stringify(connect_res));
} catch (err) {
alert("general error for connect async: " err);
}
})();
}, []);
Это находится в файле App.js
entrypoint. Он всегда возвращается undefined
для connect_res
, поэтому я предполагаю, что это причина, по которой я не смог заставить какой-либо код работать.
Чуть ниже connectAsync()
у меня есть следующее. Этот также ничего не возвращает:
setPurchaseListener(({ responseCode, results, errorCode }) => {
if (responseCode === IAPResponseCode.OK) {
results.forEach((purchase) => {
if (!purchase.acknowledged) {
alert("purchase successful!");
finishTransactionAsync(purchase, true);
}
});
}
if (responseCode === IAPResponseCode.USER_CANCELED) {
alert("user cancelld!");
} else if (responseCode === IAPResponseCode.DEFERRED) {
alert("user does not have permission to buy");
} else {
alert("something went wrong: " errorCode);
}
});
Затем на моем экране оплаты у меня есть следующее:
import { getProductsAsync, purchaseItemAsync } from "expo-in-app-purchases";
Это код для кнопки оплаты:
const makePayment = async () => {
alert("now making payment...");
try {
const items = Platform.select({
ios: ["abc"],
android: ["my-sub-id", "sku-my-sub-id"],
});
alert("items: " JSON.stringify(items));
const products = await getProductsAsync(items);
alert("products: " JSON.stringify(products));
if (products.results.length > 0) {
alert("found products!");
await purchaseItemAsync("my-sub-id");
alert("done making payment!");
} else {
alert("no products..");
}
} catch (err) {
alert("error occured while trying to purchase: " err);
}
};
В этом случае getProductsAsync()
возвращает что-то похожее на формат, в котором должны быть результаты. Но он не возвращает ни одну из созданных мной подписок (я скопировал значение идентификатора продукта, указанное в этом столбце, и я предоставил его обоим getProductsAsync
и purchaseItemAsync
. Я также предоставил версию url, которая в основном имеет только префикс sku-
:
Я также включил тестирование лицензирования для электронной почты, которую я использую в Google Play:
Обратите внимание, что я загружаю .aab
файл в Google Play на внутренней тестовой дорожке, а затем устанавливаю его, используя этот формат URL: https://play.google.com/apps/test/com.myname.appname/versionNumber
Но когда я открываю эту ссылку, кажется, что Google Play обнаруживает ее как старую версию, хотя она самая последняя. Однако внесенные мной изменения отображаются, так что я почти уверен, что это правильный URL-адрес установки.
Что еще я мог упустить?
Комментарии:
1. Верн, ты решил эту проблему? я сталкиваюсь с такой же проблемой в Android
Ответ №1:
Для тех, у кого такая же проблема. все, что вам нужно сделать, это добавить это в свой android/app/src/main/AndroidManifest.xml
файл:
<uses-permission android:name="com.android.vending.BILLING" />
Это не упоминалось в документах на момент написания этого сообщения, и оно не добавляется автоматически при установке модуля. Может помочь избавить вас от головной боли, если вы предполагаете, что то же самое верно для всех модулей Expo.
Комментарии:
1. я сталкиваюсь с той же проблемой в ios. что мне делать? любая помощь?
2. уже добавлено разрешение, но все еще сталкивается с той же проблемой.