2015-04-21 14 views
15

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

+5

Đ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

+0

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

+0

@ 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

Trả lời

6

Đ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ộ.

+1

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

3

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() 
} 
Các vấn đề liên quan