【问题标题】:Keychain doesn't retain the data after app gets update from iTunes应用程序从 iTunes 获取更新后钥匙串不保留数据
【发布时间】:2014-03-04 21:24:18
【问题描述】:

我一直在使用SSKeychain 开源库将数据安全地存储在我的 iOS 应用程序中。昨天,我遇到了一个问题,当我从 iTunes 将我的应用程序从 v1.0 更新到 v2.0 时,SSKeychain 无法保留其数据。

UUID 生成代码:

- (NSString *)createNewUUID
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return (__bridge NSString *)string;
}

在这里,我生成了一个唯一的设备字符串并使用keychain 来存储它,并且该应用程序在很大程度上依赖于唯一的字符串/设备标识符,因为从 iOS5 到 iOS7,Apple 对@进行了很多转换987654325@,因为这些方法已被弃用。

应对存储和检索的 sn-p:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.name.appname" account:@"AppName"];
if (retrieveuuid == nil) {
    NSString *uuid  = [self createNewUUID];

    //Store the password in Keychain
    NSError *error = nil;
    [SSKeychain setPassword:uuid forService:@"com.name.appname" account:@"AppName" error:&error];

    if ([error code] == SSKeychainErrorNotFound) {
        NSLog(@"ID not found");
    }
}

那么,当应用程序从 Apple 更新时,这是钥匙串无法保留其值/标识符的东西,还是我在某些时候错过了。请帮助是否可以将标识符永久存储在设备中,与安装、卸载、重置和更新应用程序无关。

或者,是否有任何 API 可以在生成时为我提供相同的 deviceID/唯一字符串,因此需要存储唯一字符串?

注意:应用必须支持 iOS 4.3 及更高版本。

【问题讨论】:

  • 从概念上讲,keychain 项目在应用升级后是持久化的,所以很可能是使用 SSKeychain 的问题。是升级后就消失一次,还是每次升级后密码都存储失败?您在代码中的哪个位置执行存储和检索?
  • 为什么在设置密码时检查“未找到”错误代码?它应该返回一个 BOOL 来判断它是否成功。我也找不到SSKeychainErrorNotFound 的文档,这是您(或其他人)所做的扩展吗?
  • 我还要检查的是权利文件。确保 keychain-access-groups 在旧 App Store 构建的权利文件和新的权利文件中具有相同的值。
  • Keychain Services Concepts Documentation的第一个注释中提到了对provision profile(在iOS上)的依赖

标签: ios ios5 uniqueidentifier keychain sskeychain


【解决方案1】:

你应该看看this answer。您现在面临的问题实际上是无法访问与您的捆绑种子 ID(捆绑 ID 之前的 10 个符号字母数字代码)相关的钥匙串组,这是您的团队标识符。因此,基本上,应用程序更新后对钥匙串的访问取决于您使用的分发证书,而不是像 @PF1 提到的配置文件。
为了证明我的观点,我建议您尝试以下步骤:

  1. 在 iTunes Connect 中为您的应用添加新版本。
  2. 使其“准备好上传”。
  3. 在会员中心为自己颁发新的分销证书。
  4. 创建两个新的应用商店配置文件 - 一个使用旧证书/第二个使用新证书。
  5. 像往常一样创建两个存档以将应用提交到 App Store - 一个使用旧证书/第二个使用新证书。
  6. 验证两者。拥有新证书的人会发出验证警告,指出此版本将失去对钥匙串组的访问权限。

【讨论】:

  • 我的问题是我用来将应用上传到应用商店的分发证书现已过期,我必须申请新证书才能更新应用。我现在能做什么?
  • 我不确定,但我认为种子 ID 应该被重用。无论如何,除了颁发新证书之外,您没有任何其他变体,所以...试着告诉我们进展如何。
  • 问题是我刚刚创建了一个 AdHoc .ipa,它的包标识符与我用来上传应用商店版本的标识符完全相同。但是当我通过应用商店版本安装应用程序时,钥匙串被重置。
【解决方案2】:

我知道这是一个老问题,但我留下这个答案以防万一它对某人有用。我在两个版本中使用相同的权利对其进行了修复。

【讨论】:

    【解决方案3】:

    对于遇到类似问题的其他人,我在本地测试并尝试手动升级应用程序时遇到了这个问题。我尝试使用来自 Xcode 的本地副本(使用我的团队配置文件配置)覆盖我设备上的版本(使用 App Store 配置文件配置)。正如 almas 在 cmets 中指出的那样,钥匙串似乎与用于构建的配置文件相关联。当我向 Apple 提交并更新我的应用时,SSKeychain 工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多