React-native-iap: RNIap 不适用于 Android,但可以使用相同的代码在 iOS 上运行

创建于 2020-07-07  ·  33评论  ·  资料来源: dooboolab/react-native-iap

react-native-iap 的版本
4.4.7

react-native 的版本
0.60.6

您遇到错误的平台(IOS 或 Android 或两者?)
安卓

预期行为

     async componentDidMount() {
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
            const products: Product[] = await RNIap.getProducts(itemSkus);
            this.setState({ products }, () => {console.log(this.state.products)});
        } catch (err) {
            console.warn(err.code, err.message);
        }

预期行为是终端中打印的 .getProducts() 从播放控制台中提取的产品列表

实际行为
承诺不返回。 错误“计费不可用”

测试环境(模拟器?真实设备?)
真实设备(应用程序目前正在生产中)

重现行为的步骤
const itemSkus = Platform.select({ ios: [ 'com.example.1' ], android: [ 'com.example.1' ] });

     async componentDidMount() {
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
            const products: Product[] = await RNIap.getProducts(itemSkus);
            this.setState({ products }, () => {console.log(this.state.products)});
        } catch (err) {
            console.warn(err.code, err.message);
        }
    this.purchaseUpdateSubscription = purchaseUpdatedListener(async (purchase: InAppPurchase | SubscriptionPurchase | ProductPurchase) => {
        console.log('purchaseUpdatedListener', purchase);
        const receipt = purchase.transactionReceipt;
        if (receipt) {
            try {
                // if (Platform.OS === 'ios') {
                //   finishTransactionIOS(purchase.transactionId);
                // } else if (Platform.OS === 'android') {
                //   // If consumable (can be purchased again)
                //   consumePurchaseAndroid(purchase.purchaseToken);
                //   // If not consumable
                //   acknowledgePurchaseAndroid(purchase.purchaseToken);
                // }
                const ackResult = await finishTransaction(purchase);
            } catch (ackErr) {
                console.warn('ackErr', ackErr);
            }

            this.setState({ receipt }, () => this.goNext());
        }
    },
    );

    this.purchaseErrorSubscription = purchaseErrorListener(
        (error: PurchaseError) => {
            console.log('purchaseErrorListener', error);
        },
    );
}
componentWillUnmount() {
    if (this.purchaseUpdateSubscription) {
        this.purchaseUpdateSubscription.remove();
        this.purchaseUpdateSubscription = null;
    }
    if (this.purchaseErrorSubscription) {
        this.purchaseErrorSubscription.remove();
        this.purchaseErrorSubscription = null;
    }
}

我似乎无法弄清楚这是为什么。 我正在为 iOS 使用这个确切的代码,它运行良好。 我已经在播放控制台中设置了所有产品,向清单文件添加了账单权限,并链接了 IAP 包(我使用的是 AndroidX,因此该包是自动链接的)。 我已登录 Play 商店并且我拥有 Play 商店的最新版本,但 initConnection() 仍然无法正常工作。 我不知道还能做什么。 非常感谢任何帮助! 感谢您的阅读。

🙏 help wanted 🤖 android

所有33条评论

会有帮助吗?

会有帮助吗?

不幸的是它没有帮助:(。这是否与 AndroidX 迁移有关?由于某种原因 initConnection() 不起作用,我不知道原因。

@damialajogun你有没有发现哪里出了问题? 我有完全相同的错误,不明白它来自哪里...... initConnection() 未定义。

@hyochan你有什么想法吗?

@damialajogun你有没有发现哪里出了问题? 我有完全相同的错误,不明白它来自哪里...... initConnection() 未定义。

嘿,不,我还没有弄清楚:(

您是否将<uses-permission android:name="com.android.vending.BILLING" />到您的 AndroidManifest.xml 文件中?

@hakkikonu是的,我有

在我的错误日志中,我可以看到美国和新西兰等几个国家/地区的一小部分用户发生了相同的错误。 不过,它似乎发生得非常不一致。 任何想法这可能是由什么引起的?

@joris1995我也有这个问题,一小部分用户无法进行应用内购买,错误是“找不到sku。请先调用getItems获取产品”,但是sku是存在的,因为在购买弹出窗口中我显示取自 getProducts 的对象的价格,getItems 甚至不在 API 中

您的 google play 商店应用程序是最新版本吗? 这个问题是只发生在你的手机上还是所有用户上。

您也可以尝试使用不同的 Gmail 帐户登录 Google Play 商店。

请务必从设备上的设置/应用程序/谷歌播放中清除您的谷歌播放服务和谷歌播放商店应用缓存文件。

所有用户/帐户/电话...

对我来说,这只是我用户的一部分。 似乎没有任何一致的因素,如国家、操作系统版本或设备制造商。 在 BugSnag 中,它显示错误“计费不可用。 这可能是您的设备出现问题,或者 Play 商店可能已关闭”。 这是什么原因造成的?

您需要先提交测试版,然后才能加载应用内购买,并且只能使用发布版本对其进行调试。

测试版不是必须的。 也可以关闭 alpha

我也有同样的问题,我什至提交了测试版,4天前就被批准了

如果我明白你在说什么,是 initConnection() 在测试中不起作用,而是在 beta 中起作用?

@Kamsou是的,尽管主要是“getProducts()”在调试版本中不起作用。

更多信息: https :

我的情况是,当我想查看是否已购买时,我会这样做:
RNIap.getPurchaseHistory()
在 iOs 上一切正常。
但是在 Android 上我有一个错误:“错误:E_IAP_NOT_AVAILABLE”
_我在本地模拟器上_

``` const initilizeIAPConnection = async () => { await initConnection() .then(async (connection) => { consumeAllItemsAndroid(); await getItems(); console.log('IAP result', connection); }) .catch((error) => { console.warn( IAP 错误 ${error.code}`, error.message);
});
};

const getItems = async() => {
试试{
const 订阅 = 等待 getSubscriptions(itemSkus);
console.log('产品', 订阅);
设置订阅(订阅);
} 抓住(错误){
console.warn(err.code, err.message);
}
};
useEffect(() => {
初始化IAPConnection();
}, []);

``` I just removed await for consumeAllItemsAndroid(); ` 然后它开始工作

@rizshivalli很高兴听到它对你consumeAllItemsAndroid()时,它仍然对我不起作用。 我的问题是initConnection()不起作用。 你怎么能让那部分工作?

@damialajogun我删除了 try catch 并添加了 .then 和 .catch

@rizshivalli试过了,但它仍然对我不起作用:(。对不起所有的问题,但你真的能看到终端上打印的“产品”吗?我认为我的问题是它没有拉我在游戏控制台中配置的所有产品,即使我已经设置它们并且它们处于活动状态。
const getItems = async () => { try { const subscriptions = await getSubscriptions(itemSkus); console.log('Products', subscriptions);

@damialajogun是的,它正在工作。 我也可以在 android 上测试付款。 您是否已在 android 上发布了 alpha 或 beta 版本?

@rizshivalli不是 alpha 或 beta,但我已将其发布到生产中,因此它已在 Play 商店中上线。 我认为只要它在真实设备(不是模拟器)上就应该可以工作,不幸的是它不适合我......

@rizshivalli快速问题 - 您的应用在 Google Play 上是免费的还是付费的? 我的是免费的,但有应用程序内购买(用户可以免费下载应用程序并选择在应用程序中购买非消耗品),但现在我想知道是否必须将它列为付费才能使用 IAP?

@damialajogun它被列为免费,因为用户不需要为安装应用程序付费

大家早上好
你们中有没有人有他们的 Android 应用程序可以很好地进行支付?
因为对我来说 initConnection 不起作用。

我这样做,使用最新版本。 我认为 initConnection 实际上没有做任何事情,它只是启动连接,然后您需要获取产品

有什么解决办法吗?
对我来说,android 在启动应用程序之前崩溃了。 但是 Ios 按预期工作。
请帮忙

我面临(可能)同样的问题。

我向我的应用程序添加了另外两个订阅,但只有旧订阅有效。
当我尝试等待 RNIap.getSubscriptions() 时,我得到“谷歌表明我们在连接付款时遇到了一些问题”

当我尝试 RNIap.requestSubscription(subId, true) 时,我得到“找不到 sku”。

Skus 已在 google play 中注册并且 ids 正确,请仔细检查。 在模拟器和真实设备上测试,使用调试和发布模式。

有什么想法吗?

您好,最近好像没有关于这个问题的活动。 问题已解决,还是仍需要社区关注? 如果没有进一步的活动发生,这个问题可能会被关闭。 您也可以将此问题标记为“供讨论”或“好的第一期”,我将保持开放。 感谢您的贡献。

您好,最近好像没有关于这个问题的活动。 问题已解决,还是仍需要社区关注? 如果没有进一步的活动发生,这个问题可能会被关闭。 您也可以将此问题标记为“供讨论”或“好的第一期”,我将保持开放。 感谢您的贡献。

仍需注意

我们可以关门了!

萨姆。 12 月 19 日 2020 à 11:03,damialajogun通知@github.com a
评论:

您好,好像没有关于这个问题的活动
最近。 问题是否已解决,还是仍然需要
社会关注? 如果没有进一步的活动,这个问题可能会被关闭
发生。 您也可以将此问题标记为“供讨论”或“先行善后”
问题”,我将保持开放状态。感谢您的贡献。

仍需注意


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/doobolab/react-native-iap/issues/1040#issuecomment-748451922
或退订
https://github.com/notifications/unsubscribe-auth/AJ2B2AUIRMGWIHZSFYL6SWTSVR3AXANCNFSM4OSLGZSQ
.

此页面是否有帮助?
0 / 5 - 0 等级