iOS KeyChain不从后台检索值
我目前在iOS KeyChain存储用户名(电子邮件)和电子邮件和密码的盐渍散列。 我正在使用这里find的ARC'ified版本。
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];
这一切工作正常,当我需要拉动令牌为我的networking调用,而应用程序是积极的。 它适用于从干净的启动login,以及所有的networking通话。 当应用程序在后台时,麻烦就开始了。
请记住,这只是偶尔发生,我还没有把它固定到一个特定的iOS版本或设备。
用户访问一个位置(区域监控),我想用他们的状态更新服务器。 我试图从钥匙串中取出令牌,就像我为其他networking调用一样,并更新状态。 但是对于一些用户来说,价值是零。 没有它,我无法更新networking的东西。 为什么这个工作对大多数,但不是一小部分?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil]; NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
我已经回到了keychainwrapper的非ARC版本,但是我仍然得到相同的结果。 我将不胜感激这方面的任何反馈。 这只是我用户的一小部分,但这是我想解决的问题,不用担心。 提前致谢。
另外,我所有的后台工作都是在后台任务中设置的,以防止事情超时。 我对围绕钥匙链的工作没有任何问题,但是我不会让事情继续下去,直到我的令牌被填满。
编辑我已经找出了我的问题与他们的keychain不从背景中检索值。 我会在下面发表答案并接受,因为我觉得这个问题以后可能会对他人有用。
我的问题是为什么接近标准,但不完全。 博客读完博客后,在教程之后的教程,我终于find了一个可能发生的事情的暗示。
locking主屏幕。 钥匙串教程始终将钥匙串空白的可访问性设置留下,因此它将默认为Apple最低/最安全的访问级别。 但是,如果用户在locking屏幕上有密码,此级别不允许钥匙串访问。 答对了! 这解释了零星的行为,为什么这只发生在一小部分用户。
一行代码,解决了整个混乱。
[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];
添加这一行,我设置用户名和密码值。 奇迹般有效。 希望这会帮助那里的人。 它使我困惑了很长一段时间,直到我能够把这些东西放在一起。
使用kSecAttrAccessibleAfterFirstUnlock
而不是kSecAttrAccessibleAlways
。
从苹果的文档 :
kSecAttrAccessibleAfterFirstUnlock
钥匙串项目中的数据在重新启动后无法访问,直到用户解锁设备一次。第一次解锁后,数据保持可用状态,直到下一次重新启动。 build议用于需要由后台应用程序访问的项目。 使用encryption备份时,具有此属性的项目会迁移到新设备。
在我的情况下,watchOS2访问iOS端的钥匙串数据。
开始时,使用kSecAttrAccessibleWhenUnlockedThisDeviceOnly。 无论iPhone是否locking,我都可以读取数据。 当我试图访问钥匙串时,我将会收到错误,这是非常令人困惑的::SecTrustEvaluate [leaf IssuerCommonName SubjectCommonName]
有些情况下,它会变成::SecOSStatusWith error:[ – 25308]错误域= NSOSStatusErrorDomain代码= -25308“ks_crypt:e00002e2未能'oe'项目(class 6,bag:0)locking钥匙串时尝试访问项目。 “ UserInfo = {NSDescription = ks_crypt:e00002e2未能'oe'项目(class 6,bag:0)locking钥匙串时尝试访问项目}
我会更新我的答案,如果我得到更多的信息。