gpt4 book ai didi

ios - KeychainItemWrapper 返回 NSZeroData?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:22 26 4
gpt4 key购买 nike

我使用 Apple 的 KeychainItemWrapper 将密码存储在钥匙串(keychain)上。在某些时候,如果我尝试使用

获取尚未设置的密码
  KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
NSString *password = [keychain objectForKey:kSecValueData];

在调试器上返回带有此标识的密码

password = (_NSZeroData *) class name = _NSZeroData

如果我让代码继续运行并尝试使用这个值,它将崩溃。

这个值不是零。如果我使用 if (!password) 进行测试,它将失败...并且不是字符串空值(如果我尝试将其作为 NSString 进行测试,它将崩溃)。

在继续之前我该如何测试它是否有效?

最佳答案

我发现了这个问题,顺便说一下,我非常讨厌 Apple 编写的关于所有内容的蹩脚文档。

这就是问题所在。尽管文档建议您应该使用 kSecValueData 将密码存储为普通字符串:

  NSString *myPassword = @"12345";
KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
[keychain setObject:myPassword forKey:(__bridge id)kSecValueData];

你永远不应该那样做。事实上,kSecValueData,顾名思义,文档应该说,需要一个 NSData 对象。因此,您必须在存储之前将 NSString 转换为 NSData,如下所示:

  NSString *myPassword = @"12345";
KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
NSData *myPasswordData = [myPassword dataUsingEncoding:NSUTF8StringEncoding];
[keychain setObject:myPasswordData forKey:(__bridge id)kSecValueData];

当取回它时,你必须将它转换为 NSData 并将其转换回 NSString:

  NSData *myPasswordData = (NSData *)[keychain objectForKey:(__bridge id)kSecValueData];

NSString *myPassword = [[NSString alloc] initWithData: myPasswordData
encoding:NSUTF8StringEncoding];

关于ios - KeychainItemWrapper 返回 NSZeroData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23151645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com