gpt4 book ai didi

ios - 在后台获取中运行时,来自 NSData 的 NSString 崩溃

转载 作者:行者123 更新时间:2023-11-29 12:51:30 25 4
gpt4 key购买 nike

我有这个方法来检查我们是否在钥匙串(keychain)中存储了用户名和密码:

- (BOOL)hasLoginDetails
{
FLog
NSString *username = [self.keychainItem objectForKey:(__bridge id)kSecAttrAccount];
if (username == nil || [username isEqualToString:@""])
return NO;

NSData *passData = [self.keychainItem objectForKey:(__bridge id)kSecValueData];
if (passData == nil || [passData length] == 0)
return NO;

NSString *password = [[NSString alloc] initWithData:passData encoding:NSUTF8StringEncoding];
if (password == nil || [password isEqualToString:@""])
return NO;

return YES;
}

密码以 NSData 形式返回,因此需要转换为字符串。这在正常使用中工作得很好,但是当它在后台 application:performFetchWithCompletionHandler: 方法中使用时,我有时会崩溃指向这一行:

NSString *password = [[NSString alloc] initWithData:passData encoding:NSUTF8StringEncoding];

崩溃日志提示

-[__NSCFString bytes]: unrecognized selector sent to instance 0x156104a0

我只在分发 AdHoc 构建后才看到这些崩溃。我假设崩溃日志说 passData 变量此时实际上是一个字符串?知道这里发生了什么吗?

谢谢

编辑----

只需使用 [self.keychainItem setObject:password forKey:(__bridge id)kSecValueData]; 即可将密码添加到钥匙串(keychain)中 password 是一个 NSString。我正在使用来自 here 的 KeychainItemWrapper它将密码 NSString 转换为 NSData 但不会再次将其转换回来,这就是我这样做的原因。

编辑2 ----

调试崩溃后,我检查了 passData 变量,实际上 NSString 应该是 NSData,所以有时我得到 NSData 并且时不时地得到 NSString。

最佳答案

根据您为钥匙串(keychain)项设置的数据保护选项,当手机被锁定时,钥匙串(keychain)无法访问,因此您会得到一些意想不到的值,从而导致崩溃。

这实际上是一个非常受欢迎的问题,足以让 Apple 在他们的技术谈话视频中专门解决它。

您能否粘贴处理设置钥匙串(keychain)项的代码?

也看看这些:

iOS KeyChain not retrieving values from background

iOS Keychain occasionally return empty string

Apple Tech Talk Video

关于ios - 在后台获取中运行时,来自 NSData 的 NSString 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332585/

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