在iOS中访问Keychain中的安全项目有时会返回错误-25308 (errsecinteractionnotalal



我发现,当试图获得我以前通过使用Keychain API成功存储的安全项目时,有时我会得到该错误。当我的设备上运行的应用程序处于后台状态时,我锁定了屏幕。设备没有锁码设置,这是我调用的函数:

+ (NSString *)findValueForKey:(NSString *)keyStr
{
   NSString *valueStr = @"";
   if ((keyStr != nil) && (![keyStr isEqualToString:@""])) {
       NSString *service = [[NSBundle mainBundle] bundleIdentifier];
       NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                            (__bridge id)kSecAttrService : service,
                            (__bridge id)kSecAttrAccount : keyStr,
                            (__bridge id)kSecReturnData : (__bridge id)kCFBooleanTrue};
       CFDataRef cfValue = NULL;
       OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&cfValue);
       if ([self checkIfNoError:results]) {
           valueStr = [[NSString alloc] initWithData:(__bridge_transfer NSData *)cfValue encoding:NSUTF8StringEncoding];
       }
       else {
          NSLog(@"%@", [self getErrorMessageForStatus:results]);
       }
   }
   return valueStr;
}

和项通过调用以下方法存储:

+ (BOOL)storeInKeychainWithKey:(NSString *)keyStr withValueStr:(NSString *)valueStr
{
   if ((keyStr != nil) && (![keyStr isEqualToString:@""]) &&
       (valueStr != nil) && (![valueStr isEqualToString:@""])) {
       NSData *valueData = [valueStr dataUsingEncoding:NSUTF8StringEncoding];
       NSString *service = [[NSBundle mainBundle] bundleIdentifier];
       NSDictionary *secItem = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                              (__bridge id)kSecAttrService : service,
                              (__bridge id)kSecAttrAccount : keyStr,
                              (__bridge id)kSecValueData : valueData};
       CFTypeRef result = NULL;
       OSStatus status = SecItemAdd((__bridge CFDictionaryRef)secItem, &result);
       NSLog(@"%@", [self getErrorMessageForStatus:status]);
      return [self checkIfItem:status];
   }
   else {
      return NO;
   }
}

我认为在iOS中总是可以访问钥匙链项目…这篇文章似乎是关于类似的东西,但我不确定它是否被弃用,我应该如何解决这个问题…

Thanks in advance

我们也有同样的问题,@AppsDev,你提到的帖子是准确的。我们通过保留钥匙链作为最后的手段来解决这个问题,即使我们卸载/重新安装应用程序。

我们现在循环应用程序的默认值(在Swift 3中应该是UserDefaults.standard),以便在安装生命周期还没有到"uninstalled"阶段时方便地获取这些信息。

如果卸载,下次安装时我们进入钥匙链(根据定义,刚安装的应用程序不在后台,所以它不会失败)。有了检索到的数据,我们刷新应用程序的默认值,从那里,我们只使用应用程序的默认值。

最新更新