React-native-iap: buySubscription mengembalikan E_UNKNOWN meskipun pembelian berhasil

Dibuat pada 13 Okt 2018  ·  30Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

2.2.2 (karena ada versi yang lebih baru gagal di iOS karena # 279)

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

iOS

Perilaku yang diharapkan

Tidak ada kesalahan yang harus dilakukan. Pembelian berhasil (langsung dan dalam produksi)

Perilaku sebenarnya

E_UNKNOWN error dikembalikan dari Promise
Pelacakan kesalahan Sentry.io kami melaporkan ini:

{"framesToPop":1,"code":"E_UNKNOWN","nativeStackIOS":["0   LuCoaching                          0x000000010062f6fc LuCoaching + 1996540","1   LuCoaching                          0x000000010060aa98 LuCoaching + 1845912","2   LuCoaching                          0x00000001007cad98 __cxa_throw + 438380","3   LuCoaching                          0x00000001007cc62c __cxa_throw + 444672","4   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","5   libdispatch.dylib                   0x000000019d025610 <redacted> + 56","6   LuCoaching                          0x00000001007cc46c __cxa_throw + 444224","7   libdispatch.dylib                   0x000000019d0776c8 <redacted> + 24","8   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","9   libdispatch.dylib                   0x000000019d0249ec <redacted> + 1068","10  CoreFoundation                      0x000000019d5ce1bc <redacted> + 12","11  CoreFoundation                      0x000000019d5c9084 <redacted> + 1964","12  CoreFoundation                      0x000000019d5c85b8 CFRunLoopRunSpecific + 436","13  GraphicsServices                    0x000000019f83c584 GSEventRunModal + 100","14  UIKitCore                           0x00000001ca444bc8 UIApplicationMain + 212","15  LuCoaching                          0x000000010044d110 LuCoaching + 20752","16  libdyld.dylib                       0x000000019d088b94 <redacted> + 4"],"userInfo":{"NSLocalizedDescription":"Verbindung mit iTunes Store nicht möglich"},"domain":"SKErrorDomain","line":26,"column":1877,"sourceURL":"/var/containers/Bundle/Application/818C8439-E250-42E8-AD57-EC4FB5FE5547/LuCoaching.app/main.jsbundle"}

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat Nyata. Pelanggan langsung. Sangat konsisten gagal

Langkah-langkah untuk mereproduksi perilaku

Saat menguji prosedur dengan pengguna Sandbox kesalahan tidak dapat direproduksi.

🐛 bug 📱 iOS

Komentar yang paling membantu

: +1: Kami mengalami masalah ini dengan baik. Tampaknya ini terjadi pada sekitar 10% pengguna kami saat ini. Kami akan mencoba menambahkan pendengar ini, tetapi saya tidak berpikir bahwa pada akhirnya ini adalah solusi yang bagus. @hyochan Adakah cara agar kami dapat memperoleh informasi yang lebih detail dalam kasus di mana ini terjadi, atau apakah itu merupakan respons standar dari API StoreKit? Dalam setiap kasus kesalahan, pesan sepertinya "Tidak dapat terhubung ke iTunes Store", bahkan ketika pembelian berhasil.

Semua 30 komentar

@ Gaia-Nutrition Maukah Anda memeriksa edisi lama ini? Mungkin penyebabnya sama.
https://github.com/dooboolab/react-native-iap/issues/201

@JJMoon di # 201 kesalahannya adalah E_DEVELOPER_ERROR dan disebabkan oleh tidak mengisi daftar validProducts menggunakan getSubscriptions() .
Namun, saya memanggil fungsi tersebut sebelum mencoba melakukan pembayaran dan saya juga mendapatkan kesalahan yang berbeda.
Tapi sekarang aku memikirkannya. Bisa saja terjadi penundaan waktu yang cukup lama antara panggilan getSubscriptions() dan buySubscription() disebabkan oleh pengguna yang mempertimbangkan kembali jika dia ingin melakukan pembelian. Mungkinkah ini menjadi masalah? Sementara itu, aplikasi mungkin telah di-background.
EDIT: Tapi sekali lagi pembelian berhasil dieksekusi sehingga masalahnya harus di mana respon toko aplikasi sedang diproses

Halo,

Perilaku masalah yang sama dengan "buyProductWithoutFinishTransaction" atau "buyProduct".

Versi 2.2.1

pengembalian disimpan
{ "framesToPop": 1, "code": "E_UNKNOWN", "nativeStackIOS": [...], "userInfo": { "NSLocalizedDescription": "Connexion à l’iTunes Store impossible" }, "domain": "SKErrorDomain", "line": 16, "column": 1599, "sourceURL": "..." }

Kami memperbarui modul karena kami mereproduksi bug ini pada produksi dengan versi sebelumnya.

Bagian yang menarik adalah bahwa pembelian pemulihan juga gagal untuk pengguna saya saat ini terjadi. Ini hanya terjadi pada sekitar 1% pengguna iOS kami.

@fierysolid Kasus yang sama, kami sekitar 5% pembelian di iOS yang gagal. Saat pelanggan mencoba untuk membeli lagi, dia memiliki pop-up pemulihan pembelian.

Halo semuanya. Saya harap ini diperbaiki dalam versi baru kami hari ini yaitu 2.3.15 . Saya telah memperhatikan bahwa menggunakan NSDictionary di ios murni tidak aman untuk digunakan dan dapat menyebabkan perilaku yang tidak terduga. Saya telah memperbaikinya dan berharap sekarang berfungsi dengan baik di setiap perangkat. Silakan uji ini.

Harap buka kembali saat masih menghadapi masalah.

@doobool
Saya masih mendapatkan masalah ini saat menggunakan buySubscription() dengan pengguna penguji kotak pasir dengan iPhone 6S.

{"userInfo":{"NSLocalizedDescription":"Cannot connect to iTunes Store"}}

@danrevah Jadi Anda telah mencoba versi baru kami yaitu 2.3.15 ? @JJMoon Bisakah Anda menguji ini sekali lagi?

@ dooboolab ya Saya menggunakan versi itu.

@danrevah Silakan coba 2.3.16 .

@dooboolab berhasil sekali, tetapi ketika saya mencoba lagi saya terus mendapatkan kesalahan ini. (digunakan v 2.3.17)

@JJMoon Apakah Anda punya petunjuk tentang ini? dia menggunakan iPhone6S

Saya telah membuka kembali masalahnya. cc @JAV_banget

Jika lebih banyak orang yang memberikan suara untuk masalah ini, kami akan berusaha lebih keras untuk menggali lebih dalam.

@danrevah Saya harap Anda merujuk pada dokumen ini.
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
Untuk menguji langganan dalam mode kotak pasir, Anda perlu membeli kembali langganan setelah beberapa waktu.
Dan Anda mungkin perlu membatalkannya untuk membeli lagi.
Dan ada beberapa reaksi aneh dari server kotak pasir Apple, yang membuat pengujian lebih sulit.

Jika kasus @JJMoon adalah masalahnya, kami dapat menutupnya lagi. Silakan buka kembali jika Anda masih membutuhkan bantuan untuk yang satu ini. @bayu_joo

@JJoon Saya menghadapi masalah yang sama. ada solusi? buySubscription memberikan pengecualian, namun pembayaran dipotong. Saya perlu memiliki data hasil untuk menyimpan dan memvalidasinya.
@yoyan

+1 Saya punya masalah yang sama

Coba gunakan addAdditionalSuccessPurchaseListenerIOS di buySubscription juga. Ini adalah masalah yang sama seperti di # 307.

Coba gunakan addAdditionalSuccessPurchaseListenerIOS di buySubscription juga. Ini adalah masalah yang sama seperti di # 307.

Apakah seseorang sudah menggunakan dalam produksi?

@hyochan , saya sudah mencoba melakukan itu tetapi tidak berhasil.

if (subscription && subscription.success) {
      this.props.subscribe(subscription.result);
    } else {
      if (Platform.OS === 'ios') {
        const sub = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
          this.props.subscribe(purchase); // -> This code is never fired
          sub.remove();
        });
      }
    }

@cbanca Harap ikuti kode yang sebenarnya. Anda bahkan tidak menggunakan promises . Anda harus mendengarkan addAdditionalSuccessPurchaseListenerIOS setelah penolakan janji.

Anda juga tidak perlu tambahan Platform.OS === 'ios' .

@yoyok
Maaf atas ketidaktahuan saya, tapi saya rasa saya tidak mengerti dengan benar. Saya mengikuti dasar yang sama dari contoh, menyesuaikan skenario saya. Saya membuat abstraksi yang memperlakukan janji ini menggunakan async / await. Objek langganan ini dikembalikan oleh abstraksi saya.

static purchaseSubscription(newSubscriptionID, currentSubscriptionID) {
    if (Platform.OS === 'ios') {
      const purchaseResult = KinvoBilling.purchaseSubscriptionIOS(newSubscriptionID);
      return purchaseResult;
    }

    const purchaseResult = KinvoBilling.purchaseSubscriptionANDROID(newSubscriptionID, currentSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionANDROID = async (newSubscriptionID, currentSubscriptionID) => {
    const hasCurrentSubscription = currentSubscriptionID !== null;

    if (hasCurrentSubscription) {
      const purchaseResult = KinvoBilling.updateSubscription(newSubscriptionID, currentSubscriptionID);
      return purchaseResult;
    }
    const purchaseResult = KinvoBilling.buySubscription(newSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionIOS = async (subscriptionID) => {
    await KinvoBilling.getSubscriptions();
    const purchaseResult = await KinvoBilling.buySubscription(subscriptionID);

    return purchaseResult;
}

@bayu_joo
``
static purchaseSubscriptionIOS = async (subscriptionID) => {
menunggu KinvoBilling.getSubscriptions ();
coba {
const purchaseResult = menunggu KinvoBilling.buySubscription (subscriptionID);
} tangkap (err) {
const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS (async (pembelian) => {
// dooboolab => periksa panggilan di sini.
this.setState ({recehan: purchase.transactionReceipt}, () => this.goToNext ());
subscription.remove ();
}
}
return purchaseResult;
}
`` ''

Periksa kode di atas. Saya pikir Anda perlu merefaktor kode Anda agar sesuai dengan siklus hidupnya.

@hyochan Tidak bekerja untuk saya.

Skenario pengujian saya adalah:

  • Beli paket berlangganan bulanan - Oke
  • Tingkatkan ke paket langganan tahunan - Kegagalan dan pendengar tidak berfungsi

Keraguan lain: Apakah saya harus menggunakan finishTransaction () di langganan juga?

Saya melihat kesalahan ini juga. Dan saya rasa saya tahu satu cara untuk mereproduksinya.

Versi react-native-IAP

^ 2.4.1

Versi react-native

https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz

Peron

iOS, saat menguji di TestFlight di perangkat nyata.

Pengamatan

Saya perhatikan bahwa ketika ada fungsi RNIap yang dipanggil di aplikasi saya, iOS akan meminta saya memasukkan kata sandi untuk pengguna iTunes / App Store sebelumnya (yang telah saya logout dan ganti melalui Pengaturan iOS). Saya membaca di suatu tempat secara online bahwa ini adalah masalah yang sering mengganggu pengguna iPhone: terkadang aplikasi dibeli dengan satu akun iTunes, kemudian ponsel dialihkan ke akun iTunes baru, tetapi aplikasi terus meminta kata sandi untuk akun iTunes lama.

Saya mencoba menghapus aplikasi saya (dan TestFlight) dan menginstal ulang dengan pengguna App Store baru, tetapi tidak berhasil. Satu-satunya cara saya bisa menghilangkan perilaku ini adalah dengan menghapus perangkat. Setelah saya melakukan ini, saya tidak dapat lagi mereproduksi kesalahan ini.

Perilaku Sebenarnya

  1. buySubscription ()
  2. Pilih Lanjutkan ketika disajikan dengan modal iOS "Persyaratan Langganan"
  3. Pilih OK ketika disajikan dengan modal iOS "Konfirmasi Langganan"
  4. Kesalahan dilempar oleh buySubscription ():
{
   code: E_UNKNOWN, 
   column: 1565, 
   domain: NSURLErrorDomain, 
   framesToPop: 1, 
   line: 20, 
   nativeStackIOS: [...],
   sourceURL: ...,
   userInfo: {
      _kCFStreamErrorCodeKey: -4, 
      _kCFStreamErrorDomainKey: 4, 
      NSErrorFailingURLKey: None, 
      NSErrorFailingURLStringKey: https://p100-sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/inAppBuy, 
      NSLocalizedDescription: Cannot connect to iTunes Store, 
      NSUnderlyingError: {
         code: "-1005", 
         domain: "kCFErrorDomainCFNetwork", 
         message: "underlying error", 
         nativeStackIOS: [...],
         userInfo:{"NSErrorPeerAddressKey":null,"_kCFStreamErrorCodeKey":-4,"_kCFStreamErrorDomainKey":4}
      }
   }
}

Langkah-langkah untuk mereproduksi perilaku

  1. Buat pengguna uji coba di App Store Connect
  2. Instal aplikasi dari App Store (atau undang pengguna uji ke TestFlight dan instal TestFlight lalu aplikasi melalui TestFlight)
  3. Beli langganan di aplikasi
  4. Biarkan langganan berakhir
  5. Keluar iOS ID Apple (Pengaturan> ID Apple, Keluar)
  6. Masuk ID Apple baru
  7. Beli langganan di aplikasi

Semoga ini bisa membantu seseorang!

@yoyok

Setelah mencoba banyak hal, saya masih memiliki masalah yang sama dan banyak lagi. Pada kode di bawah, RNIap.buySubscription (sku) mengembalikan tidak terdefinisi. Tolong, apakah seseorang menyelesaikannya?

``
static purchaseSubscriptionIOS = async (subscriptionID) => {
menunggu KinvoBilling.getSubscriptions ();

try {
  const purchaseResult = await RNIap.buySubscription(subscriptionID);
  return createResponse(true, purchaseResult);
} catch (error) {
  const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
    // dooboolab => check the call here.
    console.tron.log('--- ERROR ----');
    console.tron.log(error);
    console.tron.log('--- PURCHASE ----');
    console.tron.log(purchase);
    const result = purchase;
    subscription.remove();
    console.tron.log(result);

    if (result) {
      return createResponse(true, result);
    }
    return createResponse(false, result);
  });
}

};
``

: +1: Kami mengalami masalah ini dengan baik. Tampaknya ini terjadi pada sekitar 10% pengguna kami saat ini. Kami akan mencoba menambahkan pendengar ini, tetapi saya tidak berpikir bahwa pada akhirnya ini adalah solusi yang bagus. @hyochan Adakah cara agar kami dapat memperoleh informasi yang lebih detail dalam kasus di mana ini terjadi, atau apakah itu merupakan respons standar dari API StoreKit? Dalam setiap kasus kesalahan, pesan sepertinya "Tidak dapat terhubung ke iTunes Store", bahkan ketika pembelian berhasil.

Kami memiliki masalah yang sangat mirip dengan 3.4.6: Upaya pembelian pertama gagal dengan E_UNKOWN , percobaan ulang berhasil. Namun, bagi kami ini terjadi dengan buyProduct , bukan dengan buySubscription . @hyochan, apakah ini masih bisa menjadi penyebab utama yang sama?

Halo! Saya mengalami masalah yang sama setelah menelepon RNIap.requestSubscription () Saya mendapatkan hasil yang tidak ditentukan tetapi pembayaran berhasil, kartu kredit dikenai biaya.

Satu-satunya cara pengguna itu melewatinya adalah dengan memulihkan pembelian.

Apakah ada yang bisa memperbaikinya? Saya menggunakan versi 3.5.9

Apakah halaman ini membantu?
0 / 5 - 0 peringkat