更新配置文件是否会影响密钥串访问,当我提交应用程序更新到AppStore时?

17
我有一个 iPhone 应用程序,使用密钥链 进行身份验证相关的存储。
我还有一个即将到期的 Provisioning Profile。
密钥链访问文档 中指出:

在 iPhone 上,密钥链权限取决于用于签署应用程序的配置文件。请确保在不同版本的应用程序中始终使用相同的配置文件。

由于我的 Provisioning Profile 即将到期,我在 provisioning portal 中更新了它,下载并双击它,将其“安装”到 XCode 的组织者中。
在向应用商店提交应用程序更新后,我基本上看到了一个空的密钥链(用户被要求再次登录)。
我的问题是:更新用于签署应用程序的配置文件是否会影响在使用更新后的配置文件提交应用程序更新时的钥匙串访问?文档只说要使用“相同的配置文件”,但不清楚更新的配置文件是否算作一个不同的配置文件(正如我的经验所述)。
这是为什么呢? 更新 在tc的答案的帮助下解决了。查看提交给苹果的每个.ipa文件中的embedded.mobileprovision文件,发现过期的证书和配置文件用于签署应用程序版本x,并且不同的证书和配置文件用于签署应用程序版本x+1(罪魁祸首:XCode的代码签名身份的“自动配置文件选择器”功能)。
第一个证书和配置文件留下来是因为开发人员使用不同的iOS Developer Program帐户开发了一个不相关的应用程序(在同一台机器上,使用相同的OSX用户)。跨多个iOS开发人员计划帐户的配置文件显然都存储在〜/Library/MobileDevice/Provisioning Profiles中,因此它们都是XCode自动配置文件选择功能的候选项。
我通过选择一个被我误认为是即将到期的分发证书的更新/有效版本的完全不同的分发证书,更改了代码签名身份,并提交了更新。相同的应用程序,不同的证书,不同的配置文件==空的密钥链。
3个回答

21

您可以使用的钥匙串是由 entitlements 中的 keychain-access-groups 决定的,它仅限于 provisioning profile 中的 keychain-access-groups 的一个子集,而这取决于 "bundle seed" / "prefix"(在 provisioning profile 中为 ApplicationIdentifierPrefix)设置在 "App ID" 中。

假设您已经保留了旧的提交应用程序(或者从 iTunes 获得了 .ipa,这只是一个 zip 文件),请查看旧版和新版应用程序中的 embedded.mobileprovision(在终端中运行 less Foo.app/embedded.mobileprovision 应该就可以了,或者您可以在文本编辑器中打开它,尽管有时会选择错误的行结尾)。您要找的是类似于以下内容(您可能会看到一些额外的键用于推送/ iCloud):

    <key>Entitlements</key>
    <dict>
            <key>application-identifier</key>
            <string>A1B2C3D4E5.com.example.MyApp</string>
            <key>get-task-allow</key>
            <false/>
            <key>keychain-access-groups</key>
            <array>
                    <string>A1B2C3D4E5.*</string>
            </array>
    </dict>

你也可以查看你的应用程序实际签署的授权:

codesign -d --entitlements - Foo.app/Foo | vis

据我所知,钥匙串访问组默认为例如A1B2C3D4E5.com.example.MyApp,但是只要与A1B2C3D4E5.*匹配,就可以将其设置为任何你想要的内容(Xcode 4甚至有一个漂亮的GUI授权编辑器)。如果包前缀不同,那就会导致你看到的问题。我认为只要你没有启用推送/游戏中心等功能,你可以将其改回来。


1
这为我们解开了谜团,谢谢。不久我将发布关于问题所在的更新... - Roatin Marth

9
只要您的应用程序bundle id不改变,就不会有与钥匙串相关的问题。
考虑到我们都必须每年更新证书和分发配置文件,如果这样做会破坏我们应用程序的钥匙串访问权限,那将会是一场混乱。
我有一个已经在App Store上线超过4年的应用程序。它使用钥匙串。多次使用更新后的配置文件进行了更新。没有出现任何钥匙串问题。

2
如果应用程序的捆绑标识更改,那么这是否意味着没有人会收到更新?也就是说:我确定它没有改变。你有什么想法为什么钥匙串访问发现一个空的钥匙串? - Roatin Marth
@maddy 这与应用程序包标识有关,而不是配置文件吗? - onmyway133

1
对于其他寻找答案的人,我遇到了不同的问题。我按照手动步骤重新签名ipa后,它没有任何权限,这意味着无法访问钥匙串。因此,我创建了一个脚本来重新签名ipa,但保留原始授权。我在http://baltaks.com/2013/08/resigning-enterprise-ios-apps发布了该脚本,并将根据需要进行更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接