代码之家  ›  专栏  ›  技术社区  ›  Houman

在KeyChainItemWrapper中保存密码时崩溃

  •  14
  • Houman  · 技术社区  · 11 年前

    苹果公司在其 GenericKeyChain sample code 。这里有一个关于SO的ARC'ed解决方案,我正试图遵循它: wrapper 存储在iOS上的KeyChain中。

    包装器的用法如下:

    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"F11-email-auth" accessGroup:nil];
    [keychain setObject:[emailTextfield text] forKey:(__bridge id)(kSecMatchEmailAddressIfPresent)];
    [keychain setObject:[passwordTextfield text] forKey:(__bridge id)(kSecClassGenericPassword)];
    

    接受带有电子邮件文本字段的行。 但带有密码的第二行崩溃,出现以下异常。

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.'
    *** First throw call stack:
    (
        0   CoreFoundation                      0x01b445e4 __exceptionPreprocess + 180
        1   libobjc.A.dylib                     0x018c78b6 objc_exception_throw + 44
        2   CoreFoundation                      0x01b44448 +[NSException raise:format:arguments:] + 136
        3   Foundation                          0x014a823e -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
        4   Feeltracker                         0x000053b3 -[KeychainItemWrapper writeToKeychain] + 899
        5   Feeltracker                         0x00004700 -[KeychainItemWrapper setObject:forKey:] + 272
        6   Feeltracker                         0x000092d6 -[FTLoginViewController connectToAccount:] + 374
        7   libobjc.A.dylib                     0x018d9874 -
    

    原因可能是什么?我想知道这是否与我正在使用的常量有关。

    更新:

    感谢rmaddy的帮助:

    这一点似乎引发了错误:

    // No previous item found; add the new one.
    result = SecItemAdd((__bridge CFDictionaryRef)[self dictionaryToSecItemFormat:keychainItemData], NULL);
    NSAssert( result == noErr, @"Couldn't add the Keychain Item." );
    

    结果是-50。SecItemAdd是一个lib方法。正如我所料,这在某种程度上与钥匙链的处理直接相关。。。

    keychainItemData包含: enter image description here

    2 回复  |  直到 7 年前
        1
  •  15
  •   Community rcollyer    7 年前

    我再也找不到这个苹果的钥匙扣包装器了。 幸运的是,对此事的进一步研究揭示了这一点 solution ,这对我很有效。

    注意,解决方案的原始答案不是ARC’ed,但有人非常友善地创建了一个 ARC'ed version on Github 。我用过那个,效果很好。

    这是一个围绕钥匙链的包装器,它的工作原理甚至比原来的更简单。

    希望这能帮助其他有类似问题的人。

        2
  •  5
  •   Seeler99    8 年前

    我在模拟器上运行应用程序时也出现了同样的错误,但它在设备上运行得很好。

    为了解决模拟器的问题,我不得不打开“共享钥匙链权限”。

    Share keychain entitlement