web-dev-qa-db-ja.com

KeyChainItemWrapperに保存するとパスワードがクラッシュする

Appleは、KeyChainItemWrapperクラスを GenericKeyChainサンプルコード で提供しています。ここSOにはARC化されたソリューションがあります。これをフォローしようとしています: 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)];

電子メールテキストフィールドのある行が受け入れられます。ただし、パスワードの2行目は、次の例外を除いてクラッシュします。

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メソッドです。私が予想していたように、これはどういうわけかKeyChainの直接処理に関連しています...

keychainItemDataに含まれるもの: enter image description here

14
Houman

私はこれを得ることができませんでしたAppleキーチェーンラッパーの例はもう機能しません。幸いなことに、この問題をさらに調査すると、これが明らかになりました ソリューション 、これは私にとってはうまくいきました。

ソリューションに対する元の回答はARC化されていないことに注意してください。ただし、誰かがとても親切に GithubでARC化されたバージョン を作成してくれました。私はそれを使用し、魅力のように機能します。

これはキーチェーンのラッパーであり、元のラッパーよりもさらに簡単に機能します。

これが同様の問題を抱えている他の人に役立つことを願っています。

15
Houman

シミュレーターでアプリを実行したときに同じエラーが発生しましたが、デバイスでは完全に機能しました。

シミュレーターの問題を修正するために、「キーチェーン資格の共有」をオンにする必要がありました。

キーチェーンの資格を共有する

5
Seeler99