“本机”:“ 0.55.4”
“ react-native-iap”:“ ^ 2.3.2”
安卓系统
请帮助我,我需要立即修复此问题。 因为已经有+ 2k用户
应用由于许多设备中的rniap而崩溃。 在游戏机中,我看到此错误导致崩溃:
java.lang.RuntimeException:
这是Play控制台的报告:
https://ibb.co/gDxZQA
我不知道该怎么办,我在示例中使用了rniap。
在componentDidMount中:
尝试{
const result =等待RNIap.initConnection();
} catch(err){
console.log(err);
}
在componentWillUnmount中:
RNIap.endConnection();
您可以尝试使用我们的最新版本2.3.19
并复出吗?
我不能因为那是眼前的情况。 因此,我更改了iap软件包。 现在,+ 3k用户中没有崩溃。 但是,谢谢。 我将在下一个项目中尝试。
嗨,您能重新打开这个问题吗? 我有同样的问题,我正在使用2.3.21版
java.lang.RuntimeException:
在com.facebook.react.bridge.CallbackImpl.invoke(CallbackImpl.java:28)
在com.facebook.react.bridge.PromiseImpl.resolve(PromiseImpl.java:30)
在com.dooboolab.RNIap.RNIapModule $ 4.run(RNIapModule.java:155)
在com.dooboolab.RNIap.RNIapModule $ 3.onBillingSetupFinished(RNIapModule.java:124)
在com.android.billingclient.api.BillingClientImpl $ BillingServiceConnection.onServiceConnected(BillingClientImpl.java:903)
在android.app.LoadedApk $ ServiceDispatcher.doConnected(LoadedApk.java:1658)
在android.app.LoadedApk $ ServiceDispatcher $ RunConnection.run(LoadedApk.java:1687)
在android.os.Handler.handleCallback(Handler.java:789)
在android.os.Handler.dispatchMessage(Handler.java:98)
在android.os.Looper.loop(Looper.java:164)
在android.app.ActivityThread.main(ActivityThread.java:6938)
在java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:327)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
这是我的componentDidMount
const itemSKus = Platform.select({
ios: [
...
],
android: [
...
]
});
try {
const message = await RNIap.initConnection();
//console.log(`message = ${message}`);
const items = await RNIap.getProducts(itemSKus);
//console.log(`items = ${items.length}`);
//console.log(items);
this.props.storeInAppPurchaseList(items);
} catch (errorCode) {
console.log(`error rniap = ${errorCode}`);
}
@LinusU您能在这里帮助我们吗? 为什么callback.run()
在发行时崩溃? 我们应该检查是否callback
是空的ensureConnection
? 嗯这是runtime exception
。
嗯, RuntimeException
在这里是什么意思,没有更多信息吗? @hyochan为什么您认为callback
是null
? 🤔
@LinusU感谢您的反馈。 我现在不知道我刚刚在下面看到了问题专线。
在RNIapModule.java
行124中,
callback.run();
您还有其他想法吗?
@LinusU如果您对此一无所知,我会考虑将其回滚到以前的状态。
好的,这是问题所在:
由于某种原因,我们不止一次调用回调,因此应该易于修复!
@LinusU看起来不错,因为您正在跟踪中! 您能给我们一个PR
吗?
为什么在该方法中有RuntimeException?
if (!mInvoked) {
mJSInstance.invokeCallback(mCallbackId, Arguments.fromJavaArgs(args));
mInvoked = true;
}
这样还不够吗?
@hyochan对不起,昨天没时间看这个,希望我能尽快看看
@ Ilario17可能是在某处标记出逻辑错误,公平地说,我们不应多次调用该方法
编辑:啊,当onBillingSetupFinished
发生不止一次时,问题就来了。 在ensureConnection
我们需要在完成后删除监听器(即,当我们调用callback.run()
或拒绝传入的诺言时)。 如果有人想获得免费的业力,那应该是轻松的公关! 否则,我会尽快尝试
@LinusU那么,您是说onBillingSetupFinished
,我们应该删除billingClientStateListener
吗? 有人会尝试这个作为我们的一部分吗?
如果您想要一个快速而肮脏的解决方案,我将向该函数添加一个局部变量didCallCallback = false
。 然后守护调用callback.run()
后面if (didCallCallback) { didCallCallback = true; callback.run() }
。
一个更干净的解决方案就是在第一次调用后完全注销监听器。
Log.d(TAG, "billing client ready");
callback.run();
//deregister the listener here?
我刚刚发布了2.4.0-beta2
来对此进行修复。 请尝试。
@hyochan我将尝试这个新版本
由于beta2存在回归问题,请尝试2.4.0-beta3。
@hyochan更新后错误仍然存在:(
@ Ilario17 2.4.0-beta5
怎么样? 由于我无法在自己这方面进行复制,因此我需要您进行测试:(
@hyochan为什么不像@LinusU所说的那样仅仅删除监听器?
@ Ilario17我很好奇这是否是正确的解决方案。 另外,我觉得应该通知onBillingServiceDisconnected
。 您可以尝试将其删除并在您的身边对其进行测试,看看是否可行。
我不知道这是否相关,但是我在2.4.0-beta5中遇到了崩溃。 在模拟器中很容易重现:
我将组件安装在IAP加载的位置,将其卸载,然后再次安装它,以防止动臂崩溃。
编辑:我降级到此提交,它不再崩溃https://github.com/dooboolab/react-native-iap/commit/2db337ac770a93508507ec046f31085ddbb346fb
Attempt to invoke virtual method 'void com.android.billingclient.api.BillingClient.querySkuDetailsAsync(com.android.billingclient.api.SkuDetailsParams, com.android.billingclient.api.SkuDetailsResponseListener)' on a null object reference
run
RNIapModule.java:223
ensureConnection
RNIapModule.java:113
getItemsByType
RNIapModule.java:218
invoke
Method.java
invoke
JavaMethodWrapper.java:372
invoke
JavaModuleWrapper.java:160
run
NativeRunnable.java
handleCallback
Handler.java:789
dispatchMessage
Handler.java:98
dispatchMessage
MessageQueueThreadHandler.java:29
loop
Looper.java:164
run
MessageQueueThreadImpl.java:192
run
Thread.java:764
以下是导致第二次挂载(2.4.0-beta5)崩溃的代码:
componentDidMount() {
this.loadIAPProducts()
}
componentWillUnmount() {
RNIap.endConnection();
}
loadIAPProducts = async () => {
const itemSkus = ['XXXX_id']
const result = await RNIap.initConnection();
if(result) {
try {
const products = await RNIap.getProducts(itemSkus);
if (products) {
this.setState({ iapProducts: products })
}
} catch (err) {
//console.log(err); // standardized err.code and err.message available
}
this.restoreIAPPurchases()
}
}
restoreIAPPurchases = async () => {
try {
const purchases = await RNIap.getAvailablePurchases()
if(purchases) {
purchases.forEach(purchase => {
if (purchase.productId === 'XXXX_id') {
try {
RNIap.consumePurchase(purchase.purchaseToken);
} catch(err) {
}
}
})
}
} catch (err) {
//console.log(err)
}
}
@ rom1k好吧,这将无法在android仿真器中工作。 请在真实设备中尝试。
@hyochan我注意到版本2.4.0-beta3的崩溃减少了50%,但仍然不够
对于Android上的2.4.0-beta3,仅通过调用getProducts就会收到错误“购买失败,代码:0(OK)”。 Beta 4和5实际上导致它崩溃。 我降级到2.3.5,它可以正常工作,但我需要在2.4.0-beta中修复ios侦听器错误
```
componentDidMount(){
this.getProductDetails();
}
getProductDetails = async () => {
try {
await RNIap.initConnection();
const details = await RNIap.getProducts(products);
this.setState({
title: details[0].title,
description: details[0].description,
price: details[0].localizedPrice,
loading: false
});
} catch (err) {
console.log(err.message)
}
};
您可以尝试beta5并卷土重来吗? 该版本存在错误,因此我迅速修复
@hyochan @LinusU版本2.4.0-beta5仍然存在该错误。
我有一些与此讨论有关的信息。
在2.4.0-beta5上,出现以下错误
Attempt to invoke virtual method void com.android.billingclient.api.BillingClient.querySkuDetailsAsync(...) on a null object reference
指向RNIapModule.java
行223。这意味着mBillingClient
在这里意外地是null
。
要重现:安装一个本机组件,在componentDidMount
上调用RNIap.getProducts()
在componentDidMount
上调用RNIap.getProducts()
RNIap.endConnection()
componentWillUnmount
。 卸下组件,然后再次安装。 上面的错误应该发生。
变量clientReady
通过在onBillingServiceDisconnected()
回调中将其设置为false
,用于跟踪计费客户端设置是否已完成。 但是,当调用endConnection()
时, mBillingClient
本身立即设置为null。 这是不匹配的。 即使mBillingClient
为空,也可能使clientReady
保持设置为true
。 我相信这是正在发生的事情,至少是出于我的错误。 似乎是某些原因阻止了onBillingServiceDisconnected()
调用。
我可以确认我没有按预期的那样在logcat上获得"billing client disconnected"
,所以确实没有调用onBillingServiceDisconnected()
。
可能的解决方法:在endConnection()
方法内设置clientReady = false
(例如,在第179行之后)。 我已经在设备上进行了测试,它似乎可以正常工作。 多次重新安装应用内购买组件似乎不会导致任何错误或崩溃。 另外,考虑是否有必要将mBillingClient
为null? 我在这里没有任何经验,所以我不能说,但这似乎有些奇怪。 我也看不到Github上的任何其他项目在此回调中使计费客户端无效。
@ mitchellmcm27感谢您的接见。 这是非常有希望的,我同意你的看法。 我很难在没有任何重复的情况下解决问题。 另外,我想一起解决问题。
如果您有任何改善此问题的想法,请给我们PR
。
最好的祝福。
我已经在我的应用程序的最新版本中发布了2.4.0-beta6,到目前为止已进行了数千次升级。 还没有崩溃crash
听起来不错。 非常感谢您的修复! 届时我将暂时关闭此问题。
我已经在使用相同的stacktrace时发生了一些崩溃,但是比以前少了很多。
java.lang.RuntimeException:
at com.facebook.react.bridge.CallbackImpl.invoke (CallbackImpl.java:28)
at com.facebook.react.bridge.PromiseImpl.resolve (PromiseImpl.java:30)
at com.dooboolab.RNIap.RNIapModule$4.run (RNIapModule.java:155)
at com.dooboolab.RNIap.RNIapModule$3.onBillingSetupFinished (RNIapModule.java:124)
at com.android.billingclient.api.BillingClientImpl$BillingServiceConnection.onServiceConnected (BillingClientImpl.java:903)
at android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:1658)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run (LoadedApk.java:1687)
at android.os.Handler.handleCallback (Handler.java:789)
at android.os.Handler.dispatchMessage (Handler.java:98)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6944)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
在2.4.0-beta6上也仍然获得相同的stacktrace
我认为该错误应重新打开。
在不到24小时的时间内崩溃了120次。
我不确定最近的更改不会引起自己的问题,例如,如果mBillingClient
不为null,但尚未准备好,则ensureConnection
函数将简单地覆盖mBillingClient
和一个新客户一起扔掉旧客户🤔
我想知道哪个版本开始显示此错误,以便可以回滚到稳定版本。
我也认为应该重新讨论这个问题。 最初的问题与回调有关,针对此问题的修复程序浮出了“空对象引用”错误。 尽管后者可能已修复(我同意@LinusU可能存在更多问题),但我们仍在处理原始问题。
我也遇到了一些与beta6中的回调相关的崩溃。
我已经重新打开了。 希望有人可以为此提供PR
。
你们知道什么时候引入的吗? 我会很乐意回滚。
我可以确认崩溃存在于beta6以及Android上的2.3.23中。 很容易根据此[1]评论进行重新创建。
编辑:现在我在家,我正在调试进入beta6的Android本机代码。 如果这有帮助,请执行以下操作(至少在我的应用中,调用getAvailablePurchases):
一旦不再需要侦听器,我将进行试验。
[1]
https://github.com/googlesamples/android-play-billing/issues/45#issuecomment -324466519
我合并了#379并发布到beta8
。 请尝试一下。
这是最新版本中修复的吗? 升级到最新版本安全吗?
@hyochan这个问题仍然出现在3.0.0-rc-2有什么想法吗?
java.lang.RuntimeException
com.dooboolab.RNIap.RNIapModule$3.onBillingSetupFinished
java.lang.RuntimeException:
at com.facebook.react.bridge.CallbackImpl.invoke (CallbackImpl.java:28)
at com.facebook.react.bridge.PromiseImpl.resolve (PromiseImpl.java:30)
at com.dooboolab.RNIap.RNIapModule$3.onBillingSetupFinished (RNIapModule.java:129)
at com.android.billingclient.api.BillingClientImpl$BillingServiceConnection$1.run (BillingClientImpl.java:1518)
at android.os.Handler.handleCallback (Handler.java:739)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:148)
at android.app.ActivityThread.main (ActivityThread.java:7325)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)
@fokoz可以尝试3.0.0-rc-4
吗? 它将运行完美(希望如此)。
@hyochan如果我使用try catch
不会发生此运行时错误,我认为rc-4应该可以解决此问题。
谢谢 !
最有用的评论
@hyochan对不起,昨天没时间看这个,希望我能尽快看看
@ Ilario17可能是在某处标记出逻辑错误,公平地说,我们不应多次调用该方法
编辑:啊,当
onBillingSetupFinished
发生不止一次时,问题就来了。 在ensureConnection
我们需要在完成后删除监听器(即,当我们调用callback.run()
或拒绝传入的诺言时)。 如果有人想获得免费的业力,那应该是轻松的公关! 否则,我会尽快尝试