【问题标题】:Keychain access in iOS: "Keychain failed to store the value with code: -50"iOS 中的钥匙串访问:“钥匙串无法使用代码存储值:-50”
【发布时间】:2016-01-17 17:34:50
【问题描述】:

我在调用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;
   }
}

【问题讨论】:

  • 你从哪里得到这个错误的?
  • -50 = 参数错误。您调用的部分参数错误,由于参数错误,调用不可能成功。

标签: ios error-handling keychain error-code


【解决方案1】:

-50 表示One or more parameters passed to a function were not valid。你错误的参数组合。

如果你使用kSecAttrServicekSecAttrAccountkSecClass 应该是kSecClassGenericPassword

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

如果您将kSecClassInternetPassword 用作kSecClass,则应使用kSecAttrServerkSecAttrPort(如果需要)代替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};

【讨论】:

  • 这在 Swift 3 中为我解决了一个类似的问题。没有 kSecClass 的 ObjC 中的相同代码可以工作,但在 Swift 3 中它给出了 -50。使用 kSecClassGenericPassword 添加了 kSecClass 并且它可以工作。谢谢@kishikawa-katsumi
  • 应用处于锁定状态时如何联系。
  • @kishikawa 我尝试使用您的应用程序,但它无法提供存储在应用程序钥匙串中的内容。这是随机发生的还是直接发生的。
【解决方案2】:

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

您还可以在SecItemAdd 的文档中找到它们。 https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/#//apple_ref/doc/uid/TP30000898-CH5g-CJBEABHG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多