【发布时间】: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