iOS Keychain SecItemAdd返回-25243

时间:2011-11-03 01:14:09

标签: ios keychain

我正在努力更新iPhone application,但默认配置稍有变化。自从我最后一次构建它以来已经有一段时间了,因此我将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.'

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

为什么我会收到此错误?我没有触及与应用程序的钥匙串相关部分相关的任何内容;它完全按照以前的方式存储和检索数据。

7 个答案:

答案 0 :(得分:18)

好的,我无法完成您的项目构建,但是从How to share keychain data between iOS applications我想您可能想要查看您的权利文件。至少在github项目中,您没有在Keychain Access Groups中指定任何内容。

答案 1 :(得分:9)

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

我最好的理论是应用程序的配置文件(或其签名)是应用程序如何知道其捆绑种子是什么。捆绑种子需要成为钥匙串访问组名称的一部分。但是在模拟器上运行的应用程序没有签名,因此缺少(或不同的)捆绑种子而不是您指定的keychain-access-group

或者其他什么。这一切都记录得很糟糕,很难说是什么。只需尝试在设备上运行它,看看是否有帮助。

答案 2 :(得分:5)

对于那些收到此错误并尝试在两个应用之间实现“共享密钥链访问”的人:

您需要为首次在“功能”中激活“共享钥匙串访问权限”时选择的相同团队ID为您的应用创建应用ID。在此处创建您的应用ID:  Apple Member Center

之后,您需要从该App Id创建配置文件并将其下载到您的计算机。(双击它以安装到x-code)

我假设您已经知道您需要“App ID Prefix”来访问密钥链,但对于那些不知道的人: “App ID Prefix”是与Apple开发者帐户关联的唯一文本标识符:enter image description here

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

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup"

您可以查看本教程以获取更多信息:Share Keychain between iOS apps.

希望有所帮助。

答案 3 :(得分:3)

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

请参阅此问题/答案如何重置模拟器:https://stackoverflow.com/a/3442326

答案 4 :(得分:1)

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

但在模拟器中可能还有其他原因。模拟器不支持所有的钥匙串访问组,因此如果您在钥匙串项目上设置kSecAttrAccessGroup属性并尝试编写它,您将收到此-25243错误代码。< / p>

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

根据我的经验,当我意识到我尝试将business = models.ForeignKey(modelname) -25243kSecMatchLimit一起传递kSecMatchLimitOne时,我得到了返回值kSecReturnDatakCFBooleanTrue函数。我删除了那些并仔细检查了应用程序ID和配置文件,一切都很好。

我不确定这是否有用,但根据我的经验,如果您将SecItemAdd()函数用于共享密钥链访问,则这两个参数不得存在。