我目前存储的用户名(电子邮件)和电子邮件和密码的咸散列在iOS的钥匙链.我使用的ARC'ified版本找到here .
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];
当我需要在应用程序处于活动状态时为网络呼叫取出令牌时,这一切都能正常工作。它适用于从干净的启动状态登录,以及整个过程中的所有网络呼叫。当应用程序处于后台时,麻烦就开始了。
请记住,这只是偶尔发生,我还没有把它固定到一个特定的iOS版本或设备上。
用户访问了一个位置(区域监控),我想用他们的状态更新服务器。我尝试从keychain中取出令牌,就像我对其他网络调用所做的那样,然后更新状态。但对一些用户来说,值为零。没有它,我就不能更新网络内容。为什么这对大多数用户有效,但对一小部分人无效?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
我已经回到了非ARC版本的keychainwrapper,但我仍然得到相同的结果。我希望对此有任何反馈。这只是我的一小部分用户,但这是一个我想解决的问题,而不是担心。
此外,我所有的后台工作都设置在backgroundTask中,以防止超时。我对围绕钥匙链的工作没有任何问题,但在我的令牌填满之前,我不会让事情继续进行。
编辑我已经解决了keychain无法从后台检索值的问题。我将在下面发布答案并接受它,因为我觉得这个问题以后可能会对其他人有价值。
4条答案
按热度按时间0g0grzrc1#
我的问题接近目标的原因,但不完全是。在阅读了一个又一个博客,一个又一个教程后,我终于找到了一个可能会发生什么的暗示。
锁定的主屏幕。keychain教程总是将keychain的辅助功能设置留空,因此它默认为Apple最低/最安全的访问级别。但是,如果用户在锁屏界面上有密码,则此级别不允许访问keychain。答对了!这解释了偶尔发生的行为,以及为什么这种情况只发生在一小部分用户身上。
一行代码就能解决所有问题。
在我设置用户名和密码值的地方添加这一行。工作起来很有魅力。希望这能帮助到一些人。它让我困惑了很长一段时间,直到我能够把碎片拼在一起。
muk1a3rh2#
使用
kSecAttrAccessibleAfterFirstUnlock
代替kSecAttrAccessibleAlways
。从Apple's documentation开始:
一米二米一x
重新启动后,在用户解锁设备一次之前,无法访问钥匙串项目中的数据。
第一次解锁后,数据将保持可访问状态,直到下次重新启动。**建议对需要由后台应用程序访问的项目执行此操作。**使用加密备份时,具有此属性的项目将迁移到新设备。
dgtucam13#
在我的例子中,watchOS 2在iOS端访问钥匙串数据。
开始使用kSecAttrAccessibleWhenUnlockedThisDeviceOnly,无论iPhone是否锁定,我都可以读取数据,当手表试图访问钥匙链时,我会收到Error,这让我非常困惑::SecTrustEvaluate [叶颁发者公用名主题公用名]
在某些情况下,它将变成::SecOS状态出现错误:[-25308]错误域= NOS状态错误域代码=-25308“ks_crypt:e00002 e2未能“oe”项目(6类,袋:0)试图在密钥链锁定时访问项目。”UserInfo={NSDescription=ks_crypt:e00002 e2未能“oe”项目(6类,袋:0)试图在钥匙串锁定时访问项目。}
我会更新我的答案,如果我得到更多的信息。
n8ghc7c14#
这可能是由于苹果的数据保护政策,这是在某种程度上模糊从开发人员的Angular 来看。解决办法是当应用程序的启动检查是否钥匙串是可访问的或不可访问的,如果不可访问,你可能会杀死你的应用程序(与适当的弹出窗口)取决于你的应用程序类型。