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

时间:2012-03-15 16:27:43

标签: ios keychain sfhfkeychainutils

我有这个代码从钥匙串中获取给定用户名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 - 从我所读到的认为这意味着要访问钥匙串需要某种用户交互。

有没有人知道为什么这个电话可能只对某些特定用户失败?此钥匙串条目特定于我的应用程序 - 那么为什么需要任何用户交互才能访问它?

任何指针都非常赞赏...

2 个答案:

答案 0 :(得分:44)

好的,所以我最终解决了这个问题。

最终,我找到了在手机上设置锁码的用户。如果手机被锁定,钥匙串系统会返回-25308错误。

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

在其他地方我读过kechain系统的默认访问属性是kSecAttrAccessibleAlways - 但我认为这已经过时了。似乎钥匙串系统的默认访问属性是这样的,当手机被密码锁定时,这些项目就不可用了。

对此的修复是更改SFHFKeychainUtils代码以在其管理的钥匙串项目上设置特定的kSecAttrAccessible属性(原始代码没有这样做 - 可能是因为它早于这些属性)。

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

希望这可以帮助其他人遇到这个......

答案 1 :(得分:0)

我在 iOS 14 中遇到了这个问题,其中 Widgets 扩展正在访问钥匙串以获取 JWT 令牌以调用一些休息。

显然,默认情况下,当设备被锁定并且我尝试使用的钥匙串项目无法访问时,小部件也会尝试更新。

将此属性设置为钥匙串元素(swift 5 代码)后,一切似乎都在工作:

keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock