菜鸟教程小白 发表于 2022-12-13 10:05:33

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


                                            <p><p>我有一个 app(app1) 在 appstore 中, bundleID 为 com.x。<strong>y</strong>
现在我正在同一个开发者帐户下开发另一个应用程序(app2), bundleid 为 com.x。<strong>z</strong></p>

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

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

<p><strong>问题是</strong>当我将前缀添加到 appstore 中的 app1 时,它会再次要求我不想要登录凭据,因为应用程序有很多用户。
我之前没有使用前缀,我只是添加了它们。
有没有一种方法可以让我在无需用户再次登录的情况下获得这两个应用程序的钥匙串(keychain)访问权限。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>首先,重要的是要意识到 Xcode 已经将 AppIdentifierPrefix 添加到您的标识符中。不幸的是,它在 GUI 中隐藏了它,但如果你打开权利 plist,你会看到它。这是用于签署应用程序的标识符,它是用于强制访问控制的部分。我不相信您添加的 <code>teamid</code> 前缀真的有任何作用。我通常会推荐一个访问组 <code>com.x.shared</code> 或 <code>com.x.appgroup.shared</code> 而不要使用 <code>com.x.z</code>(我m 假设 <code>com.x.y</code> 已经存在,所以你不能改变它)。</p>

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

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

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

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

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

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

<p>这里的关键工具是,当您请求显式访问组时,您必须提供全部内容,包括您的 AppId(未显示在 Xcode GUI 中)。您当然可以对其进行硬编码,但更好的解决方案是动态查询它。我使用 <a href="https://stackoverflow.com/q/11726672/97337" rel="noreferrer noopener nofollow">David H&#39;s code</a> 的更新版本:</p>

<pre><code>- (NSString *)bundleSeedID {
NSDictionary *query = @{ (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                           (__bridge id)kSecAttrAccount : @&#34;bundleSeedIDQuery&#34;,
                           (__bridge id)kSecAttrService : @&#34;&#34;,
                           (__bridge id)kSecReturnAttributes : (id)kCFBooleanTrue
                           };
CFDictionaryRef result = nil;
OSStatus status = SecItemCopyMatching((__bridge CFTypeRef)query,
                                        (CFTypeRef *)&amp;result);
if (status == errSecItemNotFound)
    status = SecItemAdd((__bridge CFTypeRef)query, (CFTypeRef *)&amp;result);
if (status != errSecSuccess)
    return nil;
NSString *accessGroup = [(__bridge NSDictionary *)result
                           objectForKey:(__bridge id)kSecAttrAccessGroup];
NSArray *components = ;
NSString *bundleSeedID = components;
CFRelease(result);
return bundleSeedID;
}
</code></pre>

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

<p>您可能对<a href="http://renaissance.io/2014/sessions/get_security_and_privacy_right" rel="noreferrer noopener nofollow">Getting Security and Privacy Right</a> 的第一部分感兴趣来自 Renaissance.io 2014。您可以跳至“使用钥匙串(keychain)保护 secret ”。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 向当前 bundleID 添加前缀会重置钥匙串(keychain)吗?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32183189/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32183189/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 向当前 bundle ID 添加前缀会重置钥匙串(keychain)吗?