我遇到一个问题,如果我使用[[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]]
存储任何数据,即使删除应用后数据仍然存在。这应该发生吗?
答案 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()
}