iOS钥匙串SecItemAdd返回-25243。

12
我正在更新一款iPhone应用程序的默认配置,它的源代码位于GitHub。虽然我已经很久没有构建过这个应用程序了,但是我已经将Xcode升级到了4.2版本,并在最新的构建中加入了iOS 5支持。
然而,在测试设备上运行时,我遇到了以下断言错误:
2011-11-02 20:57:18.869 RoseBandwidth[903:707] Tried to add item, got result: -25243
2011-11-02 20:57:18.870 RoseBandwidth[903:707] *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/tim/code/RoseBandwidth/Classes/KeychainItemWrapper.m:312
2011-11-02 20:57:18.872 RoseBandwidth[903:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.'

我正在使用苹果的GenericKeychain项目中的KeychainItemWrapper类实现。值得注意的是,这个错误只在设备上显示,而不是模拟器(我知道平台之间访问组限制的差异,但通常我认为这会在模拟器上引起问题,而不是实际硬件)。
为什么会返回这个错误?我没有涉及到应用程序与钥匙链相关的部分;它的存储和检索数据方式与以前完全相同。
7个回答

18

如果可以的话,我会给你点赞不止一次——那个答案真是太神奇了。结果我在路上不知道把我的授权文件弄丢了,所以重新启用它们(并花了一段时间来调整配置文件)解决了这个问题。谢谢! - Tim

9
对于未来的搜索者,如果遇到-25243错误(意味着“没有访问控制”),可能的原因之一是在模拟器上运行。我最好的理论是应用程序的配置文件(或其签名)是应用程序知道其包种子的方式。而且包种子需要成为您的密钥链访问组名称的一部分。但是在模拟器上运行的应用程序不会被签名,因此与您指定的“keychain-access-group”具有缺失(或不同?)的捆绑种子。或者什么的。由于所有东西都文档化得很差,很难说清楚什么是什么。只需尝试在设备上运行它,并查看是否有所帮助即可。

这是一个很好的观点 - 感谢你提出来。我在我的原始问题中指出,我正在使用苹果的KeychainItemWrapper类,其中包括一个编译器#if子句来检查应用程序是否在模拟器上运行。那些没有使用该封装器的人确实需要采取预防措施。 - Tim

5
对于那些在尝试实现两个应用程序之间的“共享密钥链访问”并遇到此错误的人:
您需要为应用程序创建一个具有与您首次激活“共享密钥链访问”时所选团队ID相同的App ID。在此处创建您的App ID: Apple Member Center 之后,您需要从该App ID创建配置文件,并将其下载到计算机上。(双击它以安装到Xcode)
我假设您已经知道您需要“App ID前缀”才能访问密钥链,但对于那些不知道的人: “App ID前缀”是与您的Apple开发者帐户相关联的唯一文本标识符:enter image description here 要访问“SharedKeychain”,您需要在尝试从密钥链中写入或读取之前实现它,如下所示 keychainAccessGroupName = "AB123CDE45.myKeyChainGroup":
您可以查看这个教程了解更多信息:在iOS应用之间共享密钥链。 希望这可以帮助到您。

3

+1:嗯,这很烦人...我在模拟器上遇到了同样的问题(重置确实可以解决),但是(我相信)它不会发生在设备上。你有没有看到过这种情况在设备上随机发生? - JRG-Developer

1

正如其他人指出的那样,在设备构建中,错误码-25243通常是由于尝试访问您无权访问的钥匙串访问组引起的(它在您的Entitlements.plist文件或您的配置文件中缺失)。

但是在模拟器中可能会有另一种原因。模拟器根本不支持钥匙串访问组,因此如果您在钥匙串项目上设置了kSecAttrAccessGroup属性并尝试写入,则会出现-25243错误代码。

Apple的GenericKeychain示例代码中有这个注释:

// Ignore the access group if running on the iPhone simulator.
// 
// Apps that are built for the simulator aren't signed, so there's no keychain access group
// for the simulator to check. This means that all apps can see all keychain items when run
// on the simulator.
//
// If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the
// simulator will return -25243 (errSecNoAccessForItem).

0

当我使用生产证书和配置文件时,这对我起作用了。使用调试并没有起作用。


0
在我的经验中,我发现当我意识到我正在尝试将 kSecMatchLimitkSecMatchLimitOne 以及 kSecReturnDatakCFBooleanTrue 值传递给 SecItemAdd() 函数时,它会返回值 -25243。我移除了它们并仔细检查了应用程序ID和配置文件,一切都很好。
我不确定这是否有帮助,但根据我的经验,如果您要使用 SecItemAdd() 函数进行共享钥匙串访问,则不能使用这两个参数。

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