我使用苹果的KeychainItemWrapper将密码存储在密钥链上。在某种程度上,如果我试图获取尚未安装的密码,请使用
KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
NSString *password = [keychain objectForKey:kSecValueData];密码在调试器上带有此标识返回。
password = (_NSZeroData *) class name = _NSZeroData如果我让代码继续使用这个值,它就会崩溃。
这个值不是零。如果我用if (!password)测试它会失败..。并且不是字符串空值(如果我尝试将其测试为NSString,它就会崩溃)。
在继续之前,我如何测试这个东西,看看它是否有效?
发布于 2014-04-18 16:29:08
我发现了这个问题,顺便说一句,我非常讨厌苹果公司写的那些糟糕的文件。
这就是问题所在。尽管文档建议您应该使用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];https://stackoverflow.com/questions/23151645
复制相似问题