React-native-iap: iOS 14: masalah requestSubscription ()

Dibuat pada 20 Sep 2020  ·  57Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

4.4.9

Versi react-native

.62.2

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

khusus iOS. Belum menguji di Android.

Perilaku yang diharapkan

Dialog pembelian muncul untuk menyelesaikan pembelian dan kemudian pembelianUpdatedListener dipanggil.

Perilaku sebenarnya

panggil requestSubscription (). Tidak ada dialog pembelian. PurchaseUpdatedListener langsung dipanggil tanpa dialog pembelian atau tanda terima yang valid.

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat iOS 14 asli menggunakan TestFlight.

Langkah-langkah untuk mereproduksi perilaku

panggil RNIap.requestSubscription ().

Catatan:

  • XCode 12
  • menggunakan Masuk dengan ID Apple.
  • menguji di kotak pasir dengan ID Apple asli (bukan pengguna uji)
  • berfungsi dengan baik di iPad yang menjalankan iOS 13.7.
  • telah menerapkan perbaikan janji iOS 14.
🍚 need contribution 📱 iOS 🙏 help wanted

Komentar yang paling membantu

Di sini hanya untuk mengatakan bahwa saya menghadapi masalah yang sama. Saya sudah menguji di iOS 12 dan berfungsi dengan baik ... iOS 14 bermasalah.

Panggilan saya tentang requestSubscription hanya bertahan selamanya ... Dan mengganggu produksi!

Semua 57 komentar

Sama disini. Ada yang bisa membantu?

Tidak menggantung, tetapi mengembalikan []

Bagi kami dialog pembelian muncul, dan pendengar pembelian dipanggil dengan benar, tetapi panggilan requestSubscription mengembalikan janji yang tidak pernah diselesaikan.

Sepertinya ini mungkin telah diselesaikan di sini https://github.com/dooboolab/react-native-iap/pull/1064

Saya telah menerapkan perbaikan janji itu sebelumnya, jadi bukan itu masalahnya di sini.

Bekerja untuk saya dengan iOS14, inilah cara saya melakukannya:
// request purchase, listener registered above will receive notification when processing done RNIap.requestSubscription(this.productIds[0]).catch(err => { console.log(err.code, err.message); });

Saya memanggil metode dengan parameter boolean false, yang menurut saya adalah rekomendasinya. Saya menghapusnya dan saya masih melihat perilaku yang sangat aneh di iOS14 tidak peduli bagaimana saya memanggil metode tersebut, dan itu berfungsi dengan baik pada iPhone dan iPad yang menjalankan iOS 13 melalui TestFlight. Saya menguji requestSubscription dengan dan tanpa boolean dan saya tidak pernah mendapatkan dialog pembelian di iOS 14. Sekarang sering kali itu memanggil RequestUpdatedListener segera dengan apa yang tampak seperti tanda terima yang tidak valid.

Apakah ada orang lain yang tidak mengalami masalah dengan langganan mereka di iOS14 dan xCode 12 menggunakan TestFlight?

Hai, apakah ada di antara Anda yang menggunakan getPurchaseHistory() atau getAvailablePurchases() sebelum requestSubscription() ? jika demikian, ini tampaknya menjadi masalah di iOS 14.

Saya mendapatkan getAvailablePurchases () lebih awal dalam aliran - saat aplikasi dimuat, layar tepat sebelum Layar Langganan saya.

ya, sayangnya ini sepertinya bug di iOS 14. Bukan kesalahan plugin ini. Saya telah memeriksa kode asli dan itu adalah masalah yang sama.

Itulah masalahnya. Saya menghapus panggilan ke getAvailablePurchases () dan popup pembelian terjadi dan pembelian berhasil. Sayangnya, saya perlu menelepon ke getAvailablePurchases, karena saya memeriksa status langganan mereka di App Load. Jadi sepertinya kita perlu menunggu patch iOS 14 untuk memperbaikinya? Tidak ada lagi yang bisa dilakukan orang lain? Omong-omong, terima kasih banyak theDev23!

Sama-sama, the-dut. Taruhan terbaik Anda mungkin mengandalkan cek berbasis server.

Saya berharap untuk menghindari server melakukan ini. Apakah semudah menyalin kode dari reaksiku menjadi sesuatu seperti Firebase Cloud Function? Atau apakah ini sesuatu yang perlu ditata ulang? Mungkin pertanyaan bodoh, tapi hei .. kami semua mulai mengajukan pertanyaan bodoh. :)

@ the-dut Anda dapat menggunakan iaphub untuk menangani validasi tanda terima server

Minuman pilihan Anda jika Anda pernah berada di Midwest AS. :)

Masalah yang sama di sini memengaruhi pengguna langsung. @ theDev23, apakah Anda kebetulan memiliki tautan diskusi tentang masalah di iOS? Apakah ada jadwal untuk memperbaikinya?

@nicknjpconsultingllc tidak ada link, maaf. Saya melakukan penggalian sendiri.

@ the-dut Saya juga menggunakan Firebase Cloud Functions. Lihat repo ini.

Saya akhirnya menyimpan tanda terima ke database tentang pembelian yang berhasil di purchaseUpdatedListener, lalu saat aplikasi dimuat, saya menarik tanda terima dari database, memvalidasinya lagi dan memeriksa untuk melihat apakah sudah kedaluwarsa atau tidak. Itu memungkinkan saya untuk menyingkirkan panggilan ke getAvailablePurchases () apakah berfungsi dengan baik di iOS14. Ini bekerja dengan sangat baik sejauh ini dan jauh lebih cepat. Sekarang pertanyaan tentang seberapa jauh saya harus mengambil ini. Jika hanya ini yang saya lakukan, apakah UpdatedPurchaseListener akan dipanggil untuk semua pembaruan langganan (pada dasarnya pembaruan otomatis) hingga saya menyelesaikan transaksi? Atau apakah saya perlu menerapkan pemberitahuan server-ke-server untuk mendapatkan informasi tentang perpanjangan otomatis? Sepertinya menggunakan UpdatedPurchaseListener adalah solusi yang lebih baik (dan lebih sederhana) karena saya telah membaca integrasi server-ke-server tidaklah sempurna.

Masih mendapatkan masalah ini setelah menghapus getPurchaseHistory dan menerapkan perbaikan janji. Tidak bisa memunculkan dialog pembelian. Ada yang bisa membantu?

Saya sarankan untuk melihat setiap / semua panggilan yang Anda lakukan ke AIP sebelum melakukan permintaan untuk membeli. Apakah Anda juga memanggil getAvailablePurchases ()?

Saya tidak bisa mengecualikan panggilan ke getAvailablePurchases () dan getPurchaseHistory (), apakah ada cara untuk membuatnya requestSubscription () memunculkan menu pembelian dengan panggilan ini?

Hai @ HamzaIkram2727 , jika saya tidak salah, Anda bisa membuat akun kotak pasir baru untuk digunakan dan hapus yang lama. Ini harus berhasil.

@ the-dut Meskipun saya tidak menggunakan panggilan getAvailablePurchases () dan getPurchaseHistory (), saya masih menghadapi masalah yang sama. Itu tidak menampilkan dialog pembelian tetapi pembelian berhasil secara otomatis.

Saya juga memanggil fungsi finishTrsanactionIOS dan finishTransation

Saya berhasil mendapatkan dialog pembelian asli iOS dengan keluar dari aplikasi. Bagi saya ini terlihat seperti beberapa janji yang akhirnya diselesaikan. Saya tidak yakin apakah ada dependensi promise di react-native-iap tetapi perilakunya tampak aneh. Memanggil requestSubscription diselesaikan di aplikasi tetapi tidak ada dialog sampai saya keluar dari aplikasi.

Saya mengalami masalah yang sama dengan getAvailblePruchases (), seringkali promise tidak menyelesaikan atau menolak. Ini mulai terjadi saat menguji pada perangkat iOS 14.

Saya mempunyai masalah yang sama

  1. Saya menelepon getAvailablePurchases ()
  2. requestSubscription ()

Saya menghapus getAvailablePurchase dan tampaknya berfungsi dengan baik

Ada pembaruan?

Perilaku yang benar-benar aneh dan untuk apa yang saya perhatikan tidak hanya di ios 14 yang terjadi ... Saya menghubungi apel untuk mencoba memahami apa yang terjadi karena saya rasa itu bukan masalah terkait dengan paketnya diri.

Di sini hanya untuk mengatakan bahwa saya menghadapi masalah yang sama. Saya sudah menguji di iOS 12 dan berfungsi dengan baik ... iOS 14 bermasalah.

Panggilan saya tentang requestSubscription hanya bertahan selamanya ... Dan mengganggu produksi!

Nah, setelah seharian "bersenang-senang", inilah yang telah saya simpulkan sejauh ini ... Saya memiliki berbagai perangkat dengan versi OS yang berbeda dan saya memiliki masalah ini pada masing-masing perangkat. Saya telah menghubungi Apple terkait hal ini dan kami masih menindaklanjuti kasus ini, tanpa kesimpulan yang pasti. Saya tidak percaya itu adalah masalah dengan paketnya, itu pasti ada sesuatu di pihak Apple. Saya sudah mencoba semua yang disebutkan orang di utas ini dan utas lain yang melaporkan masalah serupa. Dialog Pembelian Dalam Aplikasi tidak konsisten muncul dan sampai sekarang, saya tidak dapat menemukan alasan yang valid untuk itu karena hasilnya selalu berbeda. Terkadang saya mendapatkan kesalahan E_UNKNOWN, di lain waktu saya tidak mendapatkan umpan balik, terkadang pop up muncul setelah 10 menit menunggu dan di lain waktu itu berfungsi ... Saya sudah mencoba dengan pengguna kotak pasir, bukan pengguna kotak pasir, saya sudah punya hasil berbeda yang sama untuk pengguna dan perangkat yang sama dan bahkan kesalahan atau log yang meyakinkan / berwawasan tidak ditampilkan. Ini hanya membuat frustasi untuk men-debug karena Anda tidak dapat menemukan apa pun ... Nah, jika kalian memiliki saran atau wawasan, saya mendengarkan ... Sementara itu, jika saya memiliki berita dari Apple, Saya akan terus mengabari Anda ...
PS EDIT. setelah membaca komentar terakhir, ada satu hal yang konsisten dan saya dapat mengkonfirmasinya, di iOS 14 hal tersebut tampak lebih tidak konsisten meskipun terjadi pada setiap versi OS yang saya uji ini (12, 13.7, 14). Namun, saya masih mendapat kesan bahwa masalahnya tidak hanya terkait versi OS dan itulah mengapa saya berpikir itu pasti ada sesuatu dengan server Sandbox atau hal lain di pihak Apple ..

Kami telah menguji paket aplikasi kami dengan build yang disetujui App Store dan sepertinya ketidakkonsistenan muncul lebih mencolok di iOS versi 14+

Kesimpulan kami adalah cara Apple memverifikasi tanda terima di iOS 14+ sedikit berbeda.

Itu terjadi dengan akun yang telah melakukan pembelian

  1. Buat akun baru di Sandbox
  2. Lakukan pembelian (ini berfungsi dengan baik karena restorePurchases tidak memiliki pembelian)
  3. Tunggu sampai habis masa berlakunya.
  4. Beli lagi. (Sekarang pembelian pemulihan merespons objek dan munculan untuk mengonfirmasi pembelian tidak lagi berfungsi)

Itu aneh. Saya sedang meninjau kode perpustakaan dan saya menambahkan beberapa log untuk pengujian. Dan saya mendapatkan yang berikut ini

  1. Saat restorePurchases dipanggil. Ini menjalankan pendengar "paymentQueueRestoreCompletedTransactionsFinished"
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {  ////////   RESTORE
    NSLog(@"\n\n\n  paymentQueueRestoreCompletedTransactionsFinished  \n\n.");
    NSMutableArray* items = [NSMutableArray arrayWithCapacity:queue.transactions.count];
    NSLog(@"Number of items in my array is: %d", [queue.transactions count]);//this will return (5)

    for(SKPaymentTransaction *transaction in queue.transactions) {
        if(transaction.transactionState == SKPaymentTransactionStateRestored
           || transaction.transactionState == SKPaymentTransactionStatePurchased) {
            [self getPurchaseData:transaction withBlock:^(NSDictionary *restored) {
                [items addObject:restored];
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            }];
        }
    }
    NSLog(@"\n  finished paymentQueueRestoreCompletedTransactionsFinished ");

    [self resolvePromisesForKey:@"availableItems" value:items];
}

Di sini saya mencetak di log ukuran transaksi dan saya mendapat 23 item

  1. Fungsi paymentQueue dijalankan untuk menyelesaikan transaksi pemulihan
case SKPaymentTransactionStateRestored: {
          NSLog(@"Restored ");

         NSLog(@"\n  paymentQueue transaction : %@", transaction.transactionDate);
         [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
           break;
  }
  1. resolvePromisesForKey menyelesaikan restorePurchase yang

  2. requestSubscription mulai memanggil fungsi buyProduct

  3. Di sini saya menambahkan log untuk melihat log
 NSLog(@"\n  produc purchase : %@", product);

  SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];

  NSLog(@"\n  payment buy product : %@", payment.productIdentifier);

  [[SKPaymentQueue defaultQueue] addPayment:payment];
  1. Saya mendapatkan log berikut:
    a) Log RestorePurchases
2020-10-22 14:01:49.319677-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.319784-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:46:53 2020
2020-10-22 14:01:49.319930-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.319970-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:16:45 2020
2020-10-22 14:01:49.320044-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320082-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:06:37 2020
2020-10-22 14:01:49.320155-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320275-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:01:37 2020
2020-10-22 14:01:49.320421-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320532-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:49:31 2020
2020-10-22 14:01:49.320671-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320776-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:21:39 2020
2020-10-22 14:01:49.320915-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321018-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:26:39 2020
2020-10-22 14:01:49.321180-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321282-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:56:53 2020
2020-10-22 14:01:49.321414-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321516-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:51:53 2020
2020-10-22 14:01:49.321648-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321749-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 08:04:31 2020
2020-10-22 14:01:49.321879-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321984-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:11:41 2020
2020-10-22 14:01:49.322113-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.322214-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:41:53 2020
2020-10-22 14:01:49.322346-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.322444-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:31:39 2020
2020-10-22 14:01:49.323955-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324097-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 12:07:14 2020
2020-10-22 14:01:49.324240-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324344-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:16:39 2020
2020-10-22 14:01:49.324474-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324579-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:11:39 2020
2020-10-22 14:01:49.324709-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324808-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:39:31 2020
2020-10-22 14:01:49.324934-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.325030-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:59:31 2020
2020-10-22 14:01:49.325163-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.325260-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:26:45 2020
2020-10-22 14:01:49.327079-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327212-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:44:31 2020
2020-10-22 14:01:49.327360-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327465-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:54:31 2020
2020-10-22 14:01:49.327594-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327695-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:37:11 2020
2020-10-22 14:01:49.327823-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327923-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:21:45 2020
2020-10-22 14:01:49.328099-0500 ApplicationTest[532:51039] 

  paymentQueueRestoreCompletedTransactionsFinished  

2020-10-22 14:01:49.328204-0500 ApplicationTest[532:51039] Number of items in my array is: 23
2020-10-22 14:01:49.336873-0500 ApplicationTest[532:51039] 
  finished paymentQueueRestoreCompletedTransactionsFinished
2020-10-22 14:01:50.317721-0500 ApplicationTest[532:51234] 

b. buySubcription log:

2020-10-22 14:01:50.319607-0500 ApplicationTest[532:51234] 
  produc purchase : <SKProduct: 0x2839c0630>

2020-10-22 14:01:50.319694-0500 ApplicationTest[532:51234] 
  payment buy product : test.applicationtest

**2020-10-22 14:01:50.319849-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:50.319895-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:16:45 2020**

Jadi saya tidak mengerti mengapa metode paymentQueue dijalankan dengan SKPaymentTransactionStateRestored tanggal 5 Oktober

@andresordonezfm Apakah Anda menelepon finishTransaction setelah pembelian?

Juga mengenai pop-up, berikut adalah uji coba hebat yang diberikan di # 863. Semoga membantu.

@andresordonezfm Apakah Anda menelepon finishTransaction setelah pembelian?

Tentu! juga saya menelepon clearTransactionIOS () bagaimanapun jika itu bisa menjadi masalah tetapi tidak ada.

Juga mengenai pop-up, berikut adalah uji coba hebat yang diberikan di # 863. Semoga membantu.

Terima kasih. Saya akan memeriksanya

Ada solusi / pembaruan?

Belum ada. Saya meninjau dan Apple menambahkan fitur baru di StoreKit dan Jenis Pemberitahuan ..
Saya tidak yakin apakah itu masalahnya

https://developer.apple.com/videos/play/wwdc2020/10661/

Saya memang menurunkan versi paket ke 4.5.2 bekerja untuk saya
periksa apakah Anda menelepon
await RNIap.initConnection();
sebelum RNIap.requestSubscription

Sepertinya saya memecahkan masalah berikut ini:
https://github.com/dooboolab/react-native-iap/issues/1146

Pertama-tama, ketika saya memvalidasi tanda terima, saya mengirimkan true sebagai isTest parameter (bahkan ketika merupakan build produksi).
Kemudian saya menambahkan RNIap.clearTransactionIOS(); di purchaseUpdatedListener sebelum memvalidasi tanda terima dan RNIap.finishTransaction(purchase, false) setelah RNIap.finishTransactionIOS(purchase.transactionId);

Saya menguji di TestFlight dan saya bisa menyelesaikan pembelian untuk pertama kalinya (dengan akun kotak pasir), sekarang saya akan mengujinya di produksi 🤞

Sepertinya saya memecahkan masalah berikut ini:

1146

Pertama-tama, ketika saya memvalidasi tanda terima, saya mengirimkan true sebagai isTest parameter (bahkan ketika merupakan build produksi).
Kemudian saya menambahkan RNIap.clearTransactionIOS(); di purchaseUpdatedListener sebelum memvalidasi tanda terima dan RNIap.finishTransaction(purchase, false) setelah RNIap.finishTransactionIOS(purchase.transactionId);

Saya menguji di TestFlight dan saya bisa menyelesaikan pembelian untuk pertama kalinya (dengan akun kotak pasir), sekarang saya akan mengujinya di produksi 🤞

Hai bung, saya mencoba solusi ini tetapi tidak berhasil untuk saya.

Saya mengalami masalah yang sama. Itu terjadi ketika Anda mencoba membeli langganan setelah memulihkan pembelian.

Saya dapat mengonfirmasi log dari @andresordonezfm , yang tampaknya SKPaymentQueue menerima transaksi jenis SKPaymentTransactionStateRestored , bukan jenis SKPaymentTransactionStatePurchasing , yang merupakan alasan untuk "Pulihkan" string sedang dicatat saat pembelian.

Hai Teman-teman, maaf atas keterlambatannya.

Saya sedang meninjau dan saya menemukan solusi untuk masalah ini. Masalahnya adalah bahwa sebelum memanggil pembelian pemulihan, transaksi yang baru dibuka dari pembelian pemulihan yang sama tidak ditutup dengan benar. Lalu saya tutup paksa.

Kemudian fungsi clearTransactionIOS perpustakaan, janji harus ditambahkan untuk menunggu transaksi ditutup menggunakan fungsi removeTransactions

Ini kode saya:

File: react-native-iap / ios / RNIapIos.m

  1. Ganti fungsi RCT_EXPORT_METHOD (clearTransaction) dengan kode berikut
RCT_EXPORT_METHOD(clearTransaction:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {  

    NSLog(@"\n\n\n  ***  clear remaining Transactions. Call this before make a new transaction   \n\n.");

    NSArray *pendingTrans = [[SKPaymentQueue defaultQueue] transactions];
    countPendingTransaction = (NSInteger)(pendingTrans.count);

    if (countPendingTransaction > 0) {
        [self addPromiseForKey:@"cleaningTransactions" resolve:resolve reject:reject];

        for (SKPaymentTransaction *transaction in pendingTrans) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }

    } else {
        resolve(nil);
    }
}
  1. Tambahkan fungsi baru berikut (Saya menambahkan fungsi ini di akhir file RNIapIos.m. Sebelum baris "@end")
-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions {
    NSLog(@"removedTransactions");
    if (countPendingTransaction != nil && countPendingTransaction > 0) {
        countPendingTransaction--;
        if (countPendingTransaction == 0) {
            [self resolvePromisesForKey:@"cleaningTransactions" value:nil];
            countPendingTransaction = nil;
        }
    }
}

File: react-native-iap / ios / RNIapIos.h

  1. Di bawah kode "SKProduct * promotionProduct;" tambahkan baris berikut
  NSInteger countPendingTransaction;

Terakhir sebelum memanggil fungsi "RNIap.requestSubscription (productId, false)".
Fungsi clearTransactionIOS harus dipanggil, misalnya:

    if (Platform.OS === 'ios') {
      await RNIap.clearTransactionIOS();
    }
    await RNIap.requestSubscription(productId, false);

Saya harap ini membantu. Perilaku aneh mengembalikan pembelian saya belum dapat menemukan alasannya. Tapi ini diselesaikan untuk saya pengujian di Sandbox.

Jika Anda memiliki saran, beri tahu saya.

Saya juga memiliki masalah ini, tolong penulis, bantu saya, terima kasih keluarga Anda

Saya juga memiliki masalah ini, tolong penulis, bantu saya, terima kasih keluarga Anda

Hai sobat, Di komentar sebelumnya, langkah-langkah yang saya lakukan untuk menyelesaikannya dijelaskan

Jika Anda memiliki komentar, beri tahu saya

@andresordonezfm maukah Anda membuat PR untuk perubahan ini?

Untuk masalah pembelian SKPaymentTransactionStateRestored yang terjadi setelah pemulihan, saya membuat akun baru dan melakukan beberapa pembelian dan itu tidak terjadi untuk akun itu. Saya bisa menelepon RNIap.getAvailablePurchases() dan RNIap.requestSubscription() sesudahnya.

Tampaknya ini mungkin terkait dengan jumlah pembelian yang dimiliki pengguna? Saya belum menjalankan tes apa pun pada produksi.

Nah, setelah seharian "bersenang-senang", inilah yang telah saya simpulkan sejauh ini ... Saya memiliki berbagai perangkat dengan versi OS yang berbeda dan saya memiliki masalah ini pada masing-masing perangkat. Saya telah menghubungi Apple terkait hal ini dan kami masih menindaklanjuti kasus ini, tanpa kesimpulan yang pasti. Saya tidak percaya itu adalah masalah dengan paketnya, itu pasti ada sesuatu di pihak Apple. Saya sudah mencoba semua yang disebutkan orang di utas ini dan utas lain yang melaporkan masalah serupa. Dialog Pembelian Dalam Aplikasi tidak konsisten muncul dan sampai sekarang, saya tidak dapat menemukan alasan yang valid untuk itu karena hasilnya selalu berbeda. Terkadang saya mendapatkan kesalahan E_UNKNOWN, di lain waktu saya tidak mendapatkan umpan balik, terkadang pop up muncul setelah 10 menit menunggu dan di lain waktu itu berfungsi ... Saya sudah mencoba dengan pengguna kotak pasir, bukan pengguna kotak pasir, saya sudah punya hasil berbeda yang sama untuk pengguna dan perangkat yang sama dan bahkan kesalahan atau log yang meyakinkan / berwawasan tidak ditampilkan. Ini hanya membuat frustasi untuk men-debug karena Anda tidak dapat menemukan apa pun ... Nah, jika kalian memiliki saran atau wawasan, saya mendengarkan ... Sementara itu, jika saya memiliki berita dari Apple, Saya akan terus mengabari Anda ...
PS EDIT. setelah membaca komentar terakhir, ada satu hal yang konsisten dan saya dapat mengkonfirmasinya, di iOS 14 hal tersebut tampak lebih tidak konsisten meskipun terjadi pada setiap versi OS yang saya uji ini (12, 13.7, 14). Namun, saya masih mendapat kesan bahwa masalahnya tidak hanya terkait versi OS dan itulah mengapa saya berpikir itu pasti ada sesuatu dengan server Sandbox atau hal lain di pihak Apple ..

Persis apa yang saya alami di pihak saya, bahkan setelah perbaikan yang disarankan oleh @andresordonezfm (https://github.com/dooboolab/react-native-iap/issues/1120#issuecomment-734805587). @ 106firestarter , apakah Apple pernah membalas?

Saya akan melihat apa yang dapat saya temukan di forum pengembang sementara itu.

Untuk masalah pembelian SKPaymentTransactionStateRestored yang terjadi setelah pemulihan, saya membuat akun baru dan melakukan beberapa pembelian dan itu tidak terjadi untuk akun itu. Saya bisa menelepon RNIap.getAvailablePurchases() dan RNIap.requestSubscription() sesudahnya.

Tampaknya ini mungkin terkait dengan jumlah pembelian yang dimiliki pengguna? Saya belum menjalankan tes apa pun pada produksi.

Saya akan mencobanya, tetapi produksi juga menjadi perhatian.

Sebagai catatan, saya juga menelepon getAvailablePurchases() sebelum requestSubscription() .

Saya juga dapat mengonfirmasi bahwa dengan akun baru masalahnya tidak lagi seperti yang dinyatakan @Paduado (https://github.com/dooboolab/react-native-iap/issues/1120#issuecomment-742685043).

Koreksi: menggunakan akun baru bersama dengan perbaikan yang disarankan oleh @andresordonezfm membuatnya berfungsi di pihak saya. Tanpa perbaikan, setelah langganan pertama, perilaku yang sama yang saya alami sebelumnya muncul lagi dan saya tidak dapat berlangganan lagi. Satu hal lagi yang saya perhatikan setelah menerapkan perbaikan adalah bahwa langganan tampaknya tidak lagi otomatis diperpanjang secara otomatis, tidak sekali pun, meskipun menggunakan kotak pasir, mereka diharapkan memperbarui 5 kali.

@andresordonezfm maukah Anda membuat PR untuk perubahan ini?

Hai, sobat maaf atas keterlambatannya lagi. Saya membuat permintaan tarik untuk react-native IAP

~ Saya juga dapat mengonfirmasi bahwa dengan akun baru masalahnya tidak lagi seperti yang dikatakan @Paduado ( # 1120 (komentar) ). ~

Koreksi: menggunakan akun baru bersama dengan perbaikan yang disarankan oleh @andresordonezfm membuatnya berfungsi di pihak saya. Tanpa perbaikan, setelah langganan pertama, perilaku yang sama yang saya alami sebelumnya muncul lagi dan saya tidak dapat berlangganan lagi. Satu hal lagi yang saya perhatikan setelah menerapkan perbaikan adalah bahwa langganan tampaknya tidak lagi otomatis diperpanjang secara otomatis, tidak sekali pun, meskipun menggunakan kotak pasir, mereka diharapkan memperbarui 5 kali.

Halo, saya pikir ini adalah masalah kotak pasir. Apakah Anda terus memberikan perilaku itu?

@andresordonezfm ya, saya juga curiga ada masalah dengan kotak pasir Apple. Saya tidak melakukan tes lagi sejak komentar terakhir saya dan saya belum memeriksa produksi. Namun, hingga saat ini, saya tidak menerima keluhan dari pelanggan.

Kotak pasir tampaknya kembali ke jalur saya saat menggunakan akun baru, seperti yang dilaporkan sebelumnya oleh @Paduado , tanpa membuat perubahan apa pun pada kode. 🤷‍♂️ 😕

@andresordonezfm Saya mengalami hal yang sama dan patch Anda untuk memperbaikinya. Namun, saya rasa saya melihat bug halus dalam kode Anda yang berpotensi menyebabkan cleartTransactionsIOS() hang. removeTransactions dapat dipanggil dengan 1 atau lebih transaksi yang akan dihapus. Jadi di removeTransactions , saya pikir kita ingin:

        countPendingTransaction -= [transactions count];

Dalam praktiknya, saya hanya melihat removedTransactions dipanggil dengan satu transaksi, tetapi dokumen Apple mengatakan itu bisa jadi satu atau lebih. Temuan bagus omong-omong! Saya terjebak dalam hal ini untuk sementara waktu.

@andresordonezfm Saya mengalami hal yang sama dan patch Anda untuk memperbaikinya. Namun, saya rasa saya melihat bug halus dalam kode Anda yang berpotensi menyebabkan cleartTransactionsIOS() hang. removeTransactions dapat dipanggil dengan 1 atau lebih transaksi yang akan dihapus. Jadi di removeTransactions , saya pikir kita ingin:

        countPendingTransaction -= [transactions count];

Dalam praktiknya, saya hanya melihat removedTransactions dipanggil dengan satu transaksi, tetapi dokumen Apple mengatakan itu bisa jadi satu atau lebih. Temuan bagus omong-omong! Saya terjebak dalam hal ini untuk sementara waktu.

Hai bung, terima kasih atas rekomendasi Anda. Saya menguji proposal Anda dan itu berhasil untuk saya. Saya membuat permintaan tarik dengan perubahan itu.

Catatan: Ya, saya meninjau dokumentasi itu tetapi karena hanya dijalankan dari satu transaksi ke transaksi lain saya tidak menerapkannya. Tapi itu adalah rekomendasi yang sangat bagus. Terima kasih!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat