SecAddItem只返回errSec Param,我做的事情无关紧要

时间:2014-06-11 02:08:31

标签: ios ios7 keychain security-framework

出于某种原因,我无法使用这个简单的钥匙串代码。

//Let's create an empty mutable dictionary:
NSMutableDictionary *keychainItem = [NSMutableDictionary dictionary];

NSString *username = self.nwUsernameTxtFld.text;
NSString *password = self.passwordTxtFld.text;

//Populate it with the data and the attributes we want to use.

keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassInternetPassword; // We specify what kind of keychain item this is.
keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleWhenUnlocked; // This item can only be accessed when the user unlocks the device.
keychainItem[(__bridge id)kSecAttrServer] = @"http://www.myawesomeservice.com";
keychainItem[(__bridge id)kSecAttrAccount] = username; //Our username.

if(SecItemCopyMatching((__bridge CFDictionaryRef)keychainItem, NULL) == noErr)
{

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"The Item Already Exists", nil)
                                                    message:NSLocalizedString(@"Please update it instead.", )
                                                   delegate:nil
                                          cancelButtonTitle:NSLocalizedString(@"OK", nil)
                                          otherButtonTitles:nil];
    [alert show];

}else
{
    NSLog(@"can add new item.");
    keychainItem[(__bridge id)kSecValueData] = password; //Our password

    OSStatus sts = SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
    NSLog(@"%d", (int)sts);
}

我已经检查了Apple关于此事的文件,并根据它:

  

传递给函数的一个或多个参数无效。

然而,SecAddItem函数需要两个参数:

OSStatus SecItemAdd (
   CFDictionaryRef attributes,
   CFTypeRef *result
);

我将NULL传递给结果。根据Apple的文档,这是可以接受的:

  

结果返回时,对新添加的项目的引用。确切的类型   结果的基础是属性中提供的值,如   讨论如下。如果不需要此结果,则传递NULL。

所以我真的不知道我在这里做错了什么。我传给它一个字典和一个NULL值。该功能期望两者兼而有之。有人可以告诉我什么是错的吗?

供参考,文档为here

2 个答案:

答案 0 :(得分:3)

您正在将不正确的数据类型插入到密钥kSecValueData的字典中。如问题底部的文档所示,它必须是CFDataRef(或桥接NSData),但您要插入NSString。将NSString转换为NSData是一件微不足道的事情,一旦这样做,您就会停止此错误。

答案 1 :(得分:1)

我因设置错误的kSecClass而遇到此错误。我曾使用过kSecClassInternetPassword而不是kSecClassGenericPassword。 希望这有帮助