好的我在钥匙串中存有密码,我正在尝试更新钥匙串和服务器上的密码。当用户在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;
}
答案 0 :(得分:1)
kSecValueData
指定该项是某些数据,而不是对另一项(kSecValueReference)或持久性引用(kSecValuePersistentRef)的引用。这并不意味着项值作为NSData
实例存储/返回。
您输入的对象类型是您将要获取的对象类型,因此如果您输入NSString,您将获得NSString。
您需要将代码更改为始终使用NSData
实例或始终使用NSString
,根据需要进行转换。