React-native-iap: getAvailablePurchases mengembalikan larik yang berbeda setiap saat

Dibuat pada 9 Agu 2019  ·  13Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

3.3.9 (tetapi juga mengalami ini di 3.0.0 dan sebelumnya)

Versi react-native

0.59.9

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

iOS (tidak diuji di Android)

Perilaku yang diharapkan

Array yang sama setiap kali saya menelepon getAvailablePurchases
Panjang array yang sama setiap saat

Perilaku sebenarnya

Array berbeda setiap kali saya memanggil getAvailablePurchases
Panjang array berbeda setiap kali saya memanggil getAvailablePurchases

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat Nyata

Langkah-langkah untuk mereproduksi perilaku

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

📱 iOS 🙏 help wanted 🚶🏻 stale

Komentar yang paling membantu

Saya juga menjalankan loop pada semua transaksi, dan tidak dapat menghapusnya dengan finishTransactionIOS. Transaksi saya adalah langganan perpanjangan otomatis.

Semua 13 komentar

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?

Screenshot 2019-08-16 at 18 11 13

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.

Versi react-native-IAP

3.5.9

Versi react-native

0.60.5

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

iOS

  • Kode yang sama berfungsi dengan sempurna di Android, sudah dalam produksi

Perilaku yang diharapkan

Pengguna berlangganan sekali , getAvailablePurchases seharusnya mengembalikan hanya satu pembelian

Perilaku sebenarnya

getAvailablePurchases mengembalikan lebih dari satu pembelian,

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat nyata dengan akun kotak pasir baru.

Langkah-langkah untuk mereproduksi perilaku

  • Buat pengguna uji kotak pasir di https://appstoreconnect.apple.com/access/testers
  • Bangun dan jalankan proyek di xcode
  • Panggil getAvailablePurchases , tidak mengembalikan pembelian (seperti yang diharapkan)
  • Berlangganan beberapa produk
  • purchaseUpdatedListener dipanggil, dan saya menelepon RNIap.finishTransactionIOS(subscription.transactionId); yang mengembalikan hanya undefined (seperti yang saya duga)
  • Hubungi getAvailablePurchases , mengembalikan satu pembelian (seperti yang diharapkan)
  • Muat ulang aplikasi
  • Hubungi 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...."
}
  • Muat ulang aplikasi lagi
  • Panggil 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..."
}
  • Muat ulang aplikasi lagi
  • Panggil 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:

  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.

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat