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

thi*_*zy4 15 cocoa-touch objective-c nsuserdefaults ios

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

Dav*_* S. 6

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

在以下情况下使用此方法:

  • 开发应用程序套件时,在应用程序之间共享首选项或其他数据

  • 开发应用扩展程序时,在扩展程序及其包含的应用程序之间共享首选项或其他数据

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

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

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


Ben*_*son 5

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

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

例如:

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()
}
Run Code Online (Sandbox Code Playgroud)