NSUserDefaults không bị xóa sau khi gỡ cài đặt ứng dụng trên trình mô phỏng


95

điều này nghe có vẻ NOOB thật! Tôi muốn kiểm tra xem đó có phải là lần thứ hai người dùng vào ứng dụng của tôi hay không, vì vậy để giữ số lần chạy mà tôi đang sử dụng NSUserDefaults. Tôi đã thực hiện đoạn mã sau vào tôi rootViewController's viewDidLoadphương pháp:

    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];

mọi thứ hoạt động tốt, nhưng vấn đề là khi tôi gỡ cài đặt (xóa và cài đặt lại) ứng dụng theo đâyở đây , dữ liệu sẽ được xóa, nhưng nó không được và sau khi cài đặt lại ứng dụng, dữ liệu trước đó vẫn hiển thị. Tôi đang chạy ứng dụng của mình trên trình mô phỏng iOS bằng xCode6-beta và nhắm mục tiêu ứng dụng trên iOS 8


2
Bạn đã thử kiểm tra trên một thiết bị thực tế chưa?
Henry F

Bạn cần xóa thủ công trên trình mô phỏng. Đây là cách làm .
dasblinkenlight

hãy đánh dấu câu trả lời đúng vì vậy câu hỏi này không còn chưa được trả lời
anders

1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectLists forKey: UserID]. Ứng dụng của tôi bị lỗi ở đây trong ios8 mặc dù hoạt động tốt trong ios6 và ios7. Đây là danh sách được chọn trong NSMutable Array và UserId là một chuỗi.
Manthan

@Manthan đây là một số cách một vấn đề khác nhau, nhưng tôi đã gặp phải vấn đề tương tự ở một nơi khác và lý do gây ra sự cố là Mặc dù đối tượng mà tôi đang lưu cho một số khóa đã NSMutableArrayđược lưu dưới dạng một NSArrayvà việc thay đổi nó đã khiến ứng dụng của tôi gặp sự cố. .. Tôi khuyên bạn nên lưu một NSArrayvà khi bạn muốn sử dụng nó sau này hãy truyền nó sang NSMutableArraysử dụng [NSMutableArray arrayWithArray:array];. Tôi hy vọng rằng sẽ giúp.
Reza Shayestehpour

Câu trả lời:


169

Tôi nghĩ rằng điều này là do lỗi trong iOS8 Beta Simulator.

Hành vi mong đợi là khi ứng dụng bị xóa, NSUserDefaults cho ứng dụng đó cũng bị xóa.

  • Tuy nhiên, NSUserDefaults KHÔNG bị xóa khi bạn xóa ứng dụng khỏi trình mô phỏng.
  • Chúng được xóa chính xác khi bạn xóa chúng khỏi thiết bị vật lý chạy iOS8.

Một giải pháp nhanh chóng và khó chịu lúc này là nhấp vào Trình mô phỏng iOS -> Đặt lại Nội dung và Cài đặt.

Xcode 9.2 với Simulator 10 vẫn xuất hiện vấn đề này. Tùy chọn menu hiện là Phần cứng .. Xóa tất cả nội dung và cài đặt

Tôi đã gửi một báo cáo lỗi btw


45
Đã thử nghiệm nó trên iOS 8 GM và lỗi vẫn còn tồn tại. Rất phiền phức.
Manfred Scheiner,

1
Tôi cũng có thể xác nhận hành vi lỗi này trong trình mô phỏng Xcode 6 GM và iOS 8 (12A365)!
Boris Brdarić

1
Hiện liên kết Radar mở cho những ai muốn làm theo các trường hợp: openradar.appspot.com/18540702
viggio24

1
Có vẻ như lỗi đã được sửa trên SDK 8.1 sau khi cập nhật lên XCode 6.1 (6A1052d)
-kad 22/10/14

2
Đối với bất kỳ ai phải đối mặt với cùng một vấn đề. Nếu bạn có nhiều ứng dụng trong cùng một nhóm và tất cả chúng đều đang sử dụng nhóm ứng dụng (BẬT trong khả năng), thì bạn sẽ phải xóa tất cả ứng dụng khỏi thiết bị để xóa mặc định của người dùng. Vì mặc định của người dùng được chia sẻ, ngay cả khi một trong các ứng dụng có trên thiết bị thì ứng dụng đó sẽ không bị xóa vì ứng dụng đó sẽ sử dụng mặc định của người dùng.
Ankit Srivastava,

14

Vì Đặt lại Nội dung và Cài đặt là một tùy chọn hạt nhân, bạn có thể xem xét hai tùy chọn khác cho đến khi lỗi trên trình mô phỏng iOS 8 / Xcode 6 GM được giải quyết:

  1. Bạn có thể xóa thủ công tệp plist nơi NSUserDefaultschúng được lưu trữ. Điều này hiện nằm ở ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist Thật hơi tẻ nhạt để tìm trình mô phỏng phù hợp để làm việc trong số các tên thư mục UUID. EDIT : 2014-10-28 20-34-52 Đường dẫn đúng: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Bạn có thể thực hiện "phẫu thuật" trên plist đó (có thể sử dụng giai đoạn xây dựng kịch bản chạy) bằng cách sử dụng plistbuddy ví dụ:

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


Bạn bị thiếu / data / after / * some_device_id * /
chàng

5

Đối với bất kỳ ai phải đối mặt với cùng một vấn đề.

Nếu bạn có nhiều ứng dụng trong cùng một nhóm và tất cả chúng đều đang sử dụng nhóm ứng dụng (BẬT trong khả năng), thì bạn sẽ phải xóa tất cả ứng dụng khỏi thiết bị để xóa mặc định của người dùng.

Vì mặc định của người dùng được chia sẻ, ngay cả khi một trong các ứng dụng có trên thiết bị thì ứng dụng đó sẽ không bị xóa vì ứng dụng đó sẽ sử dụng mặc định của người dùng.


4

Mã sẽ hoạt động tốt trên thiết bị. Có thể một số lỗi trong trình mô phỏng.

Cố gắng Đặt lại Nội dung và Cài đặt cho Trình mô phỏng.


1
Việc gửi lại Nội dung và Cài đặt hoạt động ổn và tôi không có thiết bị để kiểm tra tại thời điểm này. tnx :)
Reza Shayestehpour

4

đó là một lỗi và bạn có thể xóa NSUserDefaults bằng mã sau

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

2

Mặc dù đây vẫn là một lỗi, một tùy chọn khác có thể là xóa (các) khóa cụ thể trong NSUserDefaults. Hầu hết thời gian, khi thử nghiệm / phát triển, chúng tôi chỉ quan tâm đến một vài khóa chứ không phải mọi thứ trong NSUserDefaults. Nếu bạn chỉ quan tâm đến một vài khóa hơn tôi đề xuất thêm 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];

Việc thêm removeObjectForKeymô phỏng lần chạy đầu tiên của ứng dụng, nhận xét nó sẽ mô phỏng tất cả các lần thực thi ứng dụng tiếp theo.


2

Trong trường hợp của tôi, tôi đã tìm thấy * .plist trong thư mục sau:

[1] / Users / SOME-USERNAME / Library / Developer / CoreSimulator / Devices / SOME-DEVICE-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

Sự cố: Xóa ứng dụng trong xCode 6 (trình mô phỏng iOS 8) nhưng tệp vẫn nằm trên đĩa như đã đề cập ở trên.

Giải pháp: Xóa tệp được định vị khỏi đường dẫn [1] theo cách thủ công và NSUserDefaults sẽ biến mất.

Vì vậy, cách khó chịu để thiết lập lại trình mô phỏng không còn cần thiết nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.