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

当应用程序已启用数据保护时,在ios中写入nsuser默认值时出错,ios,objective-c,iphone,Ios,Objective C,Iphone,我有一个ios SDK,它在后台模式下运行时同步用户默认值。问题是,应用程序使用SDK时启用了数据保护,每当应用程序进入后台,我们的SDK都会继续扫描信标区域 每当设备进入信标区域时,我会从服务器获取附加到该信标的通知,并将其显示为本地警报通知,同时我会尝试将一些数据同步到用户默认值,如果设备在该点被密码锁定,ios会引发崩溃: ****:cf首选项:创建文件/private/var/mobile/Containers/Data/Application/079820BD-EBFC-4C49-9C

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

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

****:cf首选项:创建文件/private/var/mobile/Containers/Data/Application/079820BD-EBFC-4C49-9C39-9A893A27358E/Library/Preferences/domainName.plist.gn1cmrC时出错: 1:任务设置异常端口SB07、400、D03、0、0失败,错误为 错误4:os/kern参数无效****

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


请注意,如果未使用密码锁定设备,则不会出现错误。当应用程序进入监控区域、唤醒并处于后台模式时,通过重置文件权限,找到了解决此问题的方法。当location manager触发该区域的退出事件时,然后将权限放回。执行此操作的代码

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

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];

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