繁体   English   中英

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

[英]NSUserDefaults initWithSuiteName persisting after deleting app

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

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

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

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

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

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

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

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

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

要解决这个问题,您可以在应用启动时将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()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM