React-native-iap: getAvailablePurchases di iOS biarkan muncul dialog "Masuk ke iTunes Store"

Dibuat pada 1 Okt 2019  ·  21Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

3.4.13

Versi react-native

0.60.5

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

iOS

Perilaku yang diharapkan

getAvailablePurchases tidak memiliki efek samping

Perilaku sebenarnya

Memanggil getAvailablePurchases di iOS biarkan muncul dialog "Masuk ke iTunes Store".

Ini tidak terjadi di Android.

IMG_0020

Saya menelepon getAvailablePurchases selama aplikasi mulai memulihkan item yang dibeli. Menurut dokumentasi saya mengerti bahwa ini adalah cara yang umum, bukan?

Untuk memulihkan item yang dibeli, saya menelepon getAvailablePurchases berdasarkan perubahan AppState . Sayangnya AppState tidak hanya dipicu saat aplikasi dimulai tetapi juga p.ex. setelah kembali ke aplikasi dari dialog (disebabkan oleh aplikasi) p.ex. Masuk ke iTunes ... :(

Bagi pengguna hal ini sangat mengganggu. Terutama jika pengguna tidak berniat membeli sesuatu, dia tidak ingin memasukkan kredensial untuk menyingkirkan dialog ini.

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

perangkat nyata

Langkah-langkah untuk mereproduksi perilaku

hubungi getAvailablePurchases

❓ question 📱 iOS 🙏 help wanted 🚶🏻 stale

Komentar yang paling membantu

Apakah mungkin ada cara untuk mengetahui sebelum menelepon getAvailablePurchases bahwa prompt akan muncul? Atau dengan kata lain, bagaimana saya bisa mendeteksi jika pengguna terhubung ke iTunes atau tidak?

Semua 21 komentar

Saat dalam pengembangan, ini menunjukkan bahwa Anda dapat masuk dengan akun kotak pasir Anda. Saya tidak percaya dokumentasinya sangat jelas tentang ini.

Saya pikir untuk produksi mungkin juga menampilkan prompt setiap kali memanggil fungsi ini, bukan? Cara saya menerapkan ini adalah saya menyebutnya saat pengguna menekan "pulihkan pembelian" dan setelah purchaseUpdatedListener dipanggil. Untuk mengetahui apakah pengguna memiliki langganan di masa mendatang, saya menyimpannya di backend dan menampilkannya ke aplikasi.

Hai @voxspox @alexpchin benar. @alexpchin Karena kami sedang mengerjakan jembatan, kami berasumsi bahwa orang mungkin tahu sedikit tentang IAP dalam bahasa asli. Menempatkan semua hal yang sudah ada di setiap platform cukup membebani pengelola. Jika ada beberapa karya pada dokumen yang menurut Anda mungkin berguna, silakan tambahkan apa saja dan berikan PR .

@mifi Saya belum pernah melihat aplikasi dengan tombol "pulihkan pembelian saya". Dari perspektif UX, tombol seperti itu merupakan beban dan juga tidak perlu, karena aplikasi harus tahu apa yang telah saya beli;)

@hyochan Saya mendapatkan prompt juga setelah mendistribusikan aplikasi melalui TestFlight (Saya menganggap ini adalah mode produksi ?!)

Saya telah melihat beberapa aplikasi dengan fungsi itu. Saya tidak begitu ingat sekarang tetapi saya pikir itu diperlukan (atau dibutuhkan oleh apel) dalam beberapa kasus. Juga dalam contoh pedoman toko aplikasi Apple mereka memiliki tombol ini:
https://developer.apple.com/app-store/subscriptions/

Juga saya pikir itu akan menjadi UX yang buruk jika pengguna harus memasukkan ID apel mereka saat membuka aplikasi saya, saya pikir itu akan membingungkan. (Saya pernah melihat ini terjadi sebelumnya jika sesi kedaluwarsa atau sesuatu terjadi dengan SSL MITM yang sering terjadi pada halaman arahan wifi publik)

edit: sebenarnya tampaknya apel membutuhkannya

Apakah mungkin ada cara untuk mengetahui sebelum menelepon getAvailablePurchases bahwa prompt akan muncul? Atau dengan kata lain, bagaimana saya bisa mendeteksi jika pengguna terhubung ke iTunes atau tidak?

1+ sama

Hai teman-teman, ada jawaban tentang ini? seperti yang saya pahami ini adalah fungsi debugging tetapi saya sedang menguji dengan testflight dan saya ingin mencegah hal ini terjadi, apakah mungkin untuk meninggalkan mode kotak pasir?

Sementara itu, saya telah menemukan solusi untuk saya. Saya memperkenalkan variabel baru isRestorePurchasesEnabled yang disimpan secara permanen oleh aplikasi saya.

Init:

isRestorePurchasesEnabled = false

Saat aplikasi dimulai:

if (Android || isRestorePurchasesEnabled) {
  call getAvailablePurchases
  on error.code === 'E_USER_CANCELLED' -> isRestorePurchasesEnabled= false
}

Saat membeli:

isRestorePurchasesEnabled = true
requestSubscription ...

Pengaturan:

Button "restore purchases" -> isRestorePurchasesEnabled = true

Pengguna tidak akan pernah melihat perintah sambungkan iTunes lagi. Pemulihan hanya terjadi setelah pembelian selesai dan dengan demikian kredensial sudah diketik + disimpan dan prompt tidak akan ditampilkan.
Satu-satunya kasus di mana prompt akan ditampilkan, tetapi hanya sekali, adalah jika pengguna logout di Akun Pengaturan / iTunes / Sandbox. Tidak tahu apakah ini ada dalam mode produksi.

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.

Halo,
Saya benar-benar bingung tentang satu topik, dapatkah seseorang membantu saya?
Saya ingin membuat pengontrol yang memeriksa apakah pengguna masih memiliki produk atau tidak?
Bagaimana saya bisa mendeteksi pembatalan pengguna dengan menggunakan perpustakaan ini untuk Apple dan Google Play Store?
Saya bahkan tidak tahu apakah itu terkait dengan metode getAvailablePurchase ini.
Terima kasih.

  • sama

Saya ingin mencari tahu apakah ini juga akan terjadi dalam produksi, bukan hanya TestFlight.
Saat ini kami menggunakan fungsi ini saat aplikasi dimuat, bukan saat menekan tombol.

Apple masih menyarankan kami untuk tidak memanggil fungsi ini di aplikasi secara otomatis atau memulai

Jangan pulihkan pembelian secara otomatis, terutama saat aplikasi Anda diluncurkan. Memulihkan permintaan pembelian untuk kredensial App Store pengguna, yang mengganggu aliran aplikasi Anda.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restore% 20Completed% 20Transactions, dari% 20your% 20app's% 20completed% 20transactions.

Cara saya menerapkannya adalah mengirim tanda terima ke backend saat pengguna menekan beli atau pulihkan pembelian. Kemudian backend dapat menyediakan aplikasi dengan status langganan di masa mendatang.

Apple masih menyarankan kami _not_ untuk memanggil fungsi ini pada aplikasi secara otomatis atau startup

Jangan pulihkan pembelian secara otomatis, terutama saat aplikasi Anda diluncurkan. Memulihkan permintaan pembelian untuk kredensial App Store pengguna, yang mengganggu aliran aplikasi Anda.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restore% 20Completed% 20Transactions, dari% 20your% 20app's% 20completed% 20transactions.

Cara saya menerapkannya adalah mengirim tanda terima ke backend saat pengguna menekan beli atau pulihkan pembelian. Kemudian backend dapat menyediakan aplikasi dengan status langganan di masa mendatang.

Untuk langganan perpanjangan otomatis, bagaimana Anda mendapatkan tanda terima terbaru tanpa mengunggah dari klien?

Dengan menjalankan polling berkala di backend yang secara berkala memvalidasi setiap pembelian seperti ini. Kemudian ambil tanda terima terbaru dari validasi (yang berasal dari server google / apple) dan simpan kembali ke database.

Dengan menjalankan polling berkala di backend yang secara berkala memvalidasi setiap pembelian seperti ini. Kemudian ambil tanda terima terbaru dari validasi (yang berasal dari server google / apple) dan simpan kembali ke database.

Hai @mifi Terima kasih atas tanggapan yang cepat! Saya telah menyimpan latestReceipt di server setelah transaksi awal. Jadi saat polling dengan latestReceipt apakah nilai latestReceipt dikembalikan?

Ya, fungsi iap.validate di backend akan memanggil apple / google apis yang mengembalikan tanda terima terbaru. ini dapat dengan mudah dilihat saat menguji langganan yang dapat diperbarui dengan interval pengembangan (5 menit per periode langganan)

Terima kasih @mifi. Itu sangat membantu pemahaman saya! Rasanya aneh mengirim "recentReceipt" untuk menerima "latestReceipt"

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat