Sim*_*ast 30 keychain ios 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
Run Code Online (Sandbox Code Playgroud)
对于大多数用户来说,这一切都可以正常工作 - 但是对于某些特定用户来说,这个调用似乎失败了(并且继续失败),它返回以下错误:
The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)
Run Code Online (Sandbox Code Playgroud)
这显然是errSecInteractionNotAllowed - 从我读过的内容来看,我认为这意味着要访问钥匙串需要某种用户交互.
有没有人知道为什么这个电话可能只对某些特定用户失败?此钥匙串条目特定于我的应用程序 - 那么为什么需要任何用户交互才能访问它?
任何指针都非常赞赏......
Sim*_*ast 45
好的,所以我最终解决了这个问题.
最终,我找到了在手机上设置锁码的用户.如果手机被锁定,钥匙串系统会返回-25308错误.
如果您只是在应用程序在forground中处于活动状态时才需要访问钥匙串,您将永远不会看到此问题 - 但如果您需要在手机锁定或应用程序处于后台时进行处理,那么您会看到它.
在其他地方我读过kechain系统的默认访问属性是kSecAttrAccessibleAlways - 但我认为这已经过时了.似乎钥匙串系统的默认访问属性是这样的,当手机被密码锁定时,这些项目就不可用了.
解决此问题的方法是更改SFHFKeychainUtils代码,以便在其管理的钥匙串项目上设置特定的kSecAttrAccessible属性(原始代码未执行此操作 - 可能是因为它预先标记了这些属性).
此wordpress 更新版本的SFHFKeychainUtils代码中包含修复程序 - 搜索kSecAttrAccessible以查看它们添加了可访问属性代码的位置.
希望这可以帮助其他人遇到这个......
我在 iOS 14 中遇到了这个问题,其中的 Widgets 扩展正在访问钥匙串以获取 JWT 令牌来调用一些休息。
显然,当设备锁定并且我尝试使用的钥匙串项目无法访问时,小部件默认也会尝试更新。
将此属性设置为钥匙串元素(swift 5 代码)后,一切似乎都正常:
keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10674 次 |
| 最近记录: |