8

我有一个将用户名和密码存储在钥匙串中的应用程序。在 Xcode 3 上工作时一切正常,我最近搬到了 Xcode 4,现在当我运行应用程序时,我得到一个提示:

Application wants to use your confidential information stored in keychain" in your keychain.

点击总是允许后,我看到应用程序添加到钥匙串项目的访问控制列表中,但每次运行应用程序时都会得到。

同样在再次点击始终允许后,我看到访问控制有同一个应用程序的两个实例。似乎操作系统认为这是一个新应用程序。

任何想法表示赞赏。

4

1 回答 1

4

我认为问题在于您的签名的指定要求导致它不接受自己作为与自己“相同的应用程序”(出于钥匙串的目的)。

造成这种情况的一个常见原因(我认为这是您的原因)是使用开发人员 ID 应用程序证书,没有指定要求,也没有安装中间证书。

标准的开发者 ID 要求如下所示:

designated => anchor apple generic and 
identifier \"com.example.appName\" and 
((cert leaf[field.1.2.840.113635.100.6.1.9] exists) or 
 (certificate 1[field.1.2.840.113635.100.6.2.6] exists and 
 certificate leaf[field.1.2.840.113635.100.6.1.13] exists  and 
 certificate leaf[subject.OU] = \"1AZBYCXDW9V\" ))

如果您想自己构建它,则必须将标识符替换为捆绑标识符,并将 subject.OU 替换为证书中的值。(如果您在 Keychain Access 中双击它,它应该被列为组织单位。)然后您可以添加到“Other Code Signing Flags”:

--requirements "=designated ..." (the whole mess from above)

但是,更好的方法是使用 Xcode 4.3.2 或更高版本。如果它识别出您正在使用开发人员 ID 应用程序证书,并且可以在钥匙串中看到中间证书,它将默认生成此证书。

此外,如果您使用 Xcode 中的存档管理器来“导出开发人员 ID 签名的应用程序”,而不是仅使用目标目录中的构建,它将确保对您的应用程序和任何其他随附的可签名文件进行签名,并且它将测试一切都设置正确。(失败非常神秘——例如,您的“选择要签名的开发者 ID”步骤可能没有选择,系统日志中的消息没有有用的信息——但至少失败或成功的事实缩小了范围你的问题在哪里。)

无论哪种方式,您都需要从Developer Certificate Utility站点上的“Developer ID Intermediate Certificate”链接下载并安装(在您的构建机器上)名为“Developer ID Certification Authority”的中间证书。

最后一件事:即使这可以解决您在构建机器上运行的问题,您也确实希望在您支持的最旧的操作系统版本上进行测试。例如,Lion 的 codesign 编译的需求有时无法在 Leopard 上解析,有时甚至无法在 Snow Leopard 上解析。如果发生这种情况……请参阅Gatekeeper vs. Leopard:一个正在进行的故事

于 2012-06-29T17:50:28.563 回答