- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个应用程序(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.shared
或 com.x.appgroup.shared
而不要使用 com.x.z
(我'我假设 com.x.y
已经存在,所以你不能改变它)。
我在这里假设您不想强制用户升级 App1,对吗?我正在推进这一假设。
如果您可以升级 App1(不需要升级,但要确保所有 新 客户都有升级版本),则仅在 com.x.y
中存储它存在。否则,存储在 com.x.shared
中:
如果您现在根本不想升级 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/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!