假设以下情况:
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
辅助功能存储的Keychain项目。现在,钥匙串项目不应该可访问,因为设备尚未解锁。我如何正确检查这种情况?
注意:在我的情况下,存在于钥匙串中的项目的存在决定了应用程序是否处于“活动”状态,因此我需要一些东西来尽快停止此检查,否则我的应用程序将认为它不活动(值无法读取)并执行初始化步骤...
答案 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