指定されたユーザー名NSStringのキーチェーンからパスワードを取得する次のコードがあります。
NSError *error = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error];
if(error != nil)
// log the error
ほとんどの場合、ほとんどのユーザーにとってこれはすべて正常に機能しますが、一部の特定のユーザーにとっては、この呼び出しは失敗する(そして失敗し続ける)ように見え、次のエラーが返されます。
The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)
これは明らかにerrSecInteractionNotAllowedです-私が読んだことから私はthinkこれは、キーチェーンにアクセスするために何らかのユーザー操作が必要であることを意味します。
この呼び出しが特定のユーザーだけに失敗する理由を誰かが知っていますか?このキーチェーンエントリは私のアプリに固有です-それでは、なぜそれにアクセスするためにユーザーの操作が必要なのですか?
どんなポインタも大歓迎です...
OK、ついにこれを解決しました。
最終的に私は、問題を抱えていたユーザーが自分の電話にロックコードを設定していたことを突き止めました。電話がロックされている場合、キーチェーンシステムはこの-25308エラーを返していました。
アプリがフォーグラウンドでアクティブなときにのみキーチェーンにアクセスする必要がある場合、この問題は発生しませんが、電話がロックされているときに処理を続行する必要がある場合、またはアプリがバックグラウンドにある場合は、発生します。
他の場所では、kechainシステムのデフォルトのアクセス属性はkSecAttrAccessibleAlwaysであると読みましたが、それは時代遅れだと思います。キーチェーンシステムのデフォルトのアクセス属性は、電話がPINコードでロックされている場合、アイテムが使用できないようになっているようです。
これに対する修正は、SFHFKeychainUtilsコードを変更して、管理するキーチェーンアイテムに特定のkSecAttrAccessible属性を設定することです(元のコードは、おそらくこれらの属性よりも古いため、これを行いませんでした)。
SFHFKeychainUtilsコードのこのwordpress 更新バージョン には修正が含まれています-kSecAttrAccessibleを検索して、アクセス可能な属性コードが追加された場所を確認してください。
これが他の誰かがこれに遭遇するのを助けることを願っています...