37

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

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

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

4

2 に答える 2

53

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

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

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

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

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

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

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

于 2012-03-16T10:22:36.200 に答える
2

私はiOS14でこの問題を抱えていましたが、ウィジェット拡張機能がキーチェーンにアクセスしてJWTトークンにいくつかのレストを呼び出すようにしています。

どうやら、デバイスがロックされていて、使用しようとしていたキーチェーンアイテムにアクセスできなかった場合にも、ウィジェットはデフォルトで更新を試みました。

この属性をキーチェーン要素(swift 5コード)に設定すると、すべてが機能しているように見えます。

keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
于 2021-06-11T07:02:33.803 に答える