"react-native": "0.55.4"
"react-native-iap": "^ 2.3.2"
Android
Tolong bantu saya, saya harus segera memperbaikinya. Karena sudah ada + 2k pengguna
Aplikasi macet karena rniap di banyak perangkat. Di konsol bermain, saya melihat kesalahan ini menyebabkan crash:
java.lang.RuntimeException:
berikut adalah laporan dari play console:
https://ibb.co/gDxZQA
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 ();
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.
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:
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.
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):
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 !
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. DiensureConnection
kita perlu menghapus listener ketika kita selesai (yaitu ketika kita memanggilcallback.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