检查iOS设备首先解锁以确定使用kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly存储的项目是否可用

Pet*_*řák 8 iphone keychain ios

假设以下情况:

  1. 用户重启他/她的iPhone.
  2. 用户让设备锁定,不解锁.
  3. 服务器在设备上发送(静默)推送通知(或任何在后台唤醒应用程序的事件,例如Apple Watch扩展请求数据等).
  4. 应用程序唤醒并尝试访问存储有kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly辅助功能的Keychain项目.

现在,钥匙串项目不应该是可访问的,因为设备尚未解锁.我该如何正确检查这种情况?

注意:在我的情况下,存储在钥匙串中的项目的存在确定应用程序是否"活动",因此我需要一些东西来尽快停止此检查,否则我的应用程序将认为它不活动(值不能是阅读)并执行初始化步骤...

mar*_*oum 5

我在我的应用程序中遇到了同样的情况,这里是我如何检查钥匙串是否可用(objective-c 代码):

+ (BOOL)isKeychainAvailable {
    NSString *testVal = @"testVal";
    NSString *testKey = @"testKey";
    [JNKeychain saveValue:testVal forKey:testKey];
    NSString *validatedValue = [JNKeychain loadValueForKey:testKey];
    [JNKeychain deleteValueForKey:testKey];
    return (validatedValue == testVal);
}
Run Code Online (Sandbox Code Playgroud)

我基本上在钥匙串中保存一个值并尝试再次读取它。如果它与我刚刚写的不一样,这意味着钥匙串不可用,这也意味着手机没有通过第一次解锁,因为钥匙串应该在第一次解锁后可用,感谢选项kSecAttrAccessibleAfterFirstUnlock

如果应用程序在后台启动并且钥匙串不可用,我在这种情况下最终做的是终止应用程序:

- (void) methodStartedInBackgroundThatNeedsKeychain {
    if (!JNKeychain.isKeychainAvailable && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
        exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意力!请注意,exit(0)当应用程序处于前台模式时,Apple 强烈不鼓励使用,这就是为什么我确保只在后台使用[UIApplication sharedApplication].applicationState != UIApplicationStateActive. 这是 Apple 关于该主题的 QA 讨论:https : //developer.apple.com/library/archive/qa/qa1561/_index.html