2011-11-03 194 views
12

我正在更新iPhone application,并对其默认配置稍作更改。不过,自从我创建它以来,已经有一段时间了,所以我已经将Xcode升级到了4.2,并且在最新版本中包含了iOS 5支持。iOS Keychain SecItemAdd返回-25243

当我去测试设备上,我得到以下断言错误:

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 projectKeychainItemWrapper类的实现。值得注意的是,这个错误只出现在设备上,而不是在模拟器中(我意识到平台之间的访问组限制差异,但通常我认为在模拟器上导致了问题,而不是实际的硬件)。

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

回答

18

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

+0

如果可以的话,我会多次提醒你 - 这个回答完全是神奇的。事实证明,我在途中丢失了我的权利文件,因此重新启用它们(并在一段时间内使用配置文件)解决了此问题。谢谢! – Tim

9

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

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

什么的。它的记录都很差,很难说出什么。试着在设备上运行它,看看是否有帮助。

+0

这是一个好点 - 感谢提高它。我注意到在我原来的问题中,我使用Apple的[KeychainItemWrapper](https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html#//apple_ref/doc/uid/DTS40007797 -Classes_KeychainItemWrapper_m-DontLinkElementID_10)类,它包含一个编译器'#if'子句来检查应用程序是否在模拟器上运行。没有使用这种包装的人需要采取预防措施。 – Tim

+0

谢谢你,jemmons。帮助我很多 – makaron

3

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

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

+0

+1:好吧,这很烦人...我遇到了与模拟器相同的问题(并且重置肯定会修复它),但是(我相信)它不会在设备上发生。你有没有看到这种随机发生在设备上? –

+0

不,我到目前为止尚未在设备上看到此错误。 – ToniTornado

1

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

但是在模拟器中可能存在另一个原因。模拟器不支持钥匙串访问组,所有,所以如果你设置钥匙链项目上的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). 
4

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

您需要创建在您首次启动“功能”中的“共享钥匙串访问”时选择了与您选择的相同团队ID的应用的应用ID。在这里创建应用ID: Apple Member Center

之后,你需要创建从应用程序ID供应文件并将其下载到您的计算机(双击它安装到X-代码)

我想你已经知道你需要“应用程序ID前缀”访问钥匙链,但对于那些谁不知道: “应用程序ID前缀”是您的苹果开发者帐户关联的唯一文本标识:enter image description here

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

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup"

你可以看看这个教程进一步信息:Share Keychain between iOS apps.

希望有所帮助。

0

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

0

以我的经验,我得到的返回值-25243当我意识到我是想用kSecMatchLimitOnekSecReturnDatakCFBooleanTrue值传递kSecMatchLimitSecItemAdd()功能。我删除了这些,并重复检查应用ID和配置文件,一切都很好。

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