NSUserDefaults có tồn tại thông qua Bản cập nhật cho một ứng dụng trong Appstore không?


106

Đây có phải là trường hợp? NSUserDefaults có được đặt lại khi bạn gửi bản cập nhật cho một ứng dụng trên App Store hay chúng được đặt lại?

Ứng dụng của tôi gặp sự cố khi cập nhật nhưng không gặp sự cố khi tải xuống đầy đủ - vì vậy tôi đang cố gắng xác định điều gì có thể khác trong phiên cập nhật với phiên mới tải xuống.

Chúc mừng, Nick.


Các tệp trong Tài liệuThư viện sẽ được giữ nguyên như yêu cầu của tài liệu: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

Câu trả lời:


116

Chúng thường không được đặt lại trừ khi người dùng xóa ứng dụng. Đối với dữ liệu cơ bản, NSUserDefaults là cách tốt nhất để lưu dữ liệu như tùy chọn, ngày tháng, chuỗi, v.v. Nếu bạn đang muốn lưu hình ảnh và tệp, hệ thống tệp là lựa chọn tốt hơn.


5
Có nơi nào đó trong tài liệu của Apple đề cập đến điều này không?
Nick Cartwright

1
Xin lỗi - tôi quên cảm ơn vì câu trả lời nhanh của bạn! - Nếu ai đó có thể tìm thấy liên kết đến bất kỳ dạng tài liệu nào của Apple có nội dung này, thì sẽ thật tuyệt vời .... Trong tài liệu dành cho NSUserDefaults, nó không nói gì về điều này, vì vậy tôi nghĩ rằng tôi đã (không chính xác) cho rằng các mặc định đã bị xóa. Đây dường như là cách an toàn nhất để Apple cập nhật ứng dụng!
Nick Cartwright

Đó có thể là cách an toàn nhất, nhưng sẽ cực kỳ khó chịu cho người dùng nếu họ phải thiết lập lại tất cả các tùy chọn của mình bất cứ khi nào ứng dụng được cập nhật. Tôi thường có ba hoặc bốn bản cập nhật ứng dụng mỗi ngày; Tôi chắc rằng những người dùng iPhone khác thậm chí còn nhiều hơn thế. Xóa tùy chọn cho mỗi bản cập nhật về cơ bản sẽ khiến iPhone của tôi không sử dụng được.
Kristopher Johnson

1
Dữ liệu trong thư mục tài liệu có thể biến mất dễ dàng như NSUserDefaults. Cả hai đều dịp hiếm hoi, tuy nhiên, và đã hoàn toàn không có gì để làm với quá trình nâng cấp bình thường
coneybeare

1
Cảm ơn Kristopher - và vâng, tôi đồng ý. Vấn đề của tôi là tôi đã sử dụng NSUserDefaults để lưu trữ các sự kiện có lập trình và dựa vào việc chúng được đặt lại khi ứng dụng được cài đặt. Tất cả thử nghiệm của tôi trên thiết bị iPhone (và thử nghiệm của Apples) đã thử nghiệm ứng dụng dưới dạng cài đặt mới. Nếu không có bất kỳ tài liệu hoặc cách nào để kiểm tra dưới dạng bản cập nhật, tôi không thể lặp lại lỗi cập nhật mà tất cả khách hàng của chúng tôi hiện đang gặp phải. Tóm lại - có lẽ là một bài học khó !!
Nick Cartwright 29/10/09

7

Tôi tin rằng câu trả lời là CÓ, nó sẽ tồn tại. Điều này cũng được ghi lại đầy đủ trong chương Thư mục ứng dụng trong Hướng dẫn lập trình hệ điều hành iPhone của Apple.


4
  1. Câu trả lời trực tiếp cho câu hỏi đã đăng: CÓ.
  2. Sự cố của bạn: Ứng dụng của bạn bị lỗi do các vấn đề logic. Giả sử bạn lưu trữ một đối tượng ở chế độ mặc định và ứng dụng kiểm tra giá trị của đối tượng đó khi khởi chạy (hoặc ở nơi khác). Trong quá trình cập nhật, bạn có thể thay đổi cách kiểm tra hoặc sử dụng nó, ví dụ như bạn mong đợi một giá trị, nhưng đối tượng là nil hoặc ngược lại. Điều này có thể gây ra SIGABRT hoặc EXC_BAD_ACCESS.

2

Nếu bạn có mô hình CoreData và bạn đã thay đổi thứ gì đó trong mô hình và bản cập nhật của mình mà không quản lý quá trình di chuyển, đó có thể là lý do khiến ứng dụng của bạn gặp sự cố khi cập nhật ...


Tôi hy vọng rằng nó có thể là một trường hợp :) không phải là một NSUserdefault
Julian Krol

1

Tôi có một kinh nghiệm tương tự. Ứng dụng của chúng tôi lưu trữ số phiên bản trong Settings.Bundle / Root.Plist. Điều này được hiển thị thông qua ứng dụng Cài đặt iPhone. Những gì chúng tôi nhận thấy là trên Cài đặt, số phiên bản được tải từ gói ứng dụng - do đó, số phiên bản là chính xác. Tuy nhiên, trên một bản cập nhật, số phiên bản không thay đổi. Điều này tạo ấn tượng cho người dùng đang chạy phiên bản trước của ứng dụng. Chúng tôi không có bất kỳ logic nào được liên kết với số phiên bản, nó chỉ để hiển thị (nó có thể được nhân viên trung tâm liên hệ sử dụng khi chẩn đoán lỗi).

Trải nghiệm của chúng tôi là NSUserDefaults không bị xóa khi người dùng cập nhật ứng dụng của chúng tôi, nhưng màn hình Cài đặt cũng không được cập nhật.


0

Hãy lưu ý trường hợp này, khi ứng dụng của bạn đang chạy trong nền và bạn không thể truy cập các giá trị được lưu trữ của mình trong NSUserDefaults:

Eric:

Đã có nhiều chủ đề và lỗi về điều này, nhưng nó lại xảy ra với tôi trong iOS 9. Tôi có một ứng dụng khởi chạy ở chế độ nền để đáp ứng các tác vụ NSURLSession và nội dung có sẵn. Có thể lặp lại, nếu tôi khởi động lại điện thoại của mình và đợi ứng dụng của mình khởi động trong nền, thì khi mở ứng dụng, tôi thấy rằng [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] chứa tất cả các giá trị hệ thống, ví dụ: AppleITunesStoreItemKinds, v.v. nhưng không chứa bất kỳ giá trị nào tôi đã đặt. Nếu tôi buộc thoát và khởi chạy lại ứng dụng, tất cả các giá trị của tôi sẽ quay trở lại. Có cách nào để tránh nó lưu vào bộ nhớ đệm tiêu chuẩnUserDefaults "trống rỗng" từ trước khi điện thoại được mở khóa, hoặc ít nhất là để xác định khi nào chúng bị lỗi và sửa chúng mà không cần phải thoát khỏi ứng dụng?

Eskimo (eskimo1@apple.com):

Vấn đề ở đây là NSUserDefaults cuối cùng được hỗ trợ bởi một tệp trong vùng chứa ứng dụng của bạn và vùng chứa ứng dụng của bạn phải được bảo vệ dữ liệu. Nếu bạn không làm gì đặc biệt thì trên iOS 7 trở lên, vùng chứa của bạn sử dụng NSFileProtectionCompleteUntilFirstUserAuthentication, một giá trị được kế thừa bởi cửa hàng sao lưu NSUserDefaults và vì vậy bạn không thể truy cập nó trước lần mở khóa đầu tiên.

IMO cách tốt nhất để giải quyết vấn đề này là tránh NSUserDefaults cho những thứ mà bạn dựa vào trong các đường dẫn mã có thể thực thi ở chế độ nền. Thay vào đó, hãy lưu trữ các cài đặt đó trong tệp tùy chọn của riêng bạn, tệp có chức năng bảo vệ dữ liệu mà bạn có thể quản lý rõ ràng (trong trường hợp này có nghĩa là 'đặt thành NSFileProtectionNone').

Có hai vấn đề với NSUserDefaults trong ngữ cảnh bảo vệ dữ liệu:

Nó là một API trừu tượng hoàn toàn: sự hiện diện và vị trí của kho dự trữ của nó không được coi là một phần của API đó, vì vậy bạn không thể quản lý rõ ràng việc bảo vệ dữ liệu của nó.

Lưu ý Trên các phiên bản gần đây của OS X NSUserDefaults được quản lý bởi một daemon và những người cố gắng thao tác trực tiếp kho sao lưu của nó đã gặp phải sự cố. Thật dễ dàng để tưởng tượng điều tương tự sẽ đến với iOS vào một thời điểm nào đó.

Ngay cả khi có thể thay đổi bảo vệ dữ liệu, NSUserDefaults không có cơ chế để phân loại dữ liệu dựa trên ngữ cảnh mà bạn đang sử dụng nó; đó là một API 'tất cả hoặc không có gì'. Trong trường hợp của bạn, bạn không muốn xóa bảo vệ khỏi tất cả các cài đặt mặc định của người dùng, mà chỉ những cài đặt bạn cần truy cập trong nền trước khi mở khóa lần đầu.

Cuối cùng, nếu bất kỳ dữ liệu nào thực sự nhạy cảm, bạn nên đưa nó vào chuỗi khóa. Đáng chú ý, chuỗi khóa có khả năng thiết lập bảo vệ dữ liệu trên cơ sở từng mục.

Nguồn: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

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.