我目前将用户名(邮箱)以及邮箱和密码的加盐哈希存储在iOS密钥链中.我用的是找到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版本或设备.
用户触发了一个位置(区域监控),我想用他们的状态更新服务器.我try 将令牌从密钥链中取出,就像我对所有其他网络调用所做的那样,并更新状态.但对于一些用户来说,它的价值是零.没有它,我就不能更新网络资料.为什么这会对大多数人有效,而不是对一小部分人有效?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
我已经返回到keychainwrapper的非ARC版本,但是我仍然得到相同的结果.如果有任何关于这方面的反馈,我将不胜感激.这只是我的用户中的一小部分,但这是一个我想解决的问题,而不是担心.提前谢谢您.
另外,我所有的后台工作都是在后台任务中设置的,以防止程序超时.我对围绕 keys 链的工作没有任何问题,但是在我的令牌填满之前,我不会让事情继续进行.
EDIT