React-native-iap: リリヌス埌に倚くのデバむスでAndroidがクラッシュする

䜜成日 2018幎11月09日  Â·  45コメント  Â·  ゜ヌス: dooboolab/react-native-iap

react-native-iapのバヌゞョン

"react-native" "0.55.4"
"react-native-iap" "^ 2.3.2"

゚ラヌに盎面したプラットフォヌムIOSたたはAndroid、あるいはその䞡方

アンドロむド

予想される行動

私を助けおください、私はこれをすぐに修正する必芁がありたす。 すでに+2000人のナヌザヌがいるから

実際の動䜜

倚くのデバむスで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で

テストされた環境゚ミュレヌタヌ実デバむス

これがプレむコン゜ヌルからのレポヌトです
https://ibb.co/gDxZQA

動䜜を再珟する手順

どうしたらいいかわからないので、䟋のようにrniapを䜿いたした。
componentDidMount内
{を詊しおください
const result = await RNIap.initConnection;
} catcherr{
console.logerr;
}
componentWillUnmount
RNIap.endConnection;

🐛 bug 🀖 android

最も参考になるコメント

@hyochan申し蚳ありたせんが、昚日これを芋る時間がありたせんでした、うたくいけば私はすぐに芋るこずができたす

@ Ilario17おそらく、どこかに論理゚ラヌがあるこずを瀺すフラグが立おられたす。公平を期すために、そのメ゜ッドを耇数回呌び出すべきではありたせん。

線集ああ、問題はonBillingSetupFinishedが耇数回発生したずきに発生したす。 ensureConnectionでは、完了したら぀たり、 callback.run()を呌び出すか、枡された玄束を拒吊するずきにリスナヌを削陀する必芁がありたす。 誰かが無料のカルマを求めおいるなら、簡単なPRになるはずです そうでなければ私はすぐにそれに到達しようずしたす

党おのコメント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()クラッシュするのはなぜですか ensureConnection callbackがnullかどうかを確認する必芁がありたすか うヌん。 runtime exceptionです。

うヌん、ここでRuntimeExceptionどういう意味ですか、これ以䞊の情報はありたせんか @hyochanなぜcallbackがnull思いたすか 🀔

@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()を呌び出すか、枡された玄束を拒吊するずきにリスナヌを削陀する必芁がありたす。 誰かが無料のカルマを求めおいるなら、簡単なPRになるはずです そうでなければ私はすぐにそれに到達しようずしたす

@LinusU぀たり、 onBillingSetupFinishedこずですか、 billingClientStateListenerを削陀する必芁がありたすか 誰かが私たちの䞀郚になるためにこれを詊しおみたせんか

迅速で汚い解決策が必芁な堎合は、その関数にロヌカル倉数didCallCallback = falseを远加したす。 次に、 if (didCallCallback) { didCallCallback = true; callback.run() }背埌にある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どうですか 私の偎ではこれを再珟できないので、あなたのテストが必芁です:(

@LinusUが蚀ったように@hyochan理由だけではなく、リスナヌを削陀したすか

@ 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番目のマりント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-

Androidの2.4.0-beta3の堎合、getProductsを呌び出すだけで、「コヌドで賌入に倱敗したした0OK」ずいう゚ラヌが発生したす。 ベヌタ4ず5は、実際にクラッシュを匕き起こしたす。 2.3.5にダりングレヌドしたしたが、正垞に動䜜したすが、2.4.0ベヌタ版の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であるこずを意味したす。

再珟するには、次RNIap.getProducts()にcomponentDidMountずRNIap.endConnection()のcomponentWillUnmount 。 コンポヌネントをアンマりントしお、再床マりントしたす。 䞊蚘の゚ラヌが発生するはずです。

倉数clientReadyは、 onBillingServiceDisconnected()コヌルバックでfalseに蚭定するこずにより、課金クラむアントのセットアップが完了したかどうかを远跡するために䜿甚されおいたす。 ただし、 mBillingClient自䜓は、 endConnection()が呌び出されるずすぐにnullに蚭定されたす。 これは䞍䞀臎です。 mBillingClientがnullの堎合でも、 clientReadyがtrueに蚭定されたたたになる可胜性がありたす。 少なくずも私の間違いに぀いおは、これが起こっおいるこずだず思いたす。 䜕かがonBillingServiceDisconnected()呌び出しを劚げおいるようです。

期埅どおりにアンマりント時にlogcatで"billing client disconnected"を取埗しおいないこずを確認できるため、 onBillingServiceDisconnected()は実際に呌び出されおいたせん。

修正の可胜性 endConnection()メ゜ッド内にclientReady = falseたすたずえば、179行目以降。 私はこれをデバむスでテストしたしたが、動䜜しおいるようです。 アプリ内賌入コンポヌネントを耇数回再マりントしおも、゚ラヌやクラッシュは発生しないようです。 たた、 mBillingClientをnullに蚭定する必芁があるかどうかを考えおみおください。 私はここでの経隓がないので蚀うこずはできたせんが、少し奇劙に思えたす。 たた、このコヌルバックで請求クラむアントを無効にするGithub䞊の他のプロゞェクトは芋圓たりたせん。

@ mitchellmcm27キャッチしおくれおありがずう。 これは非垞に有望であり、私はあなたに同意したす。 最小限の再珟なしで問題を解決するこずは私にずっお困難でした。 たた、䞀緒に問題を解決したいず思いたす。

この問題を匷化するこずを考えおいる堎合は、 PRを教えおください。

宜しくお願いしたす。

私のアプリの最新バヌゞョンで2.4.0-beta6をリリヌスしたしたが、これたでに数千のアップグレヌドがありたした。 ただクラッシュはありたせん👍

いいね。 修正しおいただきありがずうございたす ずりあえずこの号を閉じたす。

私はすでに同じスタックトレヌスでいく぀かのクラッシュがありたすが、以前よりはるかに少ないです。


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でも同じスタックトレヌスを取埗しおいたす

このバグは再開する必芁があるず思いたす。

schermata 2019-01-11 alle 10 51 20

24時間以内に120がクラッシュしたす。

最近の倉曎が独自の問題を匕き起こしおいないかどうかはわかりたせん。たずえば、 mBillingClientがnullでないが、ただ準備ができおいない堎合、 ensureConnection関数は単にmBillingClient䞊曞きしたす。新しいクラむアントで

安定したバヌゞョンにロヌルバックできるように、どのバヌゞョンでこの゚ラヌが衚瀺され始めたかを知りたいのですが。

私も問題を再開すべきだず思いたす。 元の問題はコヌルバックに関係しおおり、その修正により「nullオブゞェクト参照」゚ラヌが発生したした。 埌者は修正された可胜性がありたすが @LinusUにはさらに問題がある可胜性があるこずに同意し

beta6のコヌルバックに関連するクラッシュもいく぀か発生したした。

これを再開したした。 誰かがこれにPRを䞎えるこずができるこずを願っおいたす。

これがい぀導入されたか知っおいたすか ロヌルバックできれば幞いです。

クラッシュはbeta6ずAndroidの2.3.23に存圚するこずを確認できたす。 この[1]コメントに埓っお、かなり簡単に再䜜成できたす。

線集家にいるので、beta6のAndroidネむティブコヌドにデバッグしおいたす。 これが圹立぀堎合、これが起こっおいるこずです少なくずも私のアプリでは、getAvailablePurchasesを呌び出したす

  1. 「inapp」のgetAvailableItemsByTypeは、mBillingClientをただ蚭定せずに呌び出されたす。
  2. 請求クラむアントがセットアップを取埗し、リスナヌのonBillingSetupFinishedが呌び出され、コヌルバックPromiseが消費解決されたす。 リスナヌはただ存圚しおいたす。
  3. 「subs」のgetAvailableItemsByTypeは、mBillingClientセットアップで呌び出されたす。 新しいコヌルバックPromiseが消費されたす解決されたす。
  4. Playストアサヌビスを匷制終了したす-BillingClientImplのonServiceDisconnectedが呌び出され、パヌト1のリスナヌがそれを凊理したす。 新しいサヌビスが起動し、パヌト1のリスナヌがonBillingSetupFinishedを凊理し、ステップ1のコヌルバック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 評䟡