現在、ユーザー名 (電子メール) と、電子メールとパスワードの塩漬けハッシュを 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 に設定して、タイムアウトを防ぎます。キーチェーンを取り巻く作業に問題はありませんが、トークンがいっぱいになるまで先に進めません。
編集 キーチェーンがバックグラウンドから値を取得しないという問題を解決しました。この質問は後で他の人にとって価値のあるものになるかもしれないと思うので、以下に回答を投稿して受け入れます。