首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在模拟器中使用SecItemUpdate时出现错误-50

在模拟器中使用SecItemUpdate时出现错误-50
EN

Stack Overflow用户
提问于 2015-01-04 21:33:44
回答 1查看 696关注 0票数 1

有人能告诉我米斯塔克在哪里吗?我现在不知道。

//获取查询Dic

代码语言:javascript
运行
复制
+ (NSMutableDictionary *)keychainQueryDictionary:(NSString *)service
{
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass,
            service, (__bridge id)kSecAttrService,
            service, (__bridge id)kSecAttrAccount,
            (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible,
            nil];
}

//这里我保存了一些数据到keychain

代码语言:javascript
运行
复制
+ (OSStatus)saveData:(id)data service:(NSString *)serviceIdentify
{
    NSMutableDictionary *keychainQuery = [self keychainQueryDictionary:serviceIdentify];

    SecItemDelete((__bridge CFDictionaryRef)keychainQuery);

    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData];

    return SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL);
}

//删除操作

代码语言:javascript
运行
复制
+ (OSStatus)deleteData:(NSString *)serviceIdentify
{
    NSMutableDictionary *keychainQuery = [self keychainQueryDictionary:serviceIdentify];
    return SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
}

//在这里我尝试在keychian中更新一项,但是我得到一个错误-50,但是我不知道哪里是错误的参数

代码语言:javascript
运行
复制
+ (OSStatus)updataData:(id)data service:(NSString *)serviceIdentify
{
    NSMutableDictionary *keychainQuery = [self keychainQueryDictionary:serviceIdentify];
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];

    CFDataRef keyData = NULL;
    OSStatus status = errSecNotAvailable;
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        NSMutableDictionary *queryDict = nil;
        NSDictionary *ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        queryDict = [NSMutableDictionary dictionaryWithDictionary:ret];
        [queryDict setObject:[keychainQuery objectForKey:(__bridge id)kSecClass] forKey:(__bridge id)kSecClass];

        NSMutableDictionary *attributesToUpdate = [self keychainQueryDictionary:serviceIdentify];
        [attributesToUpdate setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData];

        status = SecItemUpdate((__bridge CFDictionaryRef)queryDict,(__bridge CFDictionaryRef)attributesToUpdate);
    }

    return status;
}

//读取操作

代码语言:javascript
运行
复制
+ (id)loadData:(NSString *)serviceIdentify
{
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self keychainQueryDictionary:serviceIdentify];
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr)   {
        ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
    }
    return ret;
}
EN

回答 1

Stack Overflow用户

发布于 2016-02-06 03:11:48

-50是errSecParam。我认为你已经颠倒了SecItemUpdate的参数。第一个参数是搜索查询,用于查找需要更新的匹配项。这可能应该通过调用您的keychainQueryDictionary方法来创建。第二个参数应该包含更改-在您的示例中,这是您正在做的kSecValueData的新数据,但是字典通常不包括任何搜索属性。在您的示例中,它看起来还包含所有搜索属性,这将导致errSecParam。

另外,还要注意keychainQuery字典中任何不适用于更新的值也会导致errSecParam。如果存在这些值,则可以简单地删除它们,例如:

代码语言:javascript
运行
复制
CFDictionaryRemoveValue(keychainQuery, kSecReturnData);
CFDictionaryRemoveValue(keychainQuery, kSecMatchLimit);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27766030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档