91

現在、ユーザー名 (電子メール) と、電子メールとパスワードの塩漬けハッシュを iOS キーチェーンに保存しています。ここにある ARC 化バージョンを使用しています。

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];

アプリがアクティブなときにネットワーク呼び出しのためにトークンを引き出す必要がある場合、これはすべて正常に機能します。クリーンなスタートアップからのログインだけでなく、全体のすべてのネットワーク呼び出しにも機能します。アプリがバックグラウンドにあるときに問題が発生します。

これは散発的に発生するだけであり、特定の iOS バージョンまたはデバイスにまだピン留めしていないことを覚えておいてください.

ユーザーが場所をトリップし (地域の監視)、サーバーをそのステータスで更新したいと考えています。他のすべてのネットワーク呼び出しと同じ方法でキーチェーンからトークンを取り出し、ステータスを更新しようとします。しかし、一部のユーザーにとっては、値は nil です。それがなければ、ネットワークのものを更新できません。なぜこれはほとんどの人にはうまくいくのに、ごく一部の人にはうまくいかないのでしょうか?

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];

keychainwrapper の非 ARC バージョンに戻りましたが、それでも同じ結果が得られます。これに関するフィードバックをいただければ幸いです。これは私のユーザーのごく一部にすぎませんが、私が修正したい問題であり、心配する必要はありません。前もって感謝します。

また、私のバックグラウンド作業はすべて backgroundTask に設定して、タイムアウトを防ぎます。キーチェーンを取り巻く作業に問題はありませんが、トークンがいっぱいになるまで先に進めません。

編集 キーチェーンがバックグラウンドから値を取得しないという問題を解決しました。この質問は後で他の人にとって価値のあるものになるかもしれないと思うので、以下に回答を投稿して受け入れます。

4

4 に答える 4

114

私の質問は、その理由からほぼ的を射ていましたが、完全ではありませんでした。ブログを次から次へと読み、チュートリアルを次々と読んだ後、私は最終的に何が起こっているのかのヒントを与えたものを見つけました.

ロックされたホーム画面。キーチェーンのチュートリアルでは、キーチェーンのアクセシビリティ設定が常に空白のままになっているため、デフォルトで Apple の最低/最も安全なアクセス レベルになります。ただし、このレベルでは、ユーザーがロック画面にパスコードを持っている場合、キーチェーン アクセスは許可されません。ビンゴ!これにより、散発的な動作と、これがごく一部のユーザーにのみ発生する理由が説明されます。

1 行のコードで、混乱全体が解決されます。

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

ユーザー名とパスワードの値を設定する場所に次の行を追加します。魅力のように機能します。これが誰かを助けることを願っています。ピースをまとめることができるようになるまで、かなり長い間混​​乱しました。

于 2012-05-14T12:10:31.083 に答える
70

kSecAttrAccessibleAfterFirstUnlockの代わりに使用しkSecAttrAccessibleAlwaysます。


Appleのドキュメントから:

kSecAttrAccessibleAfterFirstUnlock
ユーザーがデバイスのロックを一度解除するまで、再起動後にキーチェーン項目のデータにアクセスすることはできません。

最初のロック解除後、次の再起動までデータにアクセスできます。これは、バックグラウンド アプリケーションからアクセスする必要があるアイテムに推奨されます。暗号化されたバックアップを使用すると、この属性を持つアイテムが新しいデバイスに移行されます。

于 2014-07-08T22:43:35.797 に答える