Tôi gặp sự cố nếu lưu trữ bất kỳ dữ liệu nào bằng cách sử dụng [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]]
dữ liệu vẫn còn ngay cả sau khi xóa ứng dụng. Đây có phải là vụ xảy ra?NSUserDefaults initWithSuiteName vẫn tồn tại sau khi xóa ứng dụng
Trả lời
Điều này được cho là xảy ra. Đây thực tế là mục đích của initWithSuiteName, để chia sẻ dữ liệu giữa tất cả các ứng dụng trong nhóm ứng dụng. Các tài liệu nói:
Sử dụng phương pháp này trong các tình huống như:
Khi phát triển một bộ phần mềm ứng dụng, chia sẻ sở thích hoặc dữ liệu khác trong các ứng dụng
Khi phát triển một ứng dụng tiện ích mở rộng, để chia sẻ tùy chọn hoặc dữ liệu khác giữa tiện ích và ứng dụng có chứa của nó
Không có cách nào để ứng dụng xóa ứng dụng này, vì khi ứng dụng bị xóa, ứng dụng sẽ không được thông báo. Đây là vấn đề tương tự với việc lưu trữ các mục trong Keychain - chúng tồn tại vượt quá tuổi thọ của ứng dụng. Điều này có thể là một điều tốt hay xấu tùy thuộc vào nhu cầu của ứng dụng của bạn.
Một giải pháp là mã hóa các phần nội dung thích hợp của tệp và lưu khóa trong khóa chia sẻ. Đối với một cái gì đó như thế này, một khóa đối xứng AES 256-bit ngẫu nhiên là hoàn hảo. Nói chung, mặc dù người dùng có mật mã trên thiết bị, hệ thống tệp được mã hóa và các mục trong bộ nhớ dùng chung phải được xem là sạch.
Một tùy chọn khác là sử dụng bộ nhớ dùng chung làm mật khẩu; chúng tôi làm điều này trong bộ ứng dụng của chúng tôi. Một ứng dụng sẽ đặt một tệp được mã hóa vào bộ nhớ dùng chung, sau đó gọi một ứng dụng khác trong bộ của chúng tôi với URI tệp và khóa mã hóa. Ứng dụng nhận sẽ sao chép tệp vào bộ nhớ cục bộ của nó, xóa tệp được chia sẻ và sau đó giải mã tệp cục bộ.
Nếu điều gì đó là bí mật, nó không nên đi vào mặc định của người dùng ở nơi đầu tiên, vì vậy lời khuyên về mã hóa không thực sự hợp lệ ở đây. – Sulthan
Như những người khác đã đề cập, mặc định được lưu trữ trong một bộ chia sẻ có thể tồn tại mặc dù xóa ứng dụng và không có cách nào phát hiện xóa ứng dụng và xóa các giá trị mặc định này. Tuy nhiên, có một cách để đối phó với nó trong trường hợp ai đó cài đặt lại ứng dụng (và bạn không muốn các giá trị mặc định cũ ở đó).
Để giải quyết vấn đề này, bạn có thể chỉ cần lưu bool vào giá trị mặc định của người dùng khi khởi động ứng dụng. Nếu bool không có mặt khi bạn khởi động ứng dụng (vì nó là bản cài đặt đầu tiên), thì bạn có thể dọn dẹp các bộ chia sẻ mặc định để làm cho nó khởi động như một bản cài đặt mới. Bằng cách này, khi cài đặt mới, bạn sẽ có mặc định được chia sẻ trống.
Ví dụ:
let defaults = NSUserDefaults.standardUserDefaults()
if !defaults.boolForKey("firstInstallComplete") {
let sharedSuite = NSUserDefaults(suiteName: "com.example.app.shared")!
// delete whatever keys you want
sharedSuite.removeObjectForKey("example")
sharedSuite.removeObjectForKey("another")
...
sharedSuite.synchronize()
defaults.setBool(true, forKey: "firstInstallComplete")
defaults.synchronize()
}
- 1. Phân đoạn vẫn tồn tại sau khi xóa?
- 2. Các mặt hàng móc khóa iphone vẫn tồn tại sau khi gỡ cài đặt ứng dụng?
- 3. EntityManager.contains() trả về false sau khi vẫn tồn tại()
- 4. Dữ liệu đã lưu bị mất sau khi xóa ứng dụng bằng NSUserDefaults
- 5. Kiểm tra nếu NSUserDefaults chính tồn tại
- 6. Xóa NSUserDefaults
- 7. Biên nhận tại [NSBundle appStoreReceiptURL] vẫn xuất hiện sau khi cập nhật ứng dụng
- 8. Liệu 'elseif' vẫn tồn tại?
- 9. Facebook API - Phiên vẫn tồn tại sau khi người dùng đăng xuất
- 10. iphone dev - NSUserDefaults kiểm tra sự tồn tại boolean
- 11. NSUserDefaults có bị xóa khi ứng dụng được cập nhật không?
- 12. ConcurrentLinkedQueue $ Node vẫn còn trong đống sau khi xóa()
- 13. Firebase vẫn truy xuất authData sau khi xóa
- 14. Nhận mã thông báo thiết bị cho thông báo đẩy sau khi ứng dụng bị xóa
- 15. Tại sao 'the' tồn tại sau khi .remove?
- 16. Ý định trùng lặp sau khi cập nhật ứng dụng. Cảnh báo có tồn tại không?
- 17. NẾU hàng tồn tại sau đó xóa hàng trong mysql
- 18. NSUserDefaults gây ứng dụng từ chối
- 19. Cơ sở dữ liệu Heroku sẽ tồn tại sau khi ứng dụng bị xóa - và tôi có thể chuyển nó sang ứng dụng khác không?
- 20. NSUserDefaults, Settings.bundle và các nhóm ứng dụng
- 21. AVCaptureSession lỗi vẫn tồn tại giữa cài đặt
- 22. Khi nào trạng thái ứng dụng thuộc về Dữ liệu chính thay vì NSUserDefaults?
- 23. NSFileManager không xóa tệp tồn tại
- 24. Tại sao các tệp RackMultipart * vẫn tồn tại trong thư mục Rails/tmp của tôi?
- 25. Android localStorage biến mất sau khi xóa ứng dụng khỏi RAM
- 26. Ứng dụng Qt vẫn còn trong bộ nhớ ngay cả sau khi MainWindow bị đóng
- 27. Có apache cache .htaccess quy tắc? chuyển hướng tồn tại ngay cả sau khi tôi xóa các tập tin
- 28. Bảng không tồn tại sau CREATE TABLE
- 29. Tôi vẫn có thể sử dụng hội chợ sau khi tôi tháo ứng dụng gốc phản ứng của mình không?
- 30. Thay đổi repo heroku cho ứng dụng đã tồn tại
Điều đó sẽ có ý nghĩa từ các tài liệu nói _Use phương pháp này trong các tình huống như: Khi phát triển một bộ phần mềm ứng dụng, chia sẻ sở thích hoặc dữ liệu khác trong các ứng dụng ..._ (vì vậy nếu bạn xóa một ứng dụng của bộ đó thì các prefs sẽ vẫn có sẵn cho các ứng dụng khác của cùng một bộ), mặc dù tôi sẽ ngạc nhiên nếu điều này thực sự xảy ra. về điều này thường xuyên hơn). Câu hỏi thú vị! – Alladinian
nếu bạn muốn xóa dữ liệu, hãy khởi tạo người dùng mặc định theo cách tiêu chuẩn: 'NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];' – Lukas1
@ Lukas1 Đó không phải là một lựa chọn mặc dù tôi cần sử dụng bộ phần mềm để chia sẻ dữ liệu với phần mở rộng của mình. – thisiscrazy4