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 值,并将其提供给 getProductsAsync
和 purchaseItemAsync
。我还提供了 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 模块都是如此,可能会帮助您省去头痛。
我在尝试使用 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 值,并将其提供给 getProductsAsync
和 purchaseItemAsync
。我还提供了 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 模块都是如此,可能会帮助您省去头痛。