3.3.9 (tetapi juga mengalami ini di 3.0.0 dan sebelumnya)
0.59.9
iOS (tidak diuji di Android)
Array yang sama setiap kali saya menelepon getAvailablePurchases
Panjang array yang sama setiap saat
Array berbeda setiap kali saya memanggil getAvailablePurchases
Panjang array berbeda setiap kali saya memanggil getAvailablePurchases
Perangkat Nyata
Saya pikir ini hanya terlihat dengan banyak transaksi, tetapi tidak dapat memastikannya. Akun Sandbox saya memiliki 50+ transaksi.
handleOnPressRestore = async () => {
return this.setState({ isLoadingRestorePurchases: true }, async () => {
try {
// Get the previous purchases of the current user
const purchases = await RNIap.getAvailablePurchases();
// Get the latest receipt from the purchases to validate
const { transactionReceipt, productId, transactionDate } = this.getLatestPurchase(purchases);
console.log(purchases.length, productId, transactionDate);
// Validate the receipt on our server
await this.props.validateSubscriptionReceipt(productId, transactionReceipt);
// The validation result is handled in componentDidUpdate
} catch (err) {
throw err;
} finally {
this.setState({ isLoadingRestorePurchases: false });
}
});
}
getLatestPurchase = (purchases: RNIap.ProductPurchase[]): RNIap.ProductPurchase => {
// First, sort the array, so the latest purchase is on top
// https://github.com/dooboolab/react-native-iap/issues/532#issuecomment-503174711
const sortedPurchases = purchases.sort((a, b) => b.transactionDate - a.transactionDate);
const purchase = sortedPurchases[0];
return purchase;
}
Dengan kode di atas, ketika saya menekan "Pulihkan pembelian", saya mendapatkan log yang berbeda setiap saat:
Menekan "Pulihkan pembelian" 6 kali, dengan menunggu di antaranya untuk membiarkan hasilnya masuk:
// purchases.length, productId, transactionDate
9 "com.app.sub" 1565182529000
21 "com.app.sub" 1565181329000
22 "com.app.sub" 1565183001000
42 "com.app.sub" 1565183001000
53 "com.app.sub" 1565182529000
55 "com.app.sub" 1565183001000
15 "com.app.sub" 1565182529000
Saya berharap arraynya selalu sama, bukan? Apa yang sedang terjadi disini?
Hasil dari getAvailablePurchases()
berbeda setiap kali saya menjalankannya
Saya juga melihat ini. Hal yang sangat berbahaya tentang hal ini adalah ada kemungkinan bahwa tanda terima terbaru yang valid mungkin tidak ada di hasil.
Dari melihat kode modul ini, sejujurnya terlihat seperti masalah di pihak Apple karena modul ini secara efektif hanya melewati apa pun yang restoreCompletedTransactions()
berikan kembali
Saya ingin tahu apakah getPurchaseHistory()
adalah alternatif yang baik untuk digunakan untuk langganan. Saat ini saya menggunakan itu sebagai alternatif, karena itu memberi saya hasil yang dapat diandalkan. Saya tidak memiliki pembelian lain di aplikasi saya, hanya langganan.
Sebagaimana dinyatakan dalam dokumen IAP pada paket ini, getAvailablePurchases()
berbicara tentang bahan habis pakai. Langganan bukanlah produk "yang dapat dikonsumsi" atau "tidak dapat dikonsumsi". Ini adalah "langganan yang dapat diperpanjang secara otomatis" Jadi getPurchaseHistory()
harus dilakukan?
Saya menemukan getPurchaseHistory () memberikan panjang array yang bervariasi juga. Sepertinya frekuensi permintaan mempengaruhi itu. Pada akhirnya ternyata ini tidak terlalu penting bagi kami, setelah salah satu kuitansi transaksi dikirim untuk validasi, semua kuitansi dikembalikan oleh Apple dalam array latest_receipt_info
yang semuanya penting bagi kami.
Saya mengalami masalah yang sama (tidak tahu apakah itu kesalahan mode kotak pasir). Juga, ketika saya mengganti id apple dalam perangkat nyata, pembelian yang dilakukan dengan akun lain akan dikembalikan.
Ex:
1 - Saya melakukan pembelian dengan akun [email protected]
2 - Mengalihkan id apel ke
3 - getAvailablePurchases mengembalikan transactionId dari pembelian yang dilakukan dengan akun [email protected]
Masalah lain yang saya temukan adalah jika saya memulihkan perangkat (reset pabrik) kedua metode getPurchaseHistory()
dan getAvailablePurchases
memberikan hasil acak
Tanggapan Apple untuk memulihkan pembelian adalah:
"Users restore transactions to maintain access to content they've already purchased. For example, when they upgrade to a new phone, they don't lose all of the items they purchased on the old phone. Include some mechanism in your app to let the user restore their purchases, such as a Restore Purchases button."
Menemukan topik Forum Pengembang Apple tentang hasil yang bervariasi dari restoreCompletedTransactions
seperti yang dikatakan oleh @ ssg-luke sebelumnya.
https://forums.developer.apple.com/thread/115242
Mungkin, ini terkait:
Sepertinya Anda merujuk ke satu pengguna yang memiliki banyak transaksi yang belum disebut aplikasi finishTransaction.
https://forums.developer.apple.com/thread/115242#thread -post-355444
Saya memiliki akun kotak pasir lain di perangkat yang sama. Jadi mungkinkah transaksi akun yang berbeda, di perangkat yang sama, hanya kacau dan tidak "selesai" sama sekali?
Namun, saya menjalankan loop pada semua transaksi, dan memanggil finishTransactionIOS
pada semuanya. Tapi itu tidak membuatnya hilang atau menghasilkan output yang dapat diandalkan sebesar getAvailablePurchases()
... Mungkin karena saya sudah menggunakan akun kotak pasir yang lebih baru dan transaksinya berasal dari akun kotak pasir yang lebih lama?
Bisa juga menjelaskan apa yang dialami @fcandiani .
Saya menemukan getPurchaseHistory () memberikan panjang array yang bervariasi juga. Sepertinya frekuensi permintaan mempengaruhi itu. Pada akhirnya ternyata ini tidak terlalu penting bagi kami, setelah salah satu tanda terima transaksi dikirim untuk validasi, semua tanda terima dikembalikan oleh Apple dalam array latest_receipt_info yang semuanya penting bagi kami.
Terima kasih atas infonya @ ssg-luke, saya akan melakukan hal yang sama.
Saya juga menjalankan loop pada semua transaksi, dan tidak dapat menghapusnya dengan finishTransactionIOS. Transaksi saya adalah langganan perpanjangan otomatis.
Menghadapi hampir sama. Saya membuat masalah, tetapi, memutuskan untuk meletakkan semua informasi di sini untuk membantu orang lain menemukan masalah dan solusi.
3.5.9
0.60.5
iOS
Pengguna berlangganan sekali , getAvailablePurchases
seharusnya mengembalikan hanya satu pembelian
getAvailablePurchases
mengembalikan lebih dari satu pembelian,
Perangkat nyata dengan akun kotak pasir baru.
getAvailablePurchases
, tidak mengembalikan pembelian (seperti yang diharapkan)purchaseUpdatedListener
dipanggil, dan saya menelepon RNIap.finishTransactionIOS(subscription.transactionId);
yang mengembalikan hanya undefined
(seperti yang saya duga)getAvailablePurchases
, mengembalikan satu pembelian (seperti yang diharapkan)getAvailablePurchases
, mengembalikan dua pembelian , masing-masing dengan transactionId
:{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145019000
transactionId: "1000000579415509"
transactionReceipt: "MIIVnQYJKoZIhvcN..."
},
{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571144839000
transactionId: "1000000579416705"
transactionReceipt: "MIIVnQYJKoZIhvcN...."
}
getAvailablePurchases
, mengembalikan tiga pembelian , masing-masing dengan transactionId
(tidak sama dari hasil sebelumnya):{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145739000
transactionId: "1000000579423546"
transactionReceipt: "MIIb1AYJKoZIhvcN..."
},{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145019000
transactionId: "1000000579426352"
transactionReceipt: "MIIb1AYJKoZI..."
},{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571144839000
transactionId: "1000000579426353"
transactionReceipt: "MIIb1AYJKoZIhvcN..."
}
getAvailablePurchases
, mengembalikan empat pembelian , masing-masing dengan transactionId
(tidak sama dari hasil sebelumnya) ...Ini sepertinya bukan perilaku yang benar, dari apa yang saya baca di dokumen dan dari apa yang terjadi di Android.
Saya menghargai bantuan apapun.
getAvaialblePurchases () mengembalikan 150+ hasil di akun pengujian kotak pasir saya. Saya telah memutuskan untuk tidak menggunakan getAvailablePurchases () sama sekali dan hanya menyimpan pembelian terakhir di perangkat dan juga di server. Jika aplikasi dihapus atau pengguna dipindahkan ke telepon baru, kami masih memiliki pembelian terakhir di server kami yang terkait dengan id & platform pengguna perusahaan kami (iOS atau Android). Memanggil getAvailablePurchases () membutuhkan waktu hampir satu menit dan terkadang memanggil pemicu pembelian yang diperbarui ini untuk mencoba memulihkan beberapa pembelian. Kami telah mengubah aliran kami seperti ini:
1) Saat pengguna masuk ke perangkat:
a) melihat apakah ada pembelian terakhir yang valid di server kami untuk pengguna dan platform.
b) Jika tidak ada catatan di server, lihat apakah ada pembelian tersimpan lokal di DB
c) Jika tidak ada atau ada yang kedaluwarsa, tampilkan langganan.
Awalnya kami memanggil getAvailablePurchases () dan mencoba melihat apakah pembelian terakhir masih valid. Tidak yakin apakah ini membantu orang lain tetapi kami tidak mengalami masalah dengan ini lagi. Kami sedang bereaksi dan itu adalah rasa sakit lain yang harus kami tangani.
@ramakula dan bagaimana jika pengguna membatalkan langganannya?
Seperti yang Anda katakan, Anda akan tetap berlangganan di database Anda sampai tanggal akhir, dan akan "melihat" pembelian yang tidak tersedia lagi.
Halo, sepertinya tidak ada aktivitas terkait masalah ini akhir-akhir ini. Apakah masalah sudah diperbaiki, atau masih membutuhkan perhatian masyarakat? Masalah ini mungkin ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Anda juga dapat memberi label masalah ini sebagai "Untuk Diskusi" atau "Edisi pertama yang baik" dan saya akan membiarkannya terbuka. Terima kasih atas kontribusi Anda.
Menutup masalah ini setelah tidak aktif dalam waktu lama. Jika masalah ini masih ada di rilis terbaru, silakan membuat masalah baru dengan informasi terbaru.
getAvaialblePurchases () mengembalikan 150+ hasil di akun pengujian kotak pasir saya. Saya telah memutuskan untuk tidak menggunakan getAvailablePurchases () sama sekali dan hanya menyimpan pembelian terakhir di perangkat dan juga di server. Jika aplikasi dihapus atau pengguna dipindahkan ke telepon baru, kami masih memiliki pembelian terakhir di server kami yang terkait dengan id & platform pengguna perusahaan kami (iOS atau Android). Memanggil getAvailablePurchases () membutuhkan waktu hampir satu menit dan terkadang memanggil pemicu pembelian yang diperbarui ini untuk mencoba memulihkan beberapa pembelian. Kami telah mengubah aliran kami seperti ini:
- Saat pengguna masuk ke perangkat:
a) melihat apakah ada pembelian terakhir yang valid di server kami untuk pengguna dan platform.
b) Jika tidak ada catatan di server, lihat apakah ada pembelian tersimpan lokal di DB
c) Jika tidak ada atau ada yang kedaluwarsa, tampilkan langganan.
Awalnya kami memanggil getAvailablePurchases () dan mencoba melihat apakah pembelian terakhir masih valid. Tidak yakin apakah ini membantu orang lain tetapi kami tidak mengalami masalah dengan ini lagi. Kami sedang bereaksi dan itu adalah rasa sakit lain yang harus kami tangani.
Saya yakin kami bisa mendapatkan pembelian terbaru dari tanda terima. Dengan memverifikasi penerimaan pengguna, dengan exclude-old-transaction: true kita bisa mendapatkan info langganan terbaru (hanya untuk tipe auto-renewable). Saya yakin kami dapat menggunakan metode ini untuk memulihkan pembelian langganan yang dapat diperpanjang secara otomatis. Saya tidak yakin apakah ini adalah metode yang ideal.
Komentar yang paling membantu
Saya juga menjalankan loop pada semua transaksi, dan tidak dapat menghapusnya dengan finishTransactionIOS. Transaksi saya adalah langganan perpanjangan otomatis.