应用程序从 iTunes 获取更新后,钥匙串不会保留数据

问题描述 投票:0回答:3

我一直在使用 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 进行了很多与
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");
    }
}

那么,当应用程序从 Apple 更新时,钥匙串是否无法保留其值/标识符,或者我是否在某个时刻错过了?是否可以将标识符永久存储在设备中,而无需安装、卸载、重置和更新应用程序?

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

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

ios ios5 uniqueidentifier keychain sskeychain
3个回答
5
投票

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

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

2
投票

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

enter image description here

enter image description here


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.