2015-10-19 116 views
2

我发现有时在尝试获取之前通过使用Keychain API成功存储的安全项时遇到此错误。我在设备上运行的应用程序处于后台状态并锁定屏幕时发现它。该设备还没有锁定代码集,这是我打电话的功能:访问Keychain中的安全项有时会在iOS中返回错误-25308(errSecInteractionNotAllowed)

+ (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似乎是关于类似的东西,但我不知道这是否是已被废弃,我应该怎么解决这个...提前

感谢

回答

0

我们遇到了同样的问题,@AppsDev,并且您提到的帖子是准确的。我们解决了这个问题,即使我们卸载/重新安装应用程序,也可以将钥匙串作为我们需要的东西的最后一招。

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

如果未安装,下次安装时我们会转到钥匙串(根据定义,刚安装的应用程序不在后台,因此不会失败)。通过检索数据,我们刷新了应用程序的默认值,并从那里开始使用应用程序的默认值。

相关问题