从通知小组件中查找设备是否已锁定

时间:2015-01-13 23:52:52

标签: ios objective-c ios8-today-widget today-extension

我想知道在我加载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 ...但我仍然可以阅读它:(

更新:发现它。将伊恩的答案标记为正确

3 个答案:

答案 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秒后,文件似乎被锁定。

知道这一点,你可以从扩展中创建文件,它似乎可以工作。