【问题标题】:Accesing secure item in Keychain sometimes returns error -25308 (errSecInteractionNotAllowed) in iOS访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)
【发布时间】:2015-10-19 16:02:24
【问题描述】:

我发现有时在尝试获取之前使用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 中始终可以访问钥匙串项目...这个post 似乎是关于类似的东西,但我不确定它是否已被弃用以及我应该如何解决这个问题...

提前致谢

【问题讨论】:

  • 你解决过这个问题吗?

标签: ios security error-handling keychain


【解决方案1】:

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

我们现在循环回应用程序默认值(在 Swift 3 中将是 UserDefaults.standard),以便在安装生命周期未达到“卸载”阶段时保持该信息方便。

如果卸载,下次安装时我们会转到钥匙串(根据定义,刚刚安装的应用程序不在后台,因此不会失败)。检索到数据后,我们刷新应用默认值,然后我们只使用应用默认值。

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2011-04-03
    • 2015-08-16
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多