我有这个代码从钥匙串中获取给定用户名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 - 从我所读到的认为这意味着要访问钥匙串需要某种用户交互。
有没有人知道为什么这个电话可能只对某些特定用户失败?此钥匙串条目特定于我的应用程序 - 那么为什么需要任何用户交互才能访问它?
任何指针都非常赞赏...
答案 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