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不起作用。
根据我的经验,当我意识到我正在尝试将kSecMatchLimitOne
和kSecReturnData
与kCFBooleanTrue
值一起kCFBooleanTrue
给SecItemAdd()
函数时,得到返回值-25243
。 我删除了这些,并双重检查应用程序ID和供应configuration文件,一切都很好。
我不确定这是否有帮助,但根据我的经验,如果您将使用SecItemAdd()
函数进行共享钥匙串访问,那么这两个参数不能存在。