iOS Keychain SecItemAdd返回-25243

我正在更新一个iPhone应用程序的默认configuration稍作改动。 不过,自从我最后一次构build它以来,已经有一段时间了,所以我已经将Xcode升级到了4.2,并且在最新版本中包含了iOS 5支持。

当我去testing设备时,我得到以下断言错误:

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.' 

我正在使用Apple的GenericKeychain项目的KeychainItemWrapper类的实现。 值得注意的是,这个错误只出现在设备上,而不是模拟器(我知道平台之间的访问组限制差异,但通常我认为在模拟器上导致了问题,而不是实际的硬件)。

为什么我会收到这个错误? 我没有触及任何有关应用程序的钥匙链相关部分; 它存储和检索数据就像以前一样。

好吧,我不能完全让你的项目build立,但从如何共享iOS应用程序之间的钥匙串数据,我想你可能想检查你的权利文件。 至less在github项目中,您没有在Keychain访问组中指定任何内容。

对于碰巧在这里结束的将来的search者来说,在模拟器上运行-25243错误(这意味着No access control ,BTW)的另一个可能的原因。

我最好的理论是应用程序的供应configuration文件(或其签名)是应用程序知道它的捆绑种子是什么。 捆绑包种子需要成为您的钥匙串访问组名称的一部分。 但是,在模拟器上运行的应用程序不会被签名,因此与您指定的keychain-access-group相比,缺less(或不同的?)捆绑包种子。

或者其他的东西。 这些logging都很差,很难说清楚是什么。 只要尝试在设备上运行它,看看是否有帮助。

对于那些你得到这个错误,并试图实现两个应用程序之间的“共享密钥链访问”:

您需要为您的应用程序创build一个应用程序ID,与您在“function”中首次激活“共享钥匙串访问”时select的相同团队ID相同。 在这里创build您的应用程序ID: Apple会员中心

之后,您需要从该应用程序ID创buildconfiguration文件并将其下载到您的计算机(双击它以安装到x代码)

我假设您已经知道您需要“应用程序ID前缀”来访问密钥链,但对于那些不知道的人:“应用程序ID前缀”是与您的Apple开发人员帐户关联的唯一文本标识符: 在这里输入图像说明

要访问“SharedKeychain”,您需要在尝试写入钥匙串或从钥匙串读取之前像这样实现它

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup"

您可以查看本教程获取更多信息: 在iOS应用程序之间共享钥匙串。

希望有所帮助。

即使我没有触摸代码,我也会在模拟器中不时得到相同的错误。 模拟器的重置为我解决了这个问题。

看到这个问题/答案如何重置模拟器: https : //stackoverflow.com/a/3442326

正如其他人指出的那样,在设备构build中,错误-25243通常是由于尝试访问您没有权限的钥匙串访问组而造成的。 (它从您的Entitlements.plist文件或您的供应configuration文件中缺less。)

但是在模拟器中还有另一个原因。 模拟器根本不支持kSecAttrAccessGroup链访问组,所以如果你在kSecAttrAccessGroup链项目上设置了kSecAttrAccessGroup属性,并尝试写它,你会得到这个-25243的错误代码。

仅供参考,苹果的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). 

当我使用生产证书和configuration文件时,这对我有效。 使用debugging不起作用。

根据我的经验,当我意识到我正在尝试将kSecMatchLimitOnekSecReturnDatakCFBooleanTrue值一起kCFBooleanTrueSecItemAdd()函数时,得到返回值-25243 。 我删除了这些,并双重检查应用程序ID和供应configuration文件,一切都很好。

我不确定这是否有帮助,但根据我的经验,如果您将使用SecItemAdd()函数进行共享钥匙串访问,那么这两个参数不能存在。