应用程序从iTunes更新后,Keychain不会保留数据

时间:2014-02-07 12:47:43

标签: ios ios5 uniqueidentifier keychain sskeychain

我一直在使用SSKeychain开源库在我的iOS应用中安全地存储数据。昨天,我遇到了一个问题,当我从iTunes将v1.0从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在很多方面都进行了转换。到Unique Device Identifier,因为方法已被弃用。

适用于Store&amp ;;的应用程序片段Retrive:

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及更高版本。

3 个答案:

答案 0 :(得分:3)

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

  1. 在iTunes Connect中为您的应用添加新版本。
  2. 准备好"准备上传"。
  3. 在会员中心向自己发行新的发行证明书。
  4. 创建两个新的appstore配置文件 - 一个包含您的旧/第二个新证书。
  5. 创建两个档案,就像您通常所做的那样,将应用程序提交到App Store - 一个带有旧/秒的新证书。
  6. 验证两者。具有新证书的证书将提供验证警告,即此版本将丢失对钥匙串组的访问权。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

enter image description here

enter image description here