2012-06-27 46 views
6

我有在钥匙串存储用户名和密码的应用程序。在Xcode的3个工作时,一切工作正常,我最近搬到的Xcode 4,现在当我运行应用程序,我得到一个提示:应用始终要求提供访问权限的钥匙串

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

击中后始终让我看到应用程序添加到访问控制钥匙扣项目列表,但每次运行应用程序时都会收到。

也创下总是一次允许后,我看到,门禁机具有相同的应用程序的两个实例。看起来像操作系统认为这是一个新的应用程序。

任何想法表示赞赏。

+0

你如何代码签名您的应用程序? (这是对这个问题的最常见的原因之一。) – abarnert

+0

我必须建立在Xcode构建设置代码标志,在代码标志我选择了一个代码签名身份到我的开发者ID应用 –

+0

有你在运行一个以前的版本同一台机器?根据指定的要求(这取决于您使用的Xcode 4的版本,如果您只是坚持使用默认设置),Keychain可能会将您的旧版本和新版本作为不同的应用程序处理,这意味着您的新版本将弹出警告如果旧版本已将任何内容存储在钥匙串中。 – abarnert

回答

3

我认为,问题是,你的签名的指定要求,导致其不能接受自己是“相同的应用程序”的本身(钥匙扣目的)。对于

一个常见原因这和我认为这是你的,是使用开发者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更换标识。 (如果您在钥匙串访问双击它,它应被列为组织单位。)然后,您可以添加到“其他代码签名标志”:

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

然而,一个更好的方法来做到这一点使用Xcode 4.3.2或更高版本。如果它认识到您正在使用开发者ID应用程序证书,并且可以看到钥匙串中的中间证书,则默认情况下会生成该证书。另外,如果您使用Xcode中的Archive Organizer来“导出开发者ID签署的应用程序”,而不是仅仅使用目标目录中的版本,它将确保签署您的应用程序和任何其他封闭的可签名,并且它会测试一切安装正确。 (这些失败相当隐晦 - 例如,您的“选择开发人员ID进行签名”步骤可能没有选择,系统日志中没有任何有用信息的消息 - 但至少失败或成功的事实会缩小)

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

最后一两件事:即使问题得以解决您的构建机器上运行,你真的想测试你支持的老版本的操作系统。例如,Lion的codesign编译的需求有时不能在Leopard上解析,有时甚至在Snow Leopard上也不能解析。如果发生这种情况......请参阅Gatekeeper vs. Leopard: an ongoing tale

+0

谢谢abarnert,那是很多很棒的信息。但看起来我发现了这个问题的解决方案。我从Xcode的UI中删除了代码签名,并在构建脚本末尾添加了这个命令行步骤。这似乎现在工作正常,但真的,非常感谢所有的帮助。 –

+1

尼廷,你能分享你的决议,我有与Xcode 6相同的问题 –

相关问题