【问题标题】:saving data specific to an app and preserving even after app deletion保存特定于应用程序的数据并在删除应用程序后保留
【发布时间】:2016-07-16 20:21:52
【问题描述】:

有没有办法在应用卸载后保留一些数据,并且在应用重新安装后可以检索?

我找到了 NSUserDefault 但我不确定。请指教。

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Coding Explorer", forKey: "userNameKey")

【问题讨论】:

  • 可以使用钥匙扣。
  • 请补充信息:有多少数据,什么类型,将如何在应用程序中使用?

标签: ios objective-c swift


【解决方案1】:

您需要使用 Keychain 来获取有关应用程序的敏感信息。

这是一个如何实现的示例。

KeyChain Example

当用户从设备上卸载应用程序时,UserDefaults 将被删除,因此替代方案是 Keychain。

【讨论】:

    【解决方案2】:

    NSUserDefaults 在卸载应用程序时被清除。我认为最好的方法是使用keychain,这也可以确保您的数据已加密,其他人无法访问。

    【讨论】:

      【解决方案3】:

      这很可能是使用 iOS 上的钥匙串完成的。

      但在我看来,卸载后留下数据不利于应用程序的沙盒。有很多方法可以做到这一点,例如您可以添加图像/照片/联系人/...,但不太可能获得“Apple 批准”,而且很可能很容易被破解。

      所以我也建议你使用网络服务。一种简单的方法是在未找到应用程序数据(安装和重新安装)时使用服务进行验证(例如,使用设备的 MAC 地址,因为设备唯一标识符正在消失)是否是已知设备(无令牌) (获取令牌)。

      【讨论】:

        【解决方案4】:

        我个人不会为此使用钥匙串,对于像这样简单的东西来说,它实在是太重了。

        您可能会发现使用defaults domains 会带来一些运气,它允许您将少量数据放置在正常默认区域的“外部”。但这似乎也超出了您的需要。

        另一种选择是make your own plist,然后将其保存到 iCloud。

        【讨论】:

          【解决方案5】:

          使用此方法保存数据:

             func saveIMEI(key: String, data: String) -> OSStatus {
              let query = [
                  kSecClass as String       : kSecClassGenericPassword as String,
                  kSecAttrAccount as String : key,
                  kSecValueData as String   : data ] as [String : Any]
          
              SecItemDelete(query as CFDictionary)
          
              return SecItemAdd(query as CFDictionary, nil)
          }
          

          使用它来加载数据:

               func loadIMEI(key: String) -> String? {
              let query = [
                  kSecClass as String       : kSecClassGenericPassword,
                  kSecAttrAccount as String : key,
                  kSecReturnData as String  : kCFBooleanTrue,
                  kSecMatchLimit as String  : kSecMatchLimitOne ] as [String : Any]
          
              var dataTypeRef: AnyObject? = nil
          
              let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
          
              if status == noErr {
                  return dataTypeRef as! String?
              } else {
                  return nil
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2016-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-09
            • 2018-10-16
            • 2014-03-27
            • 1970-01-01
            相关资源
            最近更新 更多