我目前将用户名(邮箱)以及邮箱和密码的加盐哈希存储在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

推荐答案

我的问题很切中要害,原因是什么,但不完全是.在看了一篇又一篇博客,一篇又一篇教程之后,我终于找到了一个暗示可能会发生什么的博客.

锁定主屏幕.密钥链教程总是将密钥链的可访问性设置留空,因此默认设置为苹果最低/最安全的访问级别.但是,如果用户在锁屏上有密码,则此级别不允许访问 keys 链.对啰!这解释了零星的行为,以及为什么这种情况只发生在一小部分用户身上.

只需一行代码,就可以解决整个问题.

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

添加此行,我将在其中设置用户名和密码值.效果就像一种护身符.希望这能帮助外面的人.这让我困惑了很长一段时间,直到我能够把这些碎片拼凑起来.

Ios相关问答推荐

如何使用UICollectionView Compositionallayout在UIKit中正确渲染远程图像

有没有办法观察滚动的SwiftUI图表的内容偏移量?

底部导航栏在iOS上浮动

SwiftUI绑定到特定的一个或多个枚举 case

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

在flatter_riverpod中,如果没有ref对象,我们如何访问提供程序?

SwiftUI - 搜索栏和导航标题之间的空间太大

在我的 M1 上出现 Architecture arm64 问题,因此我无法运行我的旧项目

UIView 倒置旋转时的zoom 问题

iOS SwiftUI - 使用 PhotosPicker 从图库中 Select 图像或视频

如何仅更改一个视图的导航标题 colored颜色 ?

.onAppear() 函数不适用于 NavigationLink

从视图模型中更新 EnvironmentObject

在 SwiftUI 中将 TextEditor 文本计数连接到 ProgressView

滑动以返回特定的 SwiftUI 视图

向左或向右移动时如何水平翻转sprite?

通过touch 传递到下面的 UIViews

无法将NSTaggedPointerString类型的值转换为NSNumber

如果已安装,则重定向到应用程序,否则重定向到 App Store

如何在 Swift 中将新单元格插入 UITableView