iTunes 更新应用后钥匙串无法保留数据

8

我一直在使用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,苹果对Unique Device Identifier进行了很多转换,因此应用程序强烈依赖于唯一字符串/设备标识符。以下是“存储和检索”的代码片段:
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");
    }
}

那么,当应用程序从苹果更新时,钥匙串是否无法保留其值/标识符?还是我错过了某些点。如果可能的话,请帮忙将标识符永久存储在设备中,与安装、卸载、重置和更新应用程序无关。

或者,是否有任何API可以提供相同的设备ID/唯一字符串,因此需要存储唯一字符串?

注意:应用程序必须支持iOS 4.3及以上版本。


3
就概念而言,钥匙链项目在应用程序升级后将被持久化,因此这很可能是在使用SSKeychain时出现了故障。它只是在升级后就消失了,还是每次升级后密码都无法存储?在代码中的哪个部分执行存储和检索? - WDUK
1
为什么在设置密码时要检查“NotFound”错误代码?它应该返回一个BOOL值,表示是否成功。我也找不到“SSKeychainErrorNotFound”的文档,这是你(或其他人)创建的扩展吗? - WDUK
1
我还要检查的是授权文件。确保在旧的App Store版本的授权文件和新版本的授权文件中,<key>keychain-access-groups</key>的值相同。 - almas
Keychain Services Concepts Documentation的第一个注释中提到了对于iOS来说,依赖于供应配置文件。 - thelaws
3个回答

5
您应该查看这个答案。您现在面临的问题实际上是无法访问与您的包种子ID(您的团队标识符之前的10个字母数字代码)相关联的密钥链组,这就是您遇到的问题。因此,基本上,应用程序更新后访问密钥链取决于您使用的分发证书,而不是像@PF1提到的那样依赖于配置文件。
为了证明我的观点,建议您尝试以下步骤:
  1. 在iTunes Connect中为您的应用添加一个新版本。
  2. 将其设置为“准备上传”状态。
  3. 在成员中心向自己发放新的分发证书。
  4. 创建两个新的App Store配置文件-一个使用旧证书/第二个使用新证书。
  5. 像往常一样创建两个存档以提交应用程序到App Store-一个使用旧证书/第二个使用新证书。
  6. 验证两个存档。使用新证书的那个将给出验证警告,指出访问密钥链组将在此版本中丢失。

1
我的问题是我用来上传应用到应用商店的分发证书已经过期了,我必须请求一个新的证书才能更新应用。现在我该怎么办? - Rashid
我不确定,但我认为种子ID应该被重复使用。无论如何,除了发行新证书之外,您没有其他选择...尝试并告诉我们进展如何。 - Petro Korienev
问题是我刚刚创建了一个AdHoc .ipa文件,它的捆绑标识符与我用于上传应用商店版本的标识符完全相同。但是当我在应用商店版本上安装应用程序时,钥匙串会被重置。 - Rashid

2
我知道这是一个老问题,但我还是留下了这个答案,以防对某些人有用。我使用相同的授权在两个版本中都解决了它。
图片链接如下:
第一张:enter image description here
第二张:enter image description here

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接