Macos 应用程序始终请求访问密钥链的权限

Macos 应用程序始终请求访问密钥链的权限,macos,xcode4,Macos,Xcode4,我有一个在钥匙链中存储用户名和密码的应用程序。在使用Xcode 3时,一切都很好,最近我转到了Xcode 4,现在当我运行应用程序时,我得到一个提示: 应用程序希望使用您的钥匙链中存储在“钥匙链”中的机密信息。 点击always allow后,我看到应用程序被添加到钥匙链项目的访问控制列表中,但每次运行应用程序时,我都会看到 再次点击Always allow之后,我发现访问控制有两个相同应用的实例。似乎操作系统认为这是一个新应用 任何想法都值得赞赏。我认为问题在于,您的签名的指定要求导致它不接受

我有一个在钥匙链中存储用户名和密码的应用程序。在使用Xcode 3时,一切都很好,最近我转到了Xcode 4,现在当我运行应用程序时,我得到一个提示:

应用程序希望使用您的钥匙链中存储在“钥匙链”中的机密信息。

点击always allow后,我看到应用程序被添加到钥匙链项目的访问控制列表中,但每次运行应用程序时,我都会看到

再次点击Always allow之后,我发现访问控制有两个相同应用的实例。似乎操作系统认为这是一个新应用


任何想法都值得赞赏。

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

造成这种情况的一个常见原因是使用开发者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\" ))
如果您想自己构造此项,则必须将标识符替换为bundle标识符,将subject.OU替换为证书中的值。(如果您在Keychain Access中双击它,则应将其列为组织单位。)然后您可以添加到“其他代码签名标志”:

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

此外,如果您使用Xcode中的Archive Organizer“导出开发人员ID签名的应用程序”,而不仅仅是使用目标目录中的构建,它将确保对您的应用程序和任何其他附带的可签名文件进行签名,并且它将测试所有设置是否正确。(失败非常隐晦,例如,您的选择要签名的开发人员ID“步骤可能只是没有选择,系统日志中的消息没有有用的信息,但至少它失败或成功的事实缩小了问题的范围。)

无论哪种方式,您都需要从站点上的“开发者ID中间证书”链接下载并安装(在构建机器上)中间证书,称为“开发者ID证书颁发机构”


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

您如何对应用程序进行代码签名?(这是这个问题最常见的原因之一。)我必须在Xcode构建设置中设置代码签名,在代码签名下,我已为我的开发者ID应用程序选择了一个代码签名标识。您是否在同一台计算机上运行过上一个构建?取决于指定的要求(这取决于您使用的Xcode 4的版本,如果您只是坚持默认设置),密钥链可能会将您的旧版本和新版本视为不同的应用程序,这意味着如果旧版本在密钥链中存储了任何内容,您的新版本将弹出警告。是的,我已尝试删除密钥链并添加(我的应用程序创建此钥匙链条目(如果不存在)但我还是一次又一次地看到弹出窗口。即使我一次又一次地运行同一个.app,我也不止一次地看到它添加到了keychain项的ACL中。在对我的应用程序进行签名时,我是否应该做些什么?我刚刚发现的另一件有趣的事情是,当我尝试用本地生成的证书对我的应用程序进行代码签名时,它会st工作正常。如果我尝试对apple生成的开发者证书执行同样的操作,我会看到这种奇怪的行为,在这种行为中,我会一次又一次地被提示获得访问密钥链的权限。感谢abarnert,这是很多很棒的信息。但看起来我找到了解决此问题的方法。我在Xcode中从UI中删除了代码签名,并添加了这是我构建脚本末尾的一个命令行步骤。现在似乎工作正常,但真的非常感谢所有的帮助。尼廷,你能分享你的解决方案吗,我对Xcode 6也有同样的问题
--requirements "=designated ..." (the whole mess from above)