web-dev-qa-db-ja.com

iOSSFHFKeychainUtilsがエラー-25308で*時々*失敗するerrSecInteractionNotAllowed

指定されたユーザー名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これは、キーチェーンにアクセスするために何らかのユーザー操作が必要であることを意味します。

この呼び出しが特定のユーザーだけに失敗する理由を誰かが知っていますか?このキーチェーンエントリは私のアプリに固有です-それでは、なぜそれにアクセスするためにユーザーの操作が必要なのですか?

どんなポインタも大歓迎です...

30
Simon East

OK、ついにこれを解決しました。

最終的に私は、問題を抱えていたユーザーが自分の電話にロックコードを設定していたことを突き止めました。電話がロックされている場合、キーチェーンシステムはこの-25308エラーを返していました。

アプリがフォーグラウンドでアクティブなときにのみキーチェーンにアクセスする必要がある場合、この問題は発生しませんが、電話がロックされているときに処理を続行する必要がある場合、またはアプリがバックグラウンドにある場合は、発生します。

他の場所では、kechainシステムのデフォルトのアクセス属性はkSecAttrAccessibleAlwaysであると読みましたが、それは時代遅れだと思います。キーチェーンシステムのデフォルトのアクセス属性は、電話がPINコードでロックされている場合、アイテムが使用できないようになっているようです。

これに対する修正は、SFHFKeychainUtilsコードを変更して、管理するキーチェーンアイテムに特定のkSecAttrAccessible属性を設定することです(元のコードは、おそらくこれらの属性よりも古いため、これを行いませんでした)。

SFHFKeychainUtilsコードのこのwordpress 更新バージョン には修正が含まれています-kSecAttrAccessibleを検索して、アクセス可能な属性コードが追加された場所を確認してください。

これが他の誰かがこれに遭遇するのを助けることを願っています...

45
Simon East