React-native-iap: Android mogok di banyak perangkat setelah rilis

Dibuat pada 9 Nov 2018  ·  45Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

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

Platform yang Anda hadapi kesalahan (IOS atau Android atau keduanya?)

Android

Perilaku yang diharapkan

Tolong bantu saya, saya harus segera memperbaikinya. Karena sudah ada + 2k pengguna

Perilaku sebenarnya

Aplikasi macet karena rniap di banyak perangkat. Di konsol bermain, saya melihat kesalahan ini menyebabkan crash:
java.lang.RuntimeException:

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

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

berikut adalah laporan dari play console:
https://ibb.co/gDxZQA

Langkah-langkah untuk mereproduksi perilaku

Saya tidak tahu harus berbuat apa, saya menggunakan rniap seperti di contoh.
di componentDidMount:
coba {
hasil const = menunggu RNIap.initConnection ();
} tangkap (err) {
console.log (err);
}
di componentWillUnmount:
RNIap.endConnection ();

🐛 bug 🤖 android

Komentar yang paling membantu

@hyochan maaf belum sempat melihat ini kemarin semoga bisa segera saya lihat

@ Ilario17 Mungkin untuk menandai bahwa ada kesalahan logika di suatu tempat, agar adil, kita tidak boleh memanggil metode itu beberapa kali

edit: ah, masalahnya muncul ketika onBillingSetupFinished terjadi lebih dari sekali. Di ensureConnection kita perlu menghapus listener ketika kita selesai (yaitu ketika kita memanggil callback.run() atau menolak janji yang diteruskan). Seharusnya menjadi PR yang mudah jika ada yang siap untuk karma gratis! Jika tidak, saya akan mencoba melakukannya segera

Semua 45 komentar

Bisakah Anda mencoba versi terbaru kami 2.3.19 dan kembali?

Aku tidak bisa. Karena itu adalah situasi langsung. Jadi, saya mengganti paket IAP. Sekarang tidak ada kerusakan di + 3k pengguna. Tapi terima kasih. Saya akan mencobanya di proyek saya berikutnya.

Hai, dapatkah Anda membuka kembali masalah ini? Saya memiliki masalah yang sama dan saya menggunakan versi 2.3.21

java.lang.RuntimeException:
di com.facebook.react.bridge.CallbackImpl.invoke (CallbackImpl.java:28)
di com.facebook.react.bridge.PromiseImpl.resolve (PromiseImpl.java:30)
di com.dooboolab.RNIap.RNIapModule $ 4.jalankan (RNIapModule.java:155)
di com.dooboolab.RNIap.RNIapModule $ 3.onBillingSetupFinished (RNIapModule.java:124)
di com.android.billingclient.api.BillingClientImpl $ BillingServiceConnection.onServiceConnected (BillingClientImpl.java:903)
di android.app.LoadedApk $ ServiceDispatcher.doConnected (LoadedApk.java:1658)
di android.app.LoadedApk $ ServiceDispatcher $ RunConnection.run (LoadedApk.java:1687)
di android.os.Handler.handleCallback (Handler.java:789)
di android.os.Handler.dispatchMessage (Handler.java:98)
di android.os.Looper.loop (Looper.java:164)
di android.app.ActivityThread.main (ActivityThread.java:6938)
di java.lang.reflect.Method.invoke (Metode Asli)
di com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327)
di com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)

ini adalah componentDidMount saya

           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 Bisakah Anda membantu kami di sini? Mengapa callback.run() crash saat dirilis? Haruskah kita memeriksa apakah callback adalah null di ensureConnection ? Hm. itu adalah runtime exception .

Hmmm, apa maksud RuntimeException sini, tidak ada info lagi? @hyochan mengapa menurut Anda callback adalah null ? 🤔

@LinusU Terima kasih atas tanggapan Anda. Saya tidak tahu saat ini. Saya baru saja melihat baris masalah di bawah ini.
image

Di RNIapModule.java baris 124,

callback.run();

Apakah Anda punya ide lebih lanjut?

@LinusU Jika Anda tidak tahu tentang yang ini, saya akan mempertimbangkan untuk mengembalikan ini ke tempat kami sebelumnya.

Oke, ini masalahnya:

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

Untuk beberapa alasan kami memanggil panggilan balik lebih dari sekali, semestinya mudah untuk memperbaikinya!

@LinusU Tampak hebat karena Anda berada di trek! Bisakah Anda memberi kami PR untuk ini?

Mengapa ada RuntimeException dalam metode itu?

if (!mInvoked) {
   mJSInstance.invokeCallback(mCallbackId, Arguments.fromJavaArgs(args));
   mInvoked = true;
}

Bukankah sesuatu seperti ini cukup?

@hyochan maaf belum sempat melihat ini kemarin semoga bisa segera saya lihat

@ Ilario17 Mungkin untuk menandai bahwa ada kesalahan logika di suatu tempat, agar adil, kita tidak boleh memanggil metode itu beberapa kali

edit: ah, masalahnya muncul ketika onBillingSetupFinished terjadi lebih dari sekali. Di ensureConnection kita perlu menghapus listener ketika kita selesai (yaitu ketika kita memanggil callback.run() atau menolak janji yang diteruskan). Seharusnya menjadi PR yang mudah jika ada yang siap untuk karma gratis! Jika tidak, saya akan mencoba melakukannya segera

@LinusU Jadi maksud Anda onBillingSetupFinished , kita harus menghapus billingClientStateListener ? Akankah seseorang mencoba yang ini untuk menjadi bagian dari kita?

Jika Anda menginginkan solusi cepat dan kotor, saya akan menambahkan variabel lokal ke fungsi itu, didCallCallback = false . Kemudian pertahankan panggilan ke callback.run() belakang if (didCallCallback) { didCallCallback = true; callback.run() } .

Solusi yang lebih bersih adalah dengan membatalkan pendaftaran pendengar setelah panggilan pertama sama sekali ...

Log.d(TAG, "billing client ready");
callback.run();
//deregister the listener here?

Saya baru saja merilis 2.4.0-beta2 untuk memperbaikinya. Silakan coba.

@hyochan Saya akan mencoba versi baru ini

Harap coba 2.4.0-beta3 karena beta2 memiliki masalah regresi.

@hyochan setelah update error masih ada :(

@ Ilario17 Bagaimana dengan 2.4.0-beta5 ? Karena saya tidak dapat mereproduksi ini di sisi saya, saya perlu tes Anda :(

@hyochan kenapa tidak hapus saja pendengarnya, seperti yang dikatakan @LinusU ?

@ Ilario17 Saya ingin tahu apakah itu solusi yang tepat. Juga, saya merasa onBillingServiceDisconnected harus diberitahukan. Anda dapat mencoba melepaskannya dan mengujinya di sisi Anda dan melihat apakah berhasil.

Saya tidak tahu apakah ini terkait tetapi saya mendapatkan error ini di 2.4.0-beta5. Mudah untuk mereproduksi di emulator:
Saya memasang komponen di mana IAP dimuat, melepasnya dan kemudian memasangnya lagi, boom crash.
EDIT: Saya menurunkan versi ke commit ini dan tidak lagi mogok 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

Berikut kode yang menyebabkan crash pada mount ke-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 Nah ini tidak akan berfungsi di emulator android. Silakan coba di perangkat nyata.

@hyochan Saya perhatikan bahwa versi 2.4.0-beta3 memiliki 50% lebih sedikit kerusakan, tetapi masih belum cukup

Untuk 2.4.0-beta3 di Android, saya mendapatkan error "Pembelian gagal dengan kode: 0 (OK)" hanya dari memanggil getProducts. beta 4 dan 5 sebenarnya menyebabkannya crash. Saya menurunkan versi ke 2.3.5 dan berfungsi dengan baik, tetapi saya memerlukan perbaikan bug pendengar ios di 2.4.0-beta

``
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)
    }
};

Bisakah Anda mencoba beta5 dan kembali? Ada kesalahan dalam versi itu jadi saya segera memperbaikinya

@hyochan @LinusU dengan versi 2.4.0-beta5 error masih ada.

Saya memiliki beberapa informasi yang relevan dengan diskusi ini.

Pada 2.4.0-beta5, saya mendapatkan error berikut

Attempt to invoke virtual method void com.android.billingclient.api.BillingClient.querySkuDetailsAsync(...) on a null object reference

menunjuk ke RNIapModule.java baris 223. Ini berarti bahwa mBillingClient tiba-tiba adalah null sini.

Untuk mereproduksi : pasang komponen react-native yang memanggil RNIap.getProducts() pada componentDidMount dan RNIap.endConnection() pada componentWillUnmount . Lepaskan komponen dan pasang kembali. Kesalahan di atas seharusnya terjadi.

Variabel clientReady sedang digunakan untuk melacak jika penyiapan klien penagihan telah selesai, dengan menyetelnya ke false dalam callback onBillingServiceDisconnected() . Tapi mBillingClient itu sendiri diset ke null segera ketika endConnection() dipanggil. Ini adalah ketidakcocokan. Mungkin saja clientReady tetap disetel ke true , meskipun mBillingClient adalah null. Saya yakin inilah yang terjadi, setidaknya karena kesalahan saya. Tampaknya ada sesuatu yang mencegah pemanggilan onBillingServiceDisconnected() .

Saya dapat mengonfirmasi bahwa saya tidak mendapatkan "billing client disconnected" di logcat saat melepas seperti yang diharapkan, jadi onBillingServiceDisconnected() memang tidak dipanggil.

Potensi Perbaikan : setel clientReady = false dalam metode endConnection() (misalnya setelah baris 179). Saya telah menguji ini di perangkat dan tampaknya berfungsi. Memasang ulang komponen pembelian dalam aplikasi beberapa kali tampaknya tidak menghasilkan kesalahan atau crash. Juga, pikirkan apakah perlu menyetel mBillingClient menjadi null? Saya tidak punya pengalaman di sini jadi saya tidak bisa mengatakannya, tapi ini memang terlihat sedikit aneh. Saya juga tidak melihat proyek lain di Github yang membatalkan klien penagihan dalam panggilan balik ini.

@ mitchellcm27 Terima kasih atas tangkapan Anda. Ini sangat menjanjikan dan saya setuju dengan Anda. Sulit bagi saya untuk memperbaiki masalah tanpa reproduksi minimal. Juga, saya ingin memecahkan masalah bersama.

Tolong beri kami PR jika Anda mempunyai pemikiran untuk memperbaiki masalah ini.

Salam Hormat.

Saya telah merilis 2.4.0-beta6 di versi terbaru aplikasi saya, dengan beberapa ribu peningkatan sejauh ini. Belum ada kerusakan 👍

Kedengarannya bagus. Terima kasih banyak atas perbaikannya! Saya akan menutup masalah ini untuk saat ini.

Saya sudah mengalami beberapa crash dengan stacktrace yang sama tetapi jauh lebih sedikit dari sebelumnya.


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)

Juga masih mendapatkan stacktrace yang sama pada 2.4.0-beta6

Saya pikir bug ini harus dibuka kembali.

schermata 2019-01-11 alle 10 51 20

120 kecelakaan dalam waktu kurang dari 24 jam.

Saya tidak yakin bahwa perubahan terbaru tidak menyebabkan masalah mereka sendiri, misalnya jika mBillingClient bukan null, tetapi belum siap, fungsi ensureConnection hanya akan menimpa mBillingClient dengan klien baru, membuang yang lama 🤔

Saya ingin tahu versi mana yang mulai menampilkan kesalahan ini, sehingga saya dapat mengembalikan ke versi stabil.

Saya juga berpikir masalah ini harus dibuka kembali. Masalah asli berkaitan dengan callback, dan perbaikan untuk itu memunculkan kesalahan "referensi objek null". Meskipun yang terakhir mungkin telah diperbaiki (saya setuju dengan @LinusU bahwa mungkin ada lebih banyak masalah di sana), kami masih menangani masalah aslinya.

Saya mendapatkan beberapa error terkait dengan callback di beta6 juga.

Saya telah membuka kembali ini. Semoga seseorang bisa memberikan PR untuk ini.

Apakah kalian tahu kapan ini diperkenalkan? Saya akan sangat senang untuk memutar kembali.

Saya dapat mengonfirmasi bahwa kerusakan ada pada beta6 serta 2.3.23 di Android. Cukup mudah untuk dibuat ulang berdasarkan [1] komentar ini.

Sunting: Sekarang saya di rumah, saya men-debug ke kode asli Android untuk beta6. Jika ini membantu, inilah yang terjadi (setidaknya di aplikasi saya, memanggil getAvailablePurchases):

  1. getAvailableItemsByType untuk "tidak" dipanggil tanpa penyiapan mBillingClient.
  2. Klien penagihan mendapatkan penyiapan, onBillingSetupFinished di pemroses dipanggil, dan callback (Promise) digunakan (diselesaikan). Pendengarnya masih ada.
  3. getAvailableItemsByType untuk "subs" dipanggil dengan penyiapan mBillingClient. panggilan balik baru (Janji) digunakan (diselesaikan).
  4. Matikan layanan Play Store - onServiceDisconnected di BillingClientImpl dipanggil, pendengar dari bagian 1 menanganinya. Layanan baru dimulai, dan listener dari bagian 1 menangani onBillingSetupFinished, dan mencoba menggunakan callback (Promise) dari langkah pertama dipanggil lagi.

Saya akan bereksperimen dengan membunuh pendengar setelah tidak lagi dibutuhkan.

[1]
https://github.com/googlesamples/android-play-billing/issues/45#issuecomment -324466519

Saya telah menggabungkan # 379 dan merilis ke beta8 . Silakan coba itu.

Apakah ini diperbaiki di versi terbaru? Apakah aman untuk meningkatkan ke yang terbaru?

@hyochan masalah ini masih muncul di 3.0.0-rc-2 ada ide?

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 Bisakah Anda mencoba 3.0.0-rc-4 ? Ini akan bekerja dengan sempurna (semoga).

@ Hyochan Jika saya menggunakan try catch error runtime ini tidak akan terjadi, saya pikir rc-4 harus menyelesaikannya.
Terima kasih !

Apakah halaman ini membantu?
0 / 5 - 0 peringkat