iOS SFHFKeychainUtils失败*有时*错误-25308 errSecInteractionNotAllowed

我有这个代码从给定的用户名NSString的钥匙串获取密码:

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 – 从我读过的,我认为这意味着需要访问钥匙串的某种用户交互。

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

任何指针赞赏…

好,所以我终于搞定了。

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

如果您只需要在应用程序处于活动状态时访问钥匙串,您将永远不会看到这个问题 – 但是如果您在手机被locking或应用程序在后台时需要进行处理,那么您会看到它。

在其他地方我读了kechain系统的默认访问属性是kSecAttrAccessibleAlways – 但我认为这是过时的。 似乎钥匙串系统的默认访问属性是这样的,当电话被locking的PIN码,然后项目不可用。

解决方法是更改​​SFHFKeychainUtils代码,以便在其pipe理的钥匙串项目(原始代码不这么做 – 大概是因为它在这些属性的预先约会)上设置特定的kSecAttrAccessible属性。

这个wordpress 更新版本的SFHFKeychainUtils代码中有修正 – searchkSecAttrAccessible,看看他们在哪里添加了可访问的属性代码。

希望这有助于任何人跑到这…