Expo InAppPurchases ConnectAsync возвращает неопределенный результат

#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. уже добавлено разрешение, но все еще сталкивается с той же проблемой.