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

时间:2016-11-15 16:06:46

标签: ios iphone keychain

假设以下情况:

  1. 用户重启他/她的iPhone。
  2. 用户让设备锁定,确实如此 没解开它。
  3. 服务器发送(静默)推送通知 设备(或任何会使应用程序唤醒的设备 背景,例如Apple Watch扩展请求数据等。)。
  4. 应用程序唤醒并尝试访问使用kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly辅助功能存储的Keychain项目。
  5. 现在,钥匙串项目不应该可访问,因为设备尚未解锁。我如何正确检查这种情况?

    注意:在我的情况下,存在于钥匙串中的项目的存在决定了应用程序是否处于“活动”状态,因此我需要一些东西来尽快停止此检查,否则我的应用程序将认为它不活动(值无法读取)并执行初始化步骤...

1 个答案:

答案 0 :(得分:2)

我在应用中遇到了相同的情况,这就是我检查钥匙串是否可用的方法(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);
}

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

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

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

注意!,请注意,当应用程序处于前台模式时,Apple强烈不建议使用exit(0),这就是为什么我确保仅在后台调用它的原因。这是苹果公司对此主题的质量检查讨论:https://developer.apple.com/library/archive/qa/qa1561/_index.html