iOS中的钥匙链访问:“;Keychain无法存储代码为:-50“的值;

iOS中的钥匙链访问:“;Keychain无法存储代码为:-50“的值;,ios,error-handling,keychain,error-code,Ios,Error Handling,Keychain,Error Code,调用SecItemAdd时,我找不到有关此类错误代码的信息,可能是什么原因造成的 提前谢谢 编辑:这是我得到错误的函数: + (BOOL)storeWithKey:(NSString *)keyStr withValueStr:(NSString *)valueStr { if ((keyStr != nil) && (![keyStr isEqualToString:@""]) && (valueStr != nil) &&

调用
SecItemAdd
时,我找不到有关此类错误代码的信息,可能是什么原因造成的

提前谢谢

编辑:这是我得到错误的函数:

+ (BOOL)storeWithKey:(NSString *)keyStr withValueStr:(NSString *)valueStr
{
   if ((keyStr != nil) && (![keyStr isEqualToString:@""]) &&
       (valueStr != nil) && (![valueStr isEqualToString:@""])) {

       NSData *valueData = [valueStr dataUsingEncoding:NSUTF8StringEncoding];
       NSString *service = [[NSBundle mainBundle] bundleIdentifier];

       NSDictionary *secItem = @{(__bridge id)kSecClass : (__bridge id)kSecClassInternetPassword,
                              (__bridge id)kSecAttrService : service,
                              (__bridge id)kSecAttrAccount : keyStr,
                              (__bridge id)kSecValueData : valueData};

       CFTypeRef result = NULL;

       // Store value and get the result code
       OSStatus status = SecItemAdd((__bridge CFDictionaryRef)secItem, &result);

       NSLog(@"'writeToKeychain'. %@", [self getErrorMessage:status]);

       return [self checkIfInKeychain:status];
   }
   else {
       return NO;
   }
}

错误代码的文档位于
Security/SecBase.h
文件中。你可以在最后找到它们


您还可以在
SecItemAdd
的文档中找到它们

-50
表示
传递给函数的一个或多个参数无效
。参数组合错误

如果使用
kSecAttrService
kSecAttrAccount
kSecClass
应为
kSecClassGenericPassword

NSDictionary *secItem = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                          (__bridge id)kSecAttrService : service,
                          (__bridge id)kSecAttrAccount : keyStr,
                          (__bridge id)kSecValueData : valueData};
如果您将
kSecClassInternetPassword
用作
ksecclasss
,则应使用
kSecAttrServer
ksecattrsort
(如果需要)代替
kSecAttrService

NSDictionary *secItem = @{(__bridge id)kSecClass : (__bridge id)kSecClassInternetPassword,
                          (__bridge id)kSecAttrServer : @"example.com",
                          (__bridge id)kSecAttrPort : @(80), // Optional
                          (__bridge id)kSecAttrAccount : keyStr,
                          (__bridge id)kSecValueData : valueData};

你从哪里得到这个错误的?-50=参数。您呼叫中的某些参数错误,呼叫不可能成功,因为参数不正确。这为我在Swift 3中解决了类似问题。同样的代码在没有kSecClass的ObjC中也能工作,但在swift3中它给出了-50。添加了带有kSecClassGenericPassword的kSecClass,它可以正常工作。感谢@kishikawa katsumiHow应用程序在处于锁定状态时将建立联系。@kishikawa我尝试过使用你的应用程序,但它无法提供应用程序密钥链中存储的内容。这是随机发生的还是直接发生的。