React-native-iap: 发布后,Android在许多设备中崩溃

创建于 2018-11-09  ·  45评论  ·  资料来源: dooboolab/react-native-iap

版本的react-native-iap

“本机”:“ 0.55.4”
“ react-native-iap”:“ ^ 2.3.2”

您遇到错误的平台(IOS或Android还是两者兼有?)

安卓系统

预期行为

请帮助我,我需要立即修复此问题。 因为已经有+ 2k用户

实际行为

应用由于许多设备中的rniap而崩溃。 在游戏机中,我看到此错误导致崩溃:
java.lang.RuntimeException:

  1. 在com.facebook.react.bridge.CallbackImpl.invoke(CallbackImpl.java:28)
  2. 在com.facebook.react.bridge.PromiseImpl.resolve(PromiseImpl.java:30)
  3. 在com.dooboolab.RNIap.RNIapModule $ 4.run(RNIapModule.java:154)
  4. 在com.dooboolab.RNIap.RNIapModule $ 3.onBillingSetupFinished(RNIapModule.java:123)
  5. 在com.android.billingclient.api.BillingClientImpl $ BillingServiceConnection.onServiceConnected(BillingClientImpl.java:903)
  6. 在android.app.LoadedApk $ ServiceDispatcher.doConnected(LoadedApk.java:1264)
  7. 在android.app.LoadedApk $ ServiceDispatcher $ RunConnection.run(LoadedApk.java:1281)
  8. 在android.os.Handler.handleCallback(Handler.java:815)
  9. 在android.os.Handler.dispatchMessage(Handler.java:104)
  10. 在android.os.Looper.loop(Looper.java:207)
  11. 在android.app.ActivityThread.main(ActivityThread.java:5692)
  12. 在java.lang.reflect.Method.invoke(本机方法)
  13. 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:908)
  14. 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

经过测试的环境(仿真器?真实设备?)

这是Play控制台的报告:
https://ibb.co/gDxZQA

重现行为的步骤

我不知道该怎么办,我在示例中使用了rniap。
在componentDidMount中:
尝试{
const result =等待RNIap.initConnection();
} catch(err){
console.log(err);
}
在componentWillUnmount中:
RNIap.endConnection();

🐛 bug 🤖 android

最有用的评论

@hyochan对不起,昨天没时间看这个,希望我能尽快看看

@ Ilario17可能是在某处标记出逻辑错误,公平地说,我们不应多次调用该方法

编辑:啊,当onBillingSetupFinished发生不止一次时,问题就来了。 在ensureConnection我们需要在完成后删除监听器(即,当我们调用callback.run()或拒绝传入的诺言时)。 如果有人想获得免费的业力,那应该是轻松的公关! 否则,我会尽快尝试

所有45条评论

您可以尝试使用我们的最新版本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为什么您认为callbacknull ? 🤔

@LinusU感谢您的反馈。 我现在不知道我刚刚在下面看到了问题专线。
image

RNIapModule.java行124中,

callback.run();

您还有其他想法吗?

@LinusU如果您对此一无所知,我会考虑将其回滚到以前的状态。

好的,这是问题所在:

https://github.com/facebook/react-native/blob/370bcffba748e895ad8afa825bfef40bff859c95/ReactAndroid/src/main/java/com/facebook/react/bridge/CallbackImpl.java#L27 -L31

由于某种原因,我们不止一次调用回调,因此应该易于修复!

@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

我认为该错误应重新打开。

schermata 2019-01-11 alle 10 51 20

在不到24小时的时间内崩溃了120次。

我不确定最近的更改不会引起自己的问题,例如,如果mBillingClient不为null,但尚未准备好,则ensureConnection函数将简单地覆盖mBillingClient和一个新客户一起扔掉旧客户🤔

我想知道哪个版本开始显示此错误,以便可以回滚到稳定版本。

我也认为应该重新讨论这个问题。 最初的问题与回调有关,针对此问题的修复程序浮出了“空对象引用”错误。 尽管后者可能已修复(我同意@LinusU可能存在更多问题),但我们仍在处理原始问题。

我也遇到了一些与beta6中的回调相关的崩溃。

我已经重新打开了。 希望有人可以为此提供PR

你们知道什么时候引入的吗? 我会很乐意回滚。

我可以确认崩溃存在于beta6以及Android上的2.3.23中。 很容易根据此[1]评论进行重新创建。

编辑:现在我在家,我正在调试进入beta6的Android本机代码。 如果这有帮助,请执行以下操作(至少在我的应用中,调用getAvailablePurchases):

  1. 尚未安装mBillingClient的情况下,将调用“ inapp”的getAvailableItemsByType。
  2. 计费客户端进行设置,调用侦听器中的onBillingSetupFinished,并使用回调(Promise)(已解决)。 侦听器仍然存在。
  3. 使用mBillingClient安装程序调用“ subs”的getAvailableItemsByType。 新的回调(Promise)被使用(已解决)。
  4. 终止Play商店服务-调用BillingClientImpl中的onServiceDisconnected,第1部分中的侦听器进行处理。 一个新服务启动,第1部分中的侦听器处理onBillingSetupFinished,并尝试使用第一步中的回调(Promise),再次被调用。

一旦不再需要侦听器,我将进行试验。

[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应该可以解决此问题。
谢谢 !

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

相关问题

mtakac picture mtakac  ·  31评论

nochkin picture nochkin  ·  35评论

marcosmartinez7 picture marcosmartinez7  ·  32评论

immohdali picture immohdali  ·  28评论

bperlman picture bperlman  ·  34评论