NSUserDefaults tidak dihapus setelah aplikasi di-uninstal di simulator

95

ini mungkin terdengar NOOB nyata! Saya ingin memeriksa apakah ini kedua kalinya pengguna memasuki aplikasi saya, jadi untuk menjaga jumlah proses yang saya gunakan NSUserDefaults. Saya telah menerapkan kode berikut di saya rootViewController's viewDidLoadmetode:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

semuanya berfungsi dengan baik, tetapi masalahnya adalah ketika saya menghapus (menghapus dan menginstal ulang) aplikasi sesuai di sini dan di sini datanya harus dihapus, tetapi tidak dan setelah menginstal ulang aplikasi data sebelumnya masih muncul. Saya menjalankan aplikasi saya di simulator iOS menggunakan xCode6-beta dan menargetkan aplikasi di iOS 8

Reza Shayestehpour
sumber
2
Sudahkah Anda mencoba menguji pada perangkat yang sebenarnya?
Henry F
Anda perlu menghapusnya secara manual di simulator. Begini caranya .
dasblinkenlight
tolong tandai jawaban yang benar sehingga pertanyaan ini tidak lagi terjawab
anders
1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Aplikasi saya macet di sini di ios8 meskipun berfungsi dengan baik di ios6 dan ios7. Di sini daftar yang dipilih di NSMutable Array dan UserId adalah string.
Manthan
@Manthan ini adalah beberapa bagaimana masalah yang berbeda, tetapi saya telah menghadapi masalah yang sama di tempat lain dan alasan yang menyebabkan crash adalah Meskipun objek yang saya simpan untuk beberapa kunci NSMutableArraydisimpan sebagai NSArraydan mengubahnya membuat aplikasi saya macet. .. Saya sarankan untuk menyimpan NSArraydan ketika Anda ingin menggunakannya nanti, transmisikan ke NSMutableArraymenggunakan [NSMutableArray arrayWithArray:array];. Saya harap itu membantu.
Reza Shayestehpour

Jawaban:

169

Saya rasa ini karena bug di iOS8 Beta Simulator.

Perilaku yang diharapkan adalah ketika aplikasi dihapus, NSUserDefaults untuk aplikasi itu juga dihapus.

  • Namun, NSUserDefaults TIDAK dihapus saat Anda menghapus aplikasi dari simulator.
  • Mereka dihapus dengan benar ketika Anda menghapusnya dari perangkat fisik yang menjalankan iOS8.

Solusi cepat dan menjengkelkan untuk saat ini adalah dengan mengklik, iOS Simulator -> Reset Content and Settings.

Xcode 9.2 dengan Simulator 10 masih menghadirkan masalah ini. Opsi menu sekarang adalah Perangkat Keras .. Hapus Semua Konten dan Pengaturan

Saya mengirimkan laporan bug btw

anders
sumber
45
Mengujinya di iOS 8 GM dan bug masih ada. Sangat menyebalkan.
Manfred Scheiner
1
Saya juga dapat mengonfirmasi perilaku buggy ini di simulator Xcode 6 GM dan iOS 8 (12A365)!
Boris Brdarić
1
Tautan Open Radar yang ada untuk yang ingin mengikuti kasus ini: openradar.appspot.com/18540702
viggio24
1
Sepertinya bug telah diperbaiki pada SDK 8.1 setelah pembaruan ke XCode 6.1 (6A1052d)
kas-kad
2
Untuk siapa pun yang menghadapi masalah yang sama. Jika Anda memiliki lebih dari 1 aplikasi di bawah grup yang sama dan semuanya menggunakan grup aplikasi (AKTIF dalam kemampuan), Anda harus menghapus semua aplikasi dari perangkat agar default pengguna dihapus. Karena default pengguna dibagikan, meskipun salah satu aplikasi ada di perangkat maka itu tidak akan dihapus, karena aplikasi itu akan menggunakan default pengguna.
Ankit Srivastava
14

Karena Atur Ulang Konten dan Pengaturan adalah opsi inti, Anda dapat mempertimbangkan dua opsi lain hingga bug pada simulator GM iOS 8 / Xcode 6 diatasi:

  1. Anda dapat menghapus file plist tempat NSUserDefaultspenyimpanannya secara manual . Ini saat ini berada di ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist . Agak membosankan untuk menemukan simulator yang tepat untuk digunakan di antara nama direktori UUID. EDIT : 2014-10-28 20-34-52 Jalur yang benar: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Anda dapat melakukan "operasi" pada plist itu (mungkin menggunakan fase pembuatan skrip jalankan) menggunakan plistbuddy mis

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist

FluffulousChimp
sumber
Anda hilang / data / setelah / * some_device_id * /
Pria itu
5

Untuk siapa pun yang menghadapi masalah yang sama.

Jika Anda memiliki lebih dari 1 aplikasi di bawah grup yang sama dan semuanya menggunakan grup aplikasi (AKTIF dalam kemampuan), Anda harus menghapus semua aplikasi dari perangkat agar default pengguna dihapus.

Karena default pengguna dibagikan, meskipun salah satu aplikasi ada di perangkat maka itu tidak akan dihapus, karena aplikasi itu akan menggunakan default pengguna.

Ankit Srivastava
sumber
4

Kode harus berfungsi dengan baik di perangkat. Mungkin beberapa bug di simulator.

Coba Atur Ulang Isi dan Pengaturan untuk Simulator.

ppalancica.dll
sumber
1
Mengatur Ulang Isi dan Pengaturan berfungsi dengan baik, dan saya tidak memiliki perangkat saat ini untuk memeriksanya. tnx :)
Reza Shayestehpour
4

ini adalah bug, dan Anda dapat menghapus NSUserDefaults dengan kode berikut

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
ygweric
sumber
2

Meskipun ini masih merupakan bug, opsi lain adalah menghapus kunci tertentu di NSUserDefaults. Sebagian besar waktu, saat menguji / mengembangkan, kami hanya peduli tentang beberapa kunci dan tidak semuanya di NSUserDefaults. Jika Anda hanya peduli tentang beberapa kunci daripada yang saya usulkan untuk menambahkan removeObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

Menambahkan removeObjectForKeysimulasi aplikasi yang dijalankan pertama kali, mengomentarinya akan menyimulasikan semua eksekusi aplikasi berikutnya.

AdamT
sumber
2

Dalam kasus saya, saya menemukan * .plist di direktori berikut:

[1] / Pengguna / BEBERAPA NAMA PENGGUNA / Pustaka / Pengembang / CoreSimulator / Perangkat / BEBERAPA-PERANGKAT-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

Masalah: Menghapus aplikasi di xCode 6 (simulator iOS 8) tetapi file tetap di disk seperti yang disebutkan di atas.

Larutan: Menghapus file yang terletak dari jalur [1] secara manual dan NSUserDefaults hilang.

Jadi cara yang mengganggu untuk mengatur ulang simulator tidak lagi diperlukan.

sys4tron.dll
sumber