我目前在iOS KeyChain中存储用户名(电子邮件)以及电子邮件和密码的盐化哈希。我使用的是这里找到的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];
当我需要在应用程序处于活动状态时为网络调用提取令牌时,一切都很好。它适用于从干净启动启动的登录以及整个网络中的所有网络调用。当应用程序在后台运行时,麻烦就开始了。
请记住,这只是偶尔发生,我还没有将其固定到特定的iOS版本或设备。
用户跳到一个位置(区域监视),我想用其状态更新服务器。我尝试将令牌从钥匙串中拔出,就像我对其他每个网络呼叫所做的一样,并更新状态。但是对于某些用户,该值为nil。没有它,我将无法更新网络内容。为什么这对大多数人有用,但对少数人却无效?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
我回到了非ARC版本的keychainwrapper,但是我仍然得到相同的结果。我对此表示感谢。这只是我用户的一小部分,但这是我要解决的问题,不用担心。提前致谢。
另外,我所有的后台工作都在backgroundTask中进行设置,以防止事情超时。我在钥匙串周围的工作上没有任何问题,但是在我的令牌填满之前,我不会让事情继续进行。
编辑 我发现我的问题是他们的钥匙串没有从后台获取值。我将在下面发布答案并接受它,因为我觉得这个问题以后可能对其他人有价值。