当应用程序启用数据保护时,在 ios 中写入 nsuser 默认值时出现 CfPrefrences 错误

Posted

技术标签:

【中文标题】当应用程序启用数据保护时,在 ios 中写入 nsuser 默认值时出现 CfPrefrences 错误【英文标题】:CfPrefrences error while writing to nsuser defaults in ios when app have data protection enabled 【发布时间】:2014-12-12 14:54:26 【问题描述】:

我有一个 ios SDK,它在后台模式下运行时同步用户默认值。问题是应用程序正在使用 SDK 并启用数据保护,并且每当应用程序进入后台时,我们的 SDK 都会继续扫描信标区域。

每当设备进入信标区域时,我都会从服务器获取附加到该信标的通知并将其显示为本地警报通知,同时我会尝试将一些数据同步到用户默认设置,如果设备被锁定那时ios的密码正在引发崩溃:

****:CFPreferences:创建文件/private/var/mobile/Containers/Data/Application/079820BD-EBFC-4C49-9C39-9A893A27358E/Library/Preferences/domainName.plist.gn1cmrC 时出错: 1 : task_set_exception_ports(B07, 400, D03, 0, 0) 失败 错误(4:(os/kern)无效参数)****

通过使用 nsuser 默认值作为存储方法来解决此错误的任何帮助都将非常有帮助。如果没有办法,请建议在App上启用数据保护并且设备被密码锁定时可用的数据存储。

请注意,设备未使用密码锁定时不会出现错误

【问题讨论】:

我怀疑您使用NSUserDefaults 作为通用数据结构在应用程序的不同部分之间共享数据。这是真的还是假的? 是的,我在我的 SDK 中使用应用程序用户默认值只是为了存储一些字符串和数组,并且在没有数据保护并且启用数据保护并且设备没有密码锁定的应用程序中一切正常。我今天刚刚在 SDK 中发现了这个错误,并拼命寻找解决方法。该应用程序是第三方,他们也必须使用我不知道的用户默认值 NSUserDefaults 并非为此目的而设计的,并且有更好的方法可以在全球范围内共享数据。如果问题出在第三方代码中,那么您应该向他们提交错误报告。 嗯,但我认为错误存在于 SDK 中,因为应用程序本身在后台没有做任何事情。当应用启用数据保护并使用密码锁定设备时,可以访问哪些数据存储?奇怪的是,即使在崩溃期间和之后,对 nsuser 默认值的写入和读取也是成功的。我尝试更新的字符串在用户默认值中得到更新。 数据保护 启用是不够的。完成,除非打开或直到第一个用户身份验证? d.pr/i/1bmr3 默认情况下是完整的,设备锁定时无法访问数据,...这不是你的问题吗?您可以在开发人员门户中更改它,在您创建 AppID 的地方。如果是这种情况,只需编辑 AppID 并更改保护级别。 【参考方案1】:

刚刚通过在应用程序进入监控区域、唤醒并处于后台模式以及位置管理器触发该区域的退出事件然后将权限放回时重置文件权限找到了解决此问题的方法。执行此操作的代码..

当设备被密码锁定时,应用进入区域降低文件权限写入内容

NSFileManager* currnetPath=[[NSFileManager alloc]init];
    NSArray *directories = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *documents = [directories firstObject];
    NSString* prefPath = [documents stringByAppendingPathComponent:@"Preferences"];
    NSDictionary *setNewDict = @ NSFileProtectionKey: NSFileProtectionNone ;
    [currnetPath setAttributes:setNewDict ofItemAtPath:prefPath error:nil];

当应用退出该区域时启用最高数据保护模式

NSFileManager* currnetPath=[[NSFileManager alloc]init];
    NSArray *directories = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *documents = [directories firstObject];
    NSString* prefPath = [documents stringByAppendingPathComponent:@"Preferences"];
    NSDictionary *setNewDict = @ NSFileProtectionKey: NSFileProtectionComplete ;
    [currnetPath setAttributes:setNewDict ofItemAtPath:prefPath error:nil];
    NSDictionary *newDict=[currnetPath attributesOfItemAtPath:prefPath error:nil];

【讨论】:

显然这会关闭对敏感数据的保护。

以上是关于当应用程序启用数据保护时,在 ios 中写入 nsuser 默认值时出现 CfPrefrences 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何为使用 Xamarin 构建的 iOS 应用启用堆栈粉碎保护?

当调试关闭时,启用 Django 语言环境的应用程序总是返回 404

iOS 数据保护不适用于已安装的应用程序

iOS 沙盒 - 保护 Documents 目录中的数据

允许其他受保护的附加在 Azure 流分析中不起作用?

当用户在系统设置 -> 显示和亮度上启用“粗体文本”时,iOS 应用程序在启动画面处冻结