Menghapus pembelian dari kotak pasir pembelian dalam aplikasi iOS untuk pengguna uji

116

Adakah yang punya ide tentang cara mengatur ulang dan / atau menghapus kotak pasir pembelian dalam aplikasi iOS?

Saya memiliki aplikasi yang saya uji dengan kotak pasir, dan saya ingin menguji pembelian baru tanpa harus membuat pengguna uji baru setiap kali saya membeli sesuatu.

Jika saya tidak melakukan ini, maka saya (tentu saja) selalu mendapatkan pesan bahwa item pembelian dalam aplikasi telah dibeli ketika saya mengklik tombol beli aplikasi saya.

RandomIOSDeveloper
sumber

Jawaban:

75

IMO ada 3 hal yang dapat Anda lakukan untuk membuat pengujian non-bahan habis pakai dapat diterima:

  1. Anda dapat memiliki banyak akun uji yang dikaitkan dengan satu email. Gmail misalnya memungkinkan Anda menambahkan string "plus" ke email untuk membuat alias untuk alamat : jadi [email protected]dan [email protected]keduanya benar-benar masuk ke [email protected]. Mungkin host email lain melakukan hal yang sama. Saat Anda membuat akun percobaan, Anda perlu memperkenalkan: nama depan, nama belakang, alamat email, kata sandi, pertanyaan rahasia, jawaban rahasia, tanggal lahir, dan negara toko iTunes. Anda dapat memasukkan data yang persis sama (termasuk kata sandi) untuk [email protected]dan [email protected]dan Anda akan memiliki dua akun uji. Terakhir, di [email protected]kotak masuk Anda, Anda akan menerima dua email verifikasi dari Apple untuk mengonfirmasi kedua akun uji.

  2. Misalkan Anda memiliki produk yang tidak dapat dikonsumsi dengan ID produk @ "Extra_Levels". Alih-alih menulis @ "Extra_Levels" di semua metode (requestProduct, purchaseProduct, ...), cukup tulis PRODUCT_ID1dan di beberapa file header letakkan #define PRODUCT_ID1 @"Extra_Levels"(tanpa titik koma!), Maka preprocessor akan mencari PRODUCT_ID1 dan menggantinya dengan @ "Extra_Levels". Kemudian membuat barang tak habis pakai baru bernama @ "Extra_Levels_01" dan mengubah #define sama baiknya dengan menyetel ulang pembelian untuk semua pengguna uji Anda.

  3. Seperti yang ditunjukkan oleh appsmatics, Anda dapat menguji perilaku yang benar dari kode Anda ketika Anda membeli IAP yang tidak dapat dikonsumsi dengan terlebih dahulu menggunakan IAP yang dapat dikonsumsi (sehingga pengguna uji dapat melakukan pembelian sebanyak yang diperlukan) untuk menghilangkan beberapa bug. Tentu saja, Anda juga harus menguji kode dengan IAP non-konsumsi nyata setelah itu.

Roberto Canogar
sumber
17
Wah, saya tidak pernah tahu fitur gmail super rahasia ini. Bermanfaat sekali!
bobobobo
4
Saya baru tahu bahwa Anda tidak perlu memverifikasi email pengguna uji coba Anda. Anda cukup meletakkan [email protected] dengan kata sandi tertentu (bahwa Anda masih akan menggunakan kata sandi dalam mode kotak pasir) dan itu masih berfungsi. Saya baru saja menguji tadi malam.
sooon
3
Trik TANDA PLUS untuk alias email bukanlah hal GMail saja. Ini adalah tradisi yang sangat lama di antara server email, sejak beberapa dekade yang lalu. Tapi itu tidak pernah dimasukkan ke dalam spesifikasi email apa pun. Jadi, uji dengan server email khusus Anda untuk memastikannya paham dengan fitur ini.
Basil Bourque
2
Saya tidak akan berpikir bahwa tidak mungkin untuk menghapus pembelian Dalam Aplikasi untuk akun percobaan;) Viva Apple :)
Bartłomiej Semańczyk
12
+alamat email tidak dapat lagi digunakan untuk mendaftar ID Apple.
pkamb
32

Anda tidak dapat melakukan ini, sejauh yang saya tahu. Backend kotak pasir berfungsi seperti akun sungguhan - setelah dibeli, dibeli (dan karenanya Anda dapat menguji pemulihan). Anda harus melakukan sebagian besar pengembangan Anda dengan barang-barang toko yang dikesampingkan, dan kemudian ketika Anda mengujinya secara nyata, cukup berharap untuk membuat beberapa akun pengujian.

Ben Zotto
sumber
3
Setuju dengan samvermette, ini adalah kacang yang pengujiannya bekerja sangat dekat dengan toko nyata. Setidaknya harus ada cara untuk menghapus pembelian di kotak pasir. Untuk melakukan beberapa pembelian untuk pengguna yang sama untuk tujuan pengujian, saya juga menambahkan tipe Consumable.
appsmatics
4
@samvermette Satu-satunya perbedaan adalah Anda SKPaymentTransactionStateRestoredkembali dari app store, bukan SKPaymentTransactionStatePurchased. Karena Anda tidak menggunakan uang sungguhan di sini, untuk semua maksud dan tujuan, SKPaymentTransactionStateRestoredsetara 100% SKPaymentTransactionStatePurchasedsejauh pengujian berjalan. Menyetel ulang status aplikasi Anda ke "belum dibeli" sepenuhnya terserah Anda (cukup hapus entri rantai kunci yang relevan atau apa pun yang Anda gunakan untuk menyimpan cache bahwa "pengguna membeli X")
bobobobo
10

Saya memiliki 2 item pembelian dalam aplikasi. 1 untuk produksi. dan yang lainnya untuk pengujian. ketika saya perlu "menghapus", saya menghapus item dalam aplikasi dan membuat yang baru (15 detik di itunes terhubung dan 1 detik untuk mengubah id produk dalam kode)

jika saya tidak perlu menguji "pengguna baru", saya menggunakan produksi dalam item aplikasi.

pengguna1105951
sumber
Ya, membuat salinan baru dari produk, dan mengubah nama produk dalam kode (mungkin memiliki #defined) sejauh ini merupakan solusi termudah untuk pengujian realistis.
JulianSymes
7

Nah, secara teknis Anda tidak membutuhkan itu.

Jika Anda mendapatkannya SKPaymentTransactionStateRestored, itu 100% setara dengan toko aplikasi yang memverifikasi pengguna dan memberinya pembelian. Saya memiliki sakelar seperti:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
  for( SKPaymentTransaction *purch in transactions )
  {
    switch( purch.transactionState )
    {
      case SKPaymentTransactionStateRestored:
        info( "PURCHASE RESTORE" ) ;
        // fall thru
      case SKPaymentTransactionStatePurchased:
        [[SKPaymentQueue defaultQueue] finishTransaction:purch];
        // Do regular changes to app state for this purchase,
        // register in keychain, etc.
        break ;

       //.. other cases
     }
  }
}

Pertanyaan tentang memiliki logika aplikasi Anda / mengambil kembali pembelian itu sederhana: jika Anda menyimpan pembelian dalam cache di rantai kunci, hapus rantai kunci Anda. Jika Anda melakukannya dengan cara lain, cukup ubah status aplikasi lokal Anda untuk berpura-pura seperti pengguna tidak pernah membelinya sebelumnya. Dialog permintaan untuk membeli masih sama persis, satu-satunya perbedaan adalah ketika Anda menekan YA, Anda SKPaymentTransactionStateRestoredmalah diberikan SKPaymentTransactionStatePurchased.

bobobobo
sumber
5

Menghapus aplikasi Anda dan memasangnya kembali juga berfungsi untuk pengujian kotak pasir. Bergantung pada aplikasinya jelas, tetapi saya sedang menguji aplikasi berbasis langganan yang hanya membeli saat mendaftar saat ini jadi itu adalah solusi termudah.

Christopher Larsen
sumber
3

Lihat SimStoreKit . Ini adalah "versi simulasi StoreKit iPhone, untuk menguji UI toko di Simulator iPhone, atau bahkan di perangkat tanpa harus menyiapkan IAP di Connect."

SimStoreKit menyimpan pembelian dalam default pengguna di bawah tombol ILSimSKTransactions. Jadi untuk menghapus semua pembelian yang dapat Anda lakukan:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]

Di simulator, Anda cukup menghapus aplikasi dan menginstalnya lagi.

Saya telah berhasil menggunakan SimStoreKit untuk men-debug bagian depan toko aplikasi saya sebelum mengujinya dengan kotak pasir. Keunggulan dari library ini adalah dapat diatur untuk menggunakan nama kelas yang sama dengan framework StoreKit yang sebenarnya (dengan melakukan #define ILSimReplaceRealStoreKit 1sebelum melakukan #include <ILSimStoreKit.h>).

Di file sumber tempat saya perlu mengakses StoreKit, saya menyertakan file header ini:

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR
    #define kILSimAllowSimulatedStoreKit 1
    #define ILSimReplaceRealStoreKit 1
    #import <ILSimStoreKit.h>
#else
    #import <StoreKit/StoreKit.h>
#endif

Ini memiliki efek menggunakan SimStoreKit saat saya menjalankan simulator dan StoreKit yang sebenarnya saat saya menjalankan di perangkat.

Emile Cormier
sumber
tidak bisa membuat ini bekerja. Saya mendapatkan kesalahan versi. Saya menyalin semua file di zip ke dalam proyek saya dan mengganti semua #import <StoreKit / StoreKit.h> dengan #define ILSimReplaceRealStoreKit 1 #import "ILSimStoreKit.h"
Jay Q.
Anda hanya perlu file yang dimulai dengan ILSimSK. Hal lainnya adalah untuk aplikasi demo. Mungkin Anda harus memposting pertanyaan dengan kesalahan persis yang Anda dapatkan. "Saya mendapatkan kesalahan versi" tidak menjelaskan banyak hal.
Emile Cormier
-1

sebagai alternatif untuk membuat beberapa solusi pengguna uji Anda dapat membuat beberapa tes dalam pembelian aplikasi di iTunes Connect maka Anda tidak perlu mengubah akun pengguna.

Adobels
sumber
1
Alasan downvote adalah: 1. Ini bukan solusi yang baik karena Anda mungkin mencoba menguji solusi pembelian Dalam Aplikasi tertentu yang mungkin memerlukan banyak skenario dengan login pengguna aplikasi dan ketersediaan konten lintas perangkat / platform. 2. Membuat beberapa pengujian pembelian sama membosankannya dengan membuat beberapa akun pengujian. 3. Selain itu, jawaban tidak diformat dengan baik.
mickeymoon
-1

Tetap gunakan akun pengujian yang sama, memulihkan pembelian daripada menyelesaikan yang baru. Lagi pula, apakah Anda memulai pembelian baru atau memulihkan yang lama, APLIKASI ANDA akan melakukan hal yang sama (setidaknya pada awalnya, mungkin antarmuka pengguna akan diperbarui secara berbeda setelah selesai). Apple adalah orang-orang yang menangani berbagai hal secara berbeda dalam situasi yang berbeda itu - jangan khawatir tentang itu.

Tempatkan logika pengiriman Anda dalam kasus SKPaymentTransactionStateRestored dalam penerapan metode ini untuk pengujian:

- (void)paymentQueue:(SKPaymentQueue *)queue
 updatedTransactions:(NSArray *)transactions;

Kemudian pastikan untuk memasukkan logika pengiriman tersebut ke dalam kasus SKPaymentTransactionStatePurchased.

Pada akhirnya, karena kebanyakan dari kita obsesif-kompulsif untuk berbagai tingkatan, lakukan tes akhir dengan akun baru (bukan masalah besar untuk membuat yang kedua untuk kepastian mutlak).

Hal terakhir yang perlu diperhatikan: pertimbangkan posisi apel. Jika ada masalah dengan pengembang yang harus membuang waktu membuat puluhan atau ratusan akun untuk menguji IAP secara menyeluruh, mereka akan menyelesaikan masalah tersebut. Tidak ada masalah.

ArthurVonBabylon
sumber