最佳答案
我目前存储的用户名(电子邮件)和电子邮件和密码在 iOS 钥匙链盐散列。我正在使用发现的 给你的 ARC 化版本。
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 版本或设备。
用户跳过一个位置(区域监视) ,我想更新他们的状态服务器。我尝试从密钥链中取出令牌,就像我对其他网络调用所做的那样,并更新状态。但对于一些用户来说,它的价值为零。没有它,我没法更新网络。为什么这对大多数人有效,但对一小部分人不行呢?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
我回到了 keychainwrapper 的非 ARC 版本,但仍然得到相同的结果。如果有任何反馈,我将不胜感激。这只是我的用户的一小部分,但这是一个问题,我想修复,而不是担心。先谢谢你。
另外,我所有的后台工作都设置在 backoundTask 中,以防止超时。我对钥匙链的工作没有任何问题,但是在我的令牌被填满之前,我不会让事情向前发展。
剪辑 我已经解决了我的问题,他们的钥匙链不检索值从背景。我将在下面发布答案,并接受它,因为我觉得这个问题可能会变得对其他人有价值。