OGeek|极客世界-中国程序员成长平台

标题: ios - 向当前 bundle ID 添加前缀会重置钥匙串(keychain)吗? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 10:05
标题: ios - 向当前 bundle ID 添加前缀会重置钥匙串(keychain)吗?

我有一个 app(app1) 在 appstore 中, bundle ID 为 com.x。y 现在我正在同一个开发者帐户下开发另一个应用程序(app2), bundle id 为 com.x。z

我想让存储在 app1 中的钥匙串(keychain)值对 app2 可用。

keychain 的可用性由 keychain-access-groups 决定。 因此,如果我将前缀(当前团队 ID)添加到两个 bundle ID,我就可以获取这些值。示例 teamid.com.x.y teamid.com.x.z

问题是当我将前缀添加到 appstore 中的 app1 时,它会再次要求我不想要登录凭据,因为应用程序有很多用户。 我之前没有使用前缀,我只是添加了它们。 有没有一种方法可以让我在无需用户再次登录的情况下获得这两个应用程序的钥匙串(keychain)访问权限。



Best Answer-推荐答案


首先,重要的是要意识到 Xcode 已经将 AppIdentifierPrefix 添加到您的标识符中。不幸的是,它在 GUI 中隐藏了它,但如果你打开权利 plist,你会看到它。这是用于签署应用程序的标识符,它是用于强制访问控制的部分。我不相信您添加的 teamid 前缀真的有任何作用。我通常会推荐一个访问组 com.x.sharedcom.x.appgroup.shared 而不要使用 com.x.z(我m 假设 com.x.y 已经存在,所以你不能改变它)。

我在这里假设您不想强制用户升级 App1,对吗?我正在根据这个假设继续前进。

如果您可以升级 App1(不需要升级,但要确​​保所有客户都有升级版本),则仅存储在 com.x.y 中存在。否则,存储在 com.x.shared 中:

如果您现在根本不想升级 App1(是否需要),那么只需始终在 App2 中读取和写入 com.x.y

当您准备终止 com.x.y 组时(如果您最终能够升级所有支持 App1 的用户),那么您可以切换到:

这里的关键工具是,当您请求显式访问组时,您必须提供全部内容,包括您的 AppId(未显示在 Xcode GUI 中)。您当然可以对其进行硬编码,但更好的解决方案是动态查询它。我使用 David H's code 的更新版本:

- (NSString *)bundleSeedID {
  NSDictionary *query = @{ (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                           (__bridge id)kSecAttrAccount : @"bundleSeedIDQuery",
                           (__bridge id)kSecAttrService : @"",
                           (__bridge id)kSecReturnAttributes : (id)kCFBooleanTrue
                           };
  CFDictionaryRef result = nil;
  OSStatus status = SecItemCopyMatching((__bridge CFTypeRef)query,
                                        (CFTypeRef *)&result);
  if (status == errSecItemNotFound)
    status = SecItemAdd((__bridge CFTypeRef)query, (CFTypeRef *)&result);
  if (status != errSecSuccess)
    return nil;
  NSString *accessGroup = [(__bridge NSDictionary *)result
                           objectForKey__bridge id)kSecAttrAccessGroup];
  NSArray *components = [accessGroup componentsSeparatedByString"."];
  NSString *bundleSeedID = components[0];
  CFRelease(result);
  return bundleSeedID;
}

这将在运行时告诉您您的前缀。它这样做是通过创建一个伪造的钥匙串(keychain)条目,然后查询它并查看附加到它的访问组。

您可能对Getting Security and Privacy Right 的第一部分感兴趣来自 Renaissance.io 2014。您可以跳至“使用钥匙串(keychain)保护 secret ”。

关于ios - 向当前 bundle ID 添加前缀会重置钥匙串(keychain)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32183189/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4