【问题标题】:NSData not returning bytesNSData 不返回字节
【发布时间】:2014-08-18 20:29:15
【问题描述】:

好的,我在钥匙串中存储了一个密码,我正在尝试更新钥匙串和我的服务器上的密码。当用户在 UIAlertView 中输入新密码时,密码会在钥匙串中更新,依此类推。我遇到的问题是,当您取消或尝试再次执行此操作时,从钥匙串检索的值被重新调整为字符串而不是字节。

我使用钥匙串包装器像这样在钥匙串中设置新密码

[keychainItem setObject:newPassword forKey:(__bridge id)(kSecValueData)];

我第一次完成该过程时它工作正常,但如果我尝试再次更改它并完成该过程,我会得到

-[__NSCFString bytes]: unrecognized selector sent to instance 

当它在这个方法中崩溃时 NSString *keychainPassword = [[NSString alloc] initWithData:pass encoding:NSUTF8StringEncoding]; 叫做。在 NSLog 调用中,它正在重新调整密码字符串而不是字节,为什么?

-(BOOL)checkIfOldPasswordMatches {
NSLog(@"checkIfPasswordMatches");

 //gets password from keychain
NSData *pass = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
if (pass == nil || [pass length] == 0) {
    [UIAlertView error:@"Username and Password does not exist. You must create a login."];
}

 //shows output of password which should return bytes
NSLog(@"pass %@", pass);
NSString *keychainPassword = [[NSString alloc] initWithData:pass encoding:NSUTF8StringEncoding];

NSLog(@"keychain %@", keychainPassword);
if ([oldPassword isEqualToString:keychainPassword]) {
    NSLog(@"yes");
    return YES;
} else
    NSLog(@"no");
return NO;

}

【问题讨论】:

  • NSString 上没有名为bytes 的方法。
  • (准确地说,错误发生在哪里??)
  • (你的问题是pass是一个NSString,而不是NSData。)
  • 是的,这就是问题所在。我很困惑为什么第一次通过密码被重新调整为 NSData 但是当我再次通过新密码返回为 NSString 时。
  • 可能是因为你在中间的某个地方改变了它。

标签: ios objective-c xcode5 nsdata


【解决方案1】:

kSecValueData 指定项目是一些数据,而不是对另一个项目的引用 (kSecValueReference) 或持久引用 (kSecValuePersistentRef)。这并不意味着项目值作为NSData 实例存储/返回。

你放入的对象的类型就是你要取出的对象的类型,所以如果你放入一个 NSString 你会得到一个 NSString。

您需要将代码更改为始终使用NSData实例或始终使用NSString,根据需要进行转换。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多