Tôi đang sử dụng +[NSUserDefaults standardUserDefaults]
để lưu trữ cài đặt ứng dụng. Điều này bao gồm khoảng một chục giá trị chuỗi. Có thể xóa các giá trị này vĩnh viễn thay vì chỉ đặt chúng thành giá trị mặc định?
Tôi đang sử dụng +[NSUserDefaults standardUserDefaults]
để lưu trữ cài đặt ứng dụng. Điều này bao gồm khoảng một chục giá trị chuỗi. Có thể xóa các giá trị này vĩnh viễn thay vì chỉ đặt chúng thành giá trị mặc định?
Câu trả lời:
Bạn có thể xóa tên miền liên tục của ứng dụng như thế này:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Trong Swift 3 trở lên:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Điều này tương tự như câu trả lời của @samvermette nhưng IMO sạch hơn một chút.
Mã này đặt lại mặc định cho miền đăng ký:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Nói cách khác, nó removeObjectForKey
cho mọi khóa duy nhất bạn từng đăng ký trong ứng dụng đó.
Tín dụng cho Ken Thomases trên chủ đề Diễn đàn nhà phát triển Apple này .
[NSUserDefaults resetStandardUserDefaults]
không làm điều này là ngoài tôi.
Bạn đã thử sử dụng - removeObjectForKey
?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Đây là câu trả lời trong Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
một lớp lót
if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Nếu bạn cần nó trong khi phát triển, bạn cũng có thể đặt lại trình giả lập, xóa tất cả NSUserDefaults
.
Trình mô phỏng iOS -> Đặt lại nội dung và cài đặt ...
Hãy nhớ rằng nó cũng sẽ xóa tất cả các ứng dụng và tệp trên trình giả lập.
Trong Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Lưu ý: Câu trả lời này cũng đã được cập nhật cho Swift.
Điều gì về để có nó trên một dòng?
Mở rộng câu trả lời @Christopher Rogers - câu trả lời được chấp nhận.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
và vâng, đôi khi bạn có thể cần synchronize
nó,
[[NSUserDefaults standardUserDefaults] synchronize];
Tôi đã tạo ra một phương pháp để làm điều này,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Với swift thậm chí còn dễ dàng hơn.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
Và cách sử dụng :
UserDefaults.clean()
Tôi thích các tiện ích mở rộng khi chúng làm cho mã sạch hơn:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Swift 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
Tôi đã tìm thấy cái này:
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 "{}"
Nguồn: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Đó là một lỗi hoặc bất cứ điều gì nhưng removePersistentDomainForName
nó không hoạt động trong khi xóa tất cả các NSUserDefaults
giá trị.
Vì vậy, tùy chọn tốt hơn là đặt lại PersistentDomain
và bạn có thể thực hiện thông qua cách sau:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Mở rộng câu trả lời của @ folse ... Tôi tin rằng một triển khai đúng đắn hơn sẽ là ...
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];
}
... đang gọi phương thức continentDomainForName: của NSUserDefault. Là trạng thái tài liệu, phương thức "Trả về một từ điển chứa các khóa và giá trị trong miền liên tục được chỉ định." Gọi từ điển Xuất hiện: thay vào đó, sẽ trả về một từ điển có thể sẽ bao gồm các cài đặt khác khi nó áp dụng cho phạm vi rộng hơn.
Nếu bạn cần lọc ra bất kỳ giá trị nào sẽ được đặt lại, thì lặp lại các phím là cách để thực hiện. Rõ ràng, nếu bạn muốn chỉ cần nuke tất cả các prefs cho ứng dụng mà không quan tâm, thì một trong những phương pháp khác được đăng ở trên là hiệu quả nhất.
nếu cài đặt ứng dụng cần thiết lập lại là nsuserdefault để truy cập micrô (trường hợp của tôi), một giải pháp đơn giản là câu trả lời từ Anthony McCormick ( Iphone - Làm cách nào để cho phép ứng dụng truy cập vào phương tiện trên thiết bị? - ALAssetsL LibraryErrorDomain Code = -3312 "Truy cập bị từ chối toàn cầu" ).
trên thiết bị, đi tới Cài đặt> Chung> Đặt lại> Đặt lại Cảnh báo vị trí
Hãy thử cái này, nó làm việc cho tôi.
Một dòng mã
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];