Saya menggunakan +[NSUserDefaults standardUserDefaults]
untuk menyimpan pengaturan aplikasi. Ini terdiri dari sekitar selusin nilai string. Apakah mungkin untuk menghapus nilai-nilai ini secara permanen daripada hanya mengaturnya ke nilai default?
Saya menggunakan +[NSUserDefaults standardUserDefaults]
untuk menyimpan pengaturan aplikasi. Ini terdiri dari sekitar selusin nilai string. Apakah mungkin untuk menghapus nilai-nilai ini secara permanen daripada hanya mengaturnya ke nilai default?
Jawaban:
Anda dapat menghapus domain persisten aplikasi seperti ini:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Dalam Swift 3 dan yang lebih baru:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Ini mirip dengan jawaban oleh @samvermette tetapi sedikit lebih bersih IMO.
Kode ini mengatur ulang default ke domain pendaftaran:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Dengan kata lain, itu removeObjectForKey
untuk setiap kunci tunggal yang pernah Anda daftarkan di aplikasi itu.
Penghargaan untuk Ken Thomases di utas Forum Pengembang Apple ini .
[NSUserDefaults resetStandardUserDefaults]
tidak melakukan ini di luar jangkauan saya.
Apakah Anda mencoba menggunakan - removeObjectForKey
?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Inilah jawabannya di Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
one-liner
if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Jika Anda membutuhkannya saat mengembangkan, Anda juga dapat mengatur ulang simulator Anda, menghapus semua NSUserDefaults
.
iOS Simulator -> Setel Ulang Konten dan Pengaturan ...
Ingatlah bahwa itu juga akan menghapus semua aplikasi dan file pada simulator.
Dalam Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Catatan: Jawaban ini telah diperbarui untuk Swift juga.
Bagaimana kalau memilikinya di satu baris?
Extending @Christopher Rogers menjawab - yang diterima
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
dan ya, kadang-kadang Anda mungkin perlu synchronize
,
[[NSUserDefaults standardUserDefaults] synchronize];
Saya telah membuat metode untuk melakukan ini,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Cepat ?
Dengan cepat bahkan lebih mudah.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
Dan penggunaan :
UserDefaults.clean()
Saya suka ekstensi ketika mereka membuat kode lebih bersih:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Cepat 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
Aku menemukan ini:
osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"
Sumber: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Ini bug atau apa pun tetapi removePersistentDomainForName
tidak berfungsi saat membersihkan semua NSUserDefaults
nilai.
Jadi, pilihan yang lebih baik adalah mengatur ulang PersistentDomain
dan yang dapat Anda lakukan melalui cara berikut:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Memperluas jawaban @ folse ... Saya yakin implementasi yang lebih tepat adalah ...
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
for (NSString *key in [defaultsDictionary allKeys]) {
NSLog(@"removing user pref for %@", key);
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
... memanggil metode persistentDomainForName: NSUserDefault. Sebagai status dokumen, metode "Mengembalikan kamus yang berisi kunci dan nilai dalam domain persisten yang ditentukan." Calling dictionaryRepresentation: sebagai gantinya, akan mengembalikan kamus yang kemungkinan akan mencakup pengaturan lain yang berlaku untuk cakupan yang lebih luas.
Jika Anda perlu menyaring salah satu nilai yang harus diatur ulang, maka iterasi tombol adalah cara untuk melakukannya. Tentunya, jika Anda ingin mengabaikan semua prefs untuk aplikasi tanpa memperhatikan, maka salah satu metode lain yang diposting di atas adalah yang paling efisien.
jika pengaturan aplikasi yang perlu diatur ulang adalah nsuserdefault untuk akses ke mikrofon (kasus saya), solusi sederhana adalah jawaban dari Anthony McCormick ( Iphone - Bagaimana mengaktifkan akses aplikasi ke media pada perangkat? - ALAssetsLibraryErrorDomain Code = -3312 "Global ditolak akses" ).
pada perangkat, buka Pengaturan> Umum> Reset> Reset Peringatan Lokasi
Coba ini, Ini bekerja untuk saya.
Baris kode tunggal
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];