gpt4 book ai didi

ios - 向当前包 ID 添加前缀会重置钥匙串(keychain)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:01 26 4
gpt4 key购买 nike

我有一个应用程序(app1)在应用程序商店中, bundle ID 为 com.x.y现在我正在使用同一个开发者帐户开发另一个应用程序 (app2),捆绑 ID 为 com.x.z

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

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

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

最佳答案

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

我在这里假设您不想强制用户升级 App1,对吗?我正在推进这一假设。

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

  • 当您从钥匙串(keychain)读取数据时,不要使用访问组。这将获得第一个匹配的记录。
  • 当您写入钥匙串(keychain)时,使用您读取的记录中的访问组。

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

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

  • com.x.y 读取。如果找到,将其删除,然后将其重新创建为 com.x.shared。您可以在应用程序启动时一次性执行此操作(只需编写一个 NSUserDefaults 表示您已完成此操作。
  • 从那时起,始终明确使用 com.x.shared

这里的关键工具是,当您请求一个明确的访问组时,您必须提供整个内容,包括您的 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 - 向当前包 ID 添加前缀会重置钥匙串(keychain)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32183189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com