Expo InAppPurchases connectAsync returns 未定义

Expo InAppPurchases connectAsync returns undefined

我在尝试使用 Expo 让 InAppPurchases 在我的 React Native 应用程序中工作时遇到问题。 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 入口点文件中。 connect_res 总是 returns undefined 所以我认为这就是我无法让任何代码工作的原因。

就在 connectAsync() 下面,我有以下内容。这个也没有 return 任何东西:

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() 会 return 类似于结果应有的格式。但它没有 return 我创建的任何订阅(我复制了该列中列出的产品 ID 值,并将其提供给 getProductsAsyncpurchaseItemAsync。我还提供了 url 版本,基本上只有前缀 sku-:

我还为我在 Google 播放中使用的电子邮件启用了许可测试:

请注意,我正在将 .aab 文件上传到 Google 在内部测试轨道上播放,然后我使用这种 URL 格式安装它:https://play.google.com/apps/test/com.myname.appname/versionNumber

但是当我打开 link 时,似乎 google play 将其检测为旧版本,尽管它是最新版本。我所做的更改显示出来了,所以我很确定这是正确的安装 URL.

我还能缺少什么?

对于遇到同样问题的人。您所要做的就是将此添加到您的 android/app/src/main/AndroidManifest.xml 文件中:

<uses-permission android:name="com.android.vending.BILLING" />

post 时文档中并未提及它,并且在您安装模块时不会自动添加它。如果您假设所有 Expo 模块都是如此,可能会帮助您省去头痛。