React-native-iap: finishTransactionIOS / finishTransaction tidak melakukan apa-apa untuk iOS

Dibuat pada 19 Feb 2020  ·  34Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

4.4.1

Versi react-native

0.60.4

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

iOS

Perilaku yang diharapkan

Setelah memanggil finishTransactionIOS (purchaseId) atau finishTransaction (pembelian) untuk langganan, transaksi harus diselesaikan dan tidak dikirim ke aplikasi lagi pada peluncuran berikutnya. Jika ada masalah dengan ini, saya mengharapkan sesuatu untuk dikembalikan baik ke pendengar kesalahan atau dalam janji dari salah satu fungsi finishTransaction, tidak ada yang terjadi.

Android sepertinya berfungsi dengan baik.

Perilaku sebenarnya

Transaksi dikeluarkan pada setiap peluncuran tunggal kecuali clearTransactionIOS dipanggil, yang tampaknya memiliki efek samping lain.

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat Nyata

Langkah-langkah untuk mereproduksi perilaku

  • Buat produk langganan.
  • Beli langganan
  • Simulasikan validasi backend
  • Panggil finishTransactionIOS atau finishTransaction pada langganan itu. Tidak berpengaruh.

Saya telah mencoba tumpukan ini dengan berbagai cara, dan sama sekali tidak ada yang berhasil, apa pun yang saya lakukan, selain menghapus transaksi, pembelian kembali dipancarkan ke aplikasi setiap peluncuran. Adakah ide apa yang sedang terjadi atau apa yang mungkin saya lakukan atau pemahaman yang salah?

ℹ needs more info 📱 iOS 🙏 help wanted 🚶🏻 stale

Komentar yang paling membantu

@hyochan ada pembaruan tentang masalah ini? Kami telah macet selama beberapa waktu dan tidak dapat menerbitkan aplikasi kami.

Semua 34 komentar

Saya memiliki masalah yang sama.

Bisakah Anda membagikan ackResult ?

          try {
            const ackResult = await finishTransaction(purchase);
            console.log('ackResult', ackResult);
          } catch (ackErr) {
            console.warn('ackErr', ackErr);
          }

@yoyok
Dalam kasus saya:
ackResult undefined

@yoyok
Dalam kasus saya:
ackResult undefined

Sama disini

Juga dalam kasus saya, nilai yang dikembalikan tidak ditentukan (perangkat nyata dengan pengguna kotak pasir).

Sepertinya terkait dengan # 366. Juga untuk ios finishTransaction tidak akan mengembalikan apa pun.
Bisakah Anda semua fokus pada # 366 dan kembali untuk pembaruan?

Sepertinya terkait dengan # 366. Juga untuk ios finishTransaction tidak akan mengembalikan apa pun.
Bisakah Anda semua fokus pada # 366 dan kembali untuk pembaruan?

Hanya untuk memperjelas - karena # 366 adalah tentang pengujian, apakah Anda menyarankan agar ini berfungsi dengan baik dalam produksi tanpa perlu clearTransactionIOS?

@hyochan Ketika saya menguji konfigurasi debug dengan akun kotak pasir pada dasarnya saya mendapatkan pemberitahuan dari Server ke Server Notifications (Apple) tentang pembelian. Masalahnya adalah setelah beberapa waktu pendengar klien saya mendapat pemberitahuan lain tentang pembelian tetapi dengan transactionId yang berbeda bahkan ketika tindakan pembelian terjadi hanya satu kali sehingga sepertinya masalah dengan menyelesaikan transaksi sebelumnya dengan benar. Di Android, semuanya berfungsi dengan baik dan saya pikir itu tidak terkait dengan # 366 karena saya tidak punya masalah untuk menguji proses pembelian dengan akun kotak pasir.

`` tsx
useEffect (() => {
purchaseUpdateSubscription.current = purchaseUpdatedListener (
async (pembelian: InAppPurchase | SubscriptionPurchase) => {
penerimaan const = pembelian.transactionReceipt;
if (tanda terima) {
coba {
menunggu myBackendHandler ({
pengguna,
membeli,
});
hasil const = menunggu RNIap.finishTransaction (pembelian, salah);
console.log ('result', result);
} tangkap (e) {
// MELAKUKAN
}
}
}
);
kembali () => {
if (purchaseUpdateSubscription.current) {
purchaseUpdateSubscription.current.remove ();
purchaseUpdateSubscription.current = null;
}
};
}, []);
`` ''

Hai tim, terima kasih atas semua kerja keras di perpustakaan ini, ini benar-benar membuat hidup kita lebih mudah. Saya berkomentar karena masalah ini belum terselesaikan dan saya tidak melihat berapa lama transaksi yang tidak kliring ada hubungannya dengan # 366.

Kasus penggunaan saya adalah

  1. Pengguna 1 melakukan pembelian dan manfaat premium diterapkan ke akun mereka.
  2. Pengguna 1 keluar
  3. Pengguna 2 masuk

Hasil yang diharapkan:

  • Transaksi dari Pengguna 1 tidak dikeluarkan melalui pendengar pembelian

Hasil sebenarnya

  • Transaksi dari Pengguna 1 TIDAK dihapus dan dikeluarkan lagi. Meskipun pengguna baru telah masuk menyebabkan data buruk.

Ini hanya contoh mengapa penting untuk memprioritaskan masalah ini. Terima kasih telah membaca komentar panjang ini ...

sama disini

Persis masalah yang sama seperti di atas, sepertinya tumpukan tidak dibersihkan sama sekali, bahkan setelah memutuskan akun kotak pasir / itunes, reboot perangkat, instal ulang aplikasi ..: /

Dapatkah Anda memverifikasi bahwa finishTransaction benar-benar tidak melakukan apa-apa dalam file RNIapIos.m ?
Saya baru saja memeriksanya dan menyelesaikan transaksinya dengan benar.

Silakan periksa metode clearTransaction atau finishTransactionWithIdentifier dan coba masukkan log apa pun ke dalamnya. Cobalah untuk menemukan kode di bawah ini.

RCT_EXPORT_METHOD(clearTransaction) {
    NSArray *pendingTrans = [[SKPaymentQueue defaultQueue] transactions];
    NSLog(@"\n\n\n  ***  clear remaining Transactions. Call this before make a new transaction   \n\n.");
    for (int k = 0; k < pendingTrans.count; k++) {
        [[SKPaymentQueue defaultQueue] finishTransaction:pendingTrans[k]];
    }
-(void)finishTransactionWithIdentifier:(NSString *)transactionIdentifier {
    SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];
    for(SKPaymentTransaction *transaction in queue.transactions) {
        if([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
    }
}

Saya tidak dapat memajukan masalah ini karena saya tidak mengerti apa yang terjadi. Saya berharap seseorang dapat men-debug berbagai hal di lingkungannya dan membagikannya 🙏

ada pembaruan tentang masalah ini?

up, saya mengalami masalah ini juga.

sama di sini finishTransactionIOS / finishTransaction ini tidak berfungsi di IOS

Saya sepertinya mengalami hal yang sama.
Pembelian IAP berhasil diselesaikan, tetapi panggilan terakhir ke finishTransaction mengembalikan undefined .

// Finish transaction
const ackResult = await finishTransaction(purchase);
console.log("Ack result: ", ackResult); // Ack result: undefined

_Perangkat nyata "iPhone 6s" menggunakan lingkungan App Store Sandbox._

Apa hasil yang diharapkan dari finishTransaction? Apakah undefined hasil yang bagus atau haruskah saya mengharapkan sesuatu yang lain?

Saya juga mengalami masalah ini di iOS, di mana baik finishTransactionIOS atau finishTransaction tidak benar-benar menghapus transaksi tersebut, yang mencegah saya untuk merilis aplikasi. Perubahan apapun?

@hyochan Meskipun saya jelas tidak fasih dalam Objective-C, saya menambahkan beberapa log di finishTransaction dan finishTransactionWithIdentifier dan tampaknya mereka berjalan dengan benar (id diteruskan dan dicocokkan). Satu-satunya hal yang dapat saya pikirkan adalah bahwa [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; sebenarnya tidak terhubung ke StoreKit dan menyelesaikan transaksi? Saya tidak benar-benar tahu ke mana harus pergi dari sini tapi semoga ini membantu saat Anda men-debug

Apakah Anda juga menangani pemberitahuan status langganan dari App Store? Dalam kasus saya, saya mengalami masalah ini sampai saya memastikan server saya menangani semua peristiwa pemberitahuan dengan benar dan merespons dengan 200.

@espenjanson Menarik. Tidak, saya tidak. Tapi saya sebenarnya baru saja beralih ke modul InAppPurchases expo kemarin dan semuanya berfungsi dengan baik sekarang.

@lachlangit Itu hanya satu serangan keberuntungan (?) Atau sesuatu yang lain. Buat versi lain dari aplikasi dan masalahnya ada lagi. Berpikir untuk melakukan hal yang sama tetapi sedikit khawatir repo expo tidak terawat dengan baik.

Saya telah memeriksanya dan itu benar bahwa itu kembali tidak ditentukan sejak panggilan finishTransactions tidak dimaksudkan untuk mengembalikan apa pun dalam obj-c.
Saya telah melakukan beberapa tes dan dalam kasus saya, tampaknya menyelesaikannya dengan benar (tes sederhana, tarik tertundaTransactions, jika tidak ada, itu berfungsi dengan baik)

@espenjanson Saya tidak tahu apa yang membuat Anda berpikir bahwa paket Expo tidak terawat dengan baik. Saya pikir Expo merilis modul IAP mereka baru-baru ini. Jika saya tahu expo memiliki modul IAP pada saat saya mengimplementasikan IAP, saya akan memilih expo tanpa berpikir dua kali.

Apakah ada cara untuk mengatasi ini?
Saya telah menguji ini di TestFlight bahkan dengan pengguna kotak pasir baru dan itu masih terus terjadi.

purchaseUpdateListener terus menerima transaksi "lama".
Saya menelepon finishTransaction(purchase,false) karena saya menggunakan langganan yang dapat diperpanjang otomatis.
Hasil dari panggilan tersebut adalah undefined .

Adakah yang bisa menawarkan solusi atau penjelasan mengapa ini terjadi?

@zatloeri Itu rupanya perilaku yang diinginkan. Butuh beberapa saat untuk menyadarinya. App Store akan memasang tanda terima baru untuk pembaruan di StoreKit yang memicu pengamat. Anda harus memproses tanda terima itu dan menyelesaikan transaksi.

https://developer.apple.com/videos/play/wwdc2018/705/
https://developer.apple.com/videos/play/wwdc2020/10671

(tonton di Safari untuk kualitas HD)

@ziyoshams Terima kasih atas balasan cepat dan sumber daya yang akan saya lihat sebentar lagi.

Tapi pertama-tama saya hanya ingin menunjukkan satu hal karena saya rasa saya tidak berhasil.
Apa yang Anda gambarkan tampaknya logis bagi saya dan saya mengharapkan ini terjadi, tetapi yang membuat saya bingung adalah ini:

Produk A telah kedaluwarsa sebagaimana diverifikasi oleh receipt validation .
Saya menerima satu transaksi lama (dari hari sebelumnya) untuk produk A ketika saya memulai atau latar depan aplikasi.
Kemudian saat berikutnya saya membuka aplikasi lagi, saya menerima transaksi lama (mungkin sedikit lebih baru dari sebelumnya, tidak yakin) untuk produk A.
Di latar depan lain mungkin yang lain dan seterusnya.

Saya berharap untuk mendapatkan semuanya dalam satu aplikasi jika langganan sudah setelah kedaluwarsa.
Apakah ini juga perilaku yang diharapkan, atau adakah sesuatu yang mencurigakan terjadi?

@zatloeri Setiap transaksi yang belum selesai akan muncul dalam antrian tersebut, meskipun sudah kadaluarsa. Untuk langganan bulanan, Anda akan menerima tanda terima itu setiap 5 menit atau lebih. Seperti jika Anda membeli sesuatu dan kembali ke aplikasi keesokan harinya, Anda akan mendapatkan 5-6 tanda terima pada saat yang bersamaan. Saya sangat merekomendasikan menonton video WWDC tersebut. Mereka sangat membantu.

Saya mengalami masalah yang sama di iOS, transaksi belum selesai jadi, Antrean tidak kosong dan tanda terima muncul kembali setiap kali aplikasi diluncurkan. Saya telah memverifikasi tanda terima di sisi server, lalu menyelesaikan transaksi. Silakan lihat kode saya di bawah ini

saya telah menyebutkan beberapa potongan kode saya di bawah ini ...

``
impor RNIap, {
InAppPurchase,
Produk,
PurchaseError,
Berlangganan,
SubscriptionPurchase,
finishTransaction,
finishTransactionIOS,
purchaseErrorListener,
purchaseUpdatedListener,
clearTransactionIOS,
} dari 'react-native-iap';

async componentDidMount () {
hasil const = menunggu RNIap.initConnection ();
const itemSubs = Platform.select ({
android: [
get (this.props, 'subscriptionStore.subscription.android_product_id', null)
],
ios: [
get (this.props, 'subscriptionStore.subscription.ios_product_id', null)
]
});

const subscription = menunggu RNIap.getSubscriptions (itemSubs);
purchaseUpdateSubscription = purchaseUpdatedListener (
async (pembelian) => {
penerimaan const = pembelian.transactionReceipt;
biarkan berlangganan = {
subscription_id: get (this.props, 'subscriptionStore.subscription.id', null)
};
if (Platform.OS === 'ios') {
langganan = {
... berlangganan,
order_id: dapatkan (pembelian, 'transactionId', null),
purchase_token: dapatkan (pembelian, 'originalTransactionIdentifierIOS', null),
tanda terima: get (pembelian, 'transactionReceipt', null), // (Simpan di TEXT)
os: 'IOS'
}
} lain jika (Platform.OS === 'android') {
const data = JSON.parse (tanda terima);
langganan = {
... berlangganan,
order_id: get (data, 'orderId', null),
purchase_token: get (data, 'purchaseToken', null),
os: 'ANDROID'
}
}
coba {
finishTransaction (pembelian, salah); // ini di sini untuk sementara, itu akan ditempatkan pada kesuksesan nanti.
this.props.notificationStore.showToast ('Berhasil berlangganan. Harap tunggu ...', 'berhasil', 5000);
const resp = menunggu this.props.subscriptionStore.onPurchase (langganan); // memverifikasi transaksi di ujung server.
if (resp.success) {// respons sukses
this.props.userStore.setUser ({is_premium: 1});
this.props.navigation.replace ('FixFooter');
}
} tangkap (kesalahan) {
console.log ("onPurchase API ERROR:", error);
}
}
)

purchaseErrorSubscription = purchaseErrorListener (
asinkron (kesalahan) => {
console.log ('kesalahan pembelian:', kesalahan);
}
)
}

/ * Tombol onPurchase * /
async onPurchase () {
coba {
const request = menunggu RNIap.requestSubscription (Platform.OS === 'android'?
get (this.props, 'subscriptionStore.subscription.android_product_id', null):
get (this.props, 'subscriptionStore.subscription.ios_product_id', null))
} tangkap (kesalahan) {
console.log ('error:', error)
}
}

@ sufyan297 dapatkah Anda membagikan potongan dari kode sisi server Anda? Saya juga mencoba menyiapkan verifikasi tanda terima tetapi dokumen Apple sangat membingungkan

@ziyoshams Apakah Anda mendapatkan null juga menggunakan metode finishTransaction modul IAP expo?

@bcbcbcbcbcl Saya tidak menggunakan modul expo.

+1 bagi saya itu kembali tidak ditentukan

@hyochan ada pembaruan tentang masalah ini? Kami telah macet selama beberapa waktu dan tidak dapat menerbitkan aplikasi kami.

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat