0

我在我的应用程序中使用 keychain 和 keychainitemwrapper。所以,我确实更新了 'kSecAttrAccessible' 使用 setObject:(id) 方法。
但是会出现错误。像这样,

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法更新钥匙串项。”

这是我的来源

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserData" accessGroup:@"49YVVGB32W.com.covimdm.daelim.pushData"];
NSString *PushData = [NSString stringWithFormat:@"%@::%@::%@", sLoginId, [[[PushManager defaultManager] info] pushServiceID], [[[PushManager defaultManager] info] host]];
[wrapper setObject:PushData forKey:(id)kSecValueData];
[wrapper setObject:(id)kSecAttrAccessibleAfterFirstUnlock forKey:(id)kSecAttrAccessible];

发生错误的部分是第四行代码。

[wrapper setObject:(id)kSecAttrAccessibleAfterFirstUnlock forKey:(id)kSecAttrAccessible];

我不知道为什么错误会一次又一次地发生。

4

1 回答 1

0

编辑

好的,让我们再试一次。您使用的包装器库似乎专门针对单个对象,因此当您添加钥匙串属性时它似乎会崩溃。但是,如果你先这样做,它似乎会起作用。因此,首先加载配置,然后加载项目数据,如下所示,它应该可以工作。

    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserData"
                                       accessGroup:@"49YVVGB32W.com.covimdm.daelim.pushData"];

    NSString * pushString = @"Some string";
    NSData   * pushData   = [pushString dataUsingEncoding:NSUTF8StringEncoding];

    [wrapper setObject:kSecAttrAccessibleAfterFirstUnlock
            forKey:kSecAttrAccessible]; // Do configuration first
    [wrapper setObject:pushString // Must be string!?
            forKey:kSecValueData];

上面的代码在这方面工作,尽管KeychainItemWrapper这里开始。从源代码看来,每次设置对象时都会写入该项目,因此我认为您首先需要配置。

此外,如果我按照我之前的建议存储数据,它也不起作用。看来您必须存储字符串。上面的代码在这方面工作得很好,希望它对你也一样。

于 2020-11-02T07:25:57.393 回答