【问题标题】:NSInternalInconsistencyException when keychain item update钥匙串项目更新时的NSInternalInconsistencyException
【发布时间】:2020-10-29 09:02:03
【问题描述】:

我在我的应用程序中使用 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];

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

【问题讨论】:

  • 设置时需要将字符串转成数据。

标签: ios objective-c keychain keychainitemwrapper


【解决方案1】:

编辑

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

    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];

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

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

【讨论】:

  • 感谢您的回答。但是我的问题发生在将 kSecAttrAccessible 值更改为 kSecAttrAccessibleAfterFirstUnlock 时。我今天一直在研究这个问题。并且 OSStatus 返回 -50 错误代码。这个问题能解答吗?
  • 对不起,我误会了你——看着这个,绕了一圈……稍后会更新
  • 哦...我刚才查看了您的评论。我会等你的回答;)
  • 我快速查看了它-我认为您无论如何都需要按照我的建议去做,因为您需要kSecValueData 键的数据...其余的看起来不错,所以我认为不是这样.此外,-50 代码意味着存储时某些内容是非法的,这就是我这么说的原因。
  • 嗯,好吧,我会按照你的建议去做。
猜你喜欢
  • 1970-01-01
  • 2012-06-21
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多