我想知道在我加载Notification / Today小部件时设备是否已锁定,因此我可以正确显示小部件。 (它的财务状况,我们不想在锁定的手机上显示余额)
在使用TouchID的设备上,我可以尝试访问Keychain,如果我得到
errSecInteractionNotAllowed
回来了,它被锁定了。都好。 这不适用于没有touchID的设备(但使用PIN)。我找到了一些建议使用
的东西 [[UIApplication sharedApplication] protectedDataAvailable]
但我在小部件中没有[UIApplication sharedApplication]
。
任何想法在哪里以及如何做到这一点?我只需要一个是/否:设备已被锁定。
由于
[更新:这里是我的代码]
获取文件名:
+ (NSString *)lockedDeviceFilename {
NSURL *directoryUrl = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:USER_DEFAULTS_GROUP_NAME];
return [directoryUrl.path stringByAppendingPathComponent:@"security.dummy"];
}
编写/创建文件(在应用程序中,而不是扩展名:
NSError *error = nil;
NSString *documentPath = [FOOStorageGatekeeper lockedDeviceFilename];
[[NSFileManager defaultManager] removeItemAtPath:documentPath error:&error];
BOOL created = [[NSFileManager defaultManager] createFileAtPath:documentPath
contents:[@"super secret file contents. we only care about the permissions" dataUsingEncoding:NSUTF8StringEncoding]
attributes:@{NSFileProtectionKey : NSFileProtectionComplete}];
读:
BOOL isReadable = [[NSFileManager defaultManager] fileExistsAtPath:[FOOStorageGatekeeper lockedDeviceFilename]];
NSLog(@"isReadable? %@", isReadable ? @"YES" : @"NO");
即使在屏幕锁定的TouchID设备上,它始终能够读取文件。如果我查看属性,它会显示NSFileProtectionKey设置为NSFileProtectionComplete ...但我仍然可以阅读它:(
更新:发现它。将伊恩的答案标记为正确
答案 0 :(得分:8)
在您的应用运行时,使用NSFileProtectionComplete
创建一个文件,然后尝试从您的扩展程序访问该文件。如果您无法访问它,屏幕将被锁定。
[[NSFileManager defaultManager] createFileAtPath:someFilePath
contents:[@"Lock screen test." dataUsingEncoding:NSUTF8StringEncoding]
attributes:@{NSFileProtectionKey: NSFileProtectionComplete}];
编辑:包含最终步骤以完成解决方案并合并答案。 (Nic Wise提供的剩余工作。)
NSData *data = [NSData dataWithContentsOfURL:[FOOStorageGatekeeper lockedDeviceUrl] options: NSDataReadingMappedIfSafe error:&error];
if (error != nil && error.code == 257) {
NSLog(@"**** the keychain appears to be locked, using the file method");
return YES;
}
使用errSecInteractionNotAllowed
的另一种方法也有效,但仅适用于TouchID设备。
我找到答案(间接)here(最有可能需要使用iOS开发程序)
答案 1 :(得分:2)
最后,经过3-4天的寻找,找到了答案。更多的是我如何阅读结果。 Ian是对的:我需要使用createFileAtPath创建文件,然后使用
将其读回NSData *data = [NSData dataWithContentsOfURL:[FOOStorageGatekeeper lockedDeviceUrl] options: NSDataReadingMappedIfSafe error:&error];
if (error != nil && error.code == 257) {
NSLog(@"**** the keychain appears to be locked, using the file method");
return YES;
}
使用errSecInteractionNotAllowed
的另一种方法也有效,但仅适用于TouchID设备。
我找到答案(间接)here(最有可能需要使用iOS开发程序)
答案 2 :(得分:1)
我试过了,我的文件总是可读的(无论是否在锁定屏幕上)。
我找到了这个文件: https://www.apple.com/business/docs/iOS_Security_Guide.pdf
在设备锁定10秒后,文件似乎被锁定。
知道这一点,你可以从扩展中创建文件,它似乎可以工作。