删除应用程序后,NSUserDefaults initWithSuiteName会保持不变

时间:2015-04-21 21:16:34

标签: ios objective-c cocoa-touch nsuserdefaults

我遇到一个问题,如果我使用[[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]]存储任何数据,即使删除应用后数据仍然存在。这应该发生吗?

2 个答案:

答案 0 :(得分:6)

这应该发生。事实上,initWithSuiteName的目的是在应用组中的所有应用之间共享数据。文档说:

  

在以下场景中使用此方法:

     
      
  • 开发应用套件时,要分享偏好或其他数据   应用程序

  •   
  • 开发应用扩展程序时,要分享偏好设置或其他数据   在扩展程序及其包含的应用程序之间

  •   

应用无法删除此内容,因为删除某个应用时,系统不会通知该应用。将项目存储在钥匙串中也是同样的问题 - 它们会持续超出应用程序的生命周期。根据您应用的需求,这可能是好事也可能是坏事。

一种解决方案是加密文件内容的适当部分,并将密钥存储在共享密钥链中。对于这样的事情,随机的256位AES对称密钥是完美的。但一般来说,只要用户在设备上有密码,文件系统就会被加密,共享存储中的项目应该被认为是干净的。

另一个选择是使用共享存储作为直通;我们在应用程序套件中执行此操作。一个应用程序将加密文件放在共享存储中,然后使用文件URI和加密密钥调用我们套件中的另一个应用程序。接收应用程序将文件复制到其本地存储,删除共享文件,然后解密本地文件。

答案 1 :(得分:3)

正如其他人所提到的,尽管删除了应用程序并且无法检测应用程序删除并清除这些默认值,但共享套件中存储的默认值仍然存在。但是,如果有人重新安装应用程序(并且您不希望旧的默认设置在那里),有一种方法可以处理它。

要解决此问题,您只需在应用启动时将bool保存为标准用户默认值即可。如果启动应用程序时bool不存在(因为这是第一次安装),那么您可以清除共享套件默认值,使其作为全新安装启动。这样,在全新安装中,您将拥有一个空的共享默认值。

例如:

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()
}