相关疑难解决方法(0)

iOS KeyChain不从后台检索值

我目前正在iOS KeyChain中存储用户名(电子邮件)和电子邮件和密码的盐渍哈希.我正在使用这里发现的ARC'ified版本.

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];
Run Code Online (Sandbox Code Playgroud)

当我需要在应用程序处于活动状态时拉出令牌以进行网络呼叫时,这一切都正常.它适用于从干净的启动登录,以及整个网络调用.当应用程序在后台时,问题就开始了.

请记住,这只是零星发生,我还没有把它固定到特定的iOS版本或设备上.

用户绊倒一个位置(区域监控),我想用他们的状态更新服务器.我尝试将令牌从钥匙串中取出,就像我为每个其他网络呼叫所做的那样,并更新状态.但对于一些用户来说,价值是零.没有它,我无法更新网络内容.为什么这对大多数人有效,但对于一小部分人来说不是这样?

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
Run Code Online (Sandbox Code Playgroud)

我已经回到了keychainwrapper的非ARC版本,但我仍然得到了相同的结果.我将不胜感激任何反馈.它只是我用户的一小部分,但这是一个我想解决的问题而不用担心.提前致谢.

此外,我的所有后台工作都在backgroundTask中设置,以防止事情超时.我对钥匙链的工作没有任何问题,但在令牌填满之前我不会让事情继续下去.

编辑 我发现我的问题是他们的钥匙串没有从后台检索值.我将在下面发布答案并接受它,因为我觉得这个问题可能会在以后对其他人有价值.

iphone background keychain lockscreen ios

81
推荐指数
2
解决办法
2万
查看次数

Keychain:项目报告为errSecItemNotFound,但在添加时收到errSecDuplicateItem

这个问题一直困扰着我,我希望有人能够深入了解这一问题.从本质上讲,我有一小部分用户无法将项目保存/更新到钥匙串.有问题的控制流程如下:

  1. 我们使用检查项目是否存在SecItemCopyMatching.这将返回错误代码errSecItemNotFound

  2. 然后我们尝试添加项目SecItemAdd,但然后返回errSecDuplicateItem.

因此,我们有一些用户无法更新钥匙串项的子集,要求他们恢复设备以清除钥匙串.这显然是一种不可接受的解决方法.它似乎以前对它们起作用,但现在已进入这个不可更新的循环.

经过研究,我发现有关搜索查询的问题SecItemCopyMatching不够具体,但我的代码尽可能使用常见的搜索查询.

+ (NSMutableDictionary*)queryForUser:(NSString*)user key:(NSString*)key
{
    if (!key || !user) { return nil; }

    NSString* bundleId = [[NSBundle mainBundle] bundleIdentifier];
    NSString* prefixedKey = [NSString stringWithFormat:@"%@.%@", bundleId, key];

    NSMutableDictionary* query = [NSMutableDictionary dictionary];
    [query addEntriesFromDictionary:@{(__bridge id)kSecClass          : (__bridge id)kSecClassGenericPassword}];
    [query addEntriesFromDictionary:@{(__bridge id)kSecAttrAccount    : user}];
    [query addEntriesFromDictionary:@{(__bridge id)kSecAttrService    : prefixedKey}];
    [query addEntriesFromDictionary:@{(__bridge id)kSecAttrLabel      : prefixedKey}];
    [query addEntriesFromDictionary:@{(__bridge id)kSecAttrAccessible : (__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly}];

    return query;
}
Run Code Online (Sandbox Code Playgroud)

进行更新/添加的代码如下(对于详细程度而言):

// Setup the …
Run Code Online (Sandbox Code Playgroud)

security keychain password-protection ios

31
推荐指数
1
解决办法
8015
查看次数