2012-03-15 28 views
25

我有这样的代码取回从钥匙串密码对于一个给定的用户名的NSString:的iOS SFHFKeychainUtils遇事*有时*错误-25308 errSecInteractionNotAllowed

NSError *error = nil; 
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; 
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error]; 
if(error != nil) 
    // log the error  

大部分时间对于大多数用户来说,这一切工作正常 - 但对于一些特定的用户,这似乎调用失败(并进行不及格)它返回以下错误:

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.) 

这显然是errSecInteractionNotAllowed - 从我读过我认为这意味着要访问钥匙链需要某种用户交互。

有没有人有任何想法为什么这个调用可能会失败的一些特定的用户只?此钥匙串条目特定于我的应用程序 - 那么为什么需要任何用户交互才能访问它?

任何指针非常感谢...

回答

40

好吧,所以我最终这样做了。

最终我找出了有问题的用户在手机上设置了锁码。如果电话被锁定,钥匙串系统返回这个-25308错误。

如果您只需要访问钥匙链,当应用程序在forground中处于活动状态时,您将永远不会看到此问题 - 但是如果您需要在手机锁定或应用程序处于后台时继续处理,那么您会看到它。

在其他地方我读过kechain系统的默认访问属性是kSecAttrAccessibleAlways - 但我认为这是过时的。看起来钥匙串系统的默认访问属性是这样的,即当电话被一个PIN码锁定时,这些项目不可用。

修复此问题的方法是更改​​SFHFKeychainUtils代码,以便在其管理的钥匙串项目(原始代码没有这样做 - 可能是因为它是对这些属性进行预先约会时)上设置特定的kSecAttrAccessible属性。

SFHFKeychainUtils代码的此wordpress updated version修复了它 - 搜索kSecAttrAccessible以查看它们添加了可访问的属性代码的位置。

希望这有助于任何人都遇到了此...

+2

我已经验证了这一点上的iOS4,iOS5的和iOS6的。在所有iOS版本中,如果在设备处于锁定状态(例如后台任务,报亭下载等)时读取未标记为kSecAttrAccessibleAlways的数据,则会返回errSecInteractionNotAllowed错误代码。 – 2012-11-12 09:35:41

+5

kSecAttrAccessibleAlways不是一个很好的选择 - 通过使用类似kSecAttrAccessibleAfterFirstUnlock(或更严格的设置,如果适用于您的应用),您可以获得更多的安全优势,并且仍然可以避免错误。 – frankodwyer 2012-11-12 13:05:42

+0

我可以确认,当应用程序在前台,但设备被锁定密码时,钥匙串库给我-25308。谢谢 ! – Magurizio 2013-12-28 12:18:43

相关问题