現在、iOS KeyChainにユーザー名(メール)とメールとパスワードのソルトハッシュを保存しています。ここにある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];
キーチェーンラッパーの非ARCバージョンに戻りましたが、それでも同じ結果が得られます。これについてのフィードバックをいただければ幸いです。これは私のユーザーのごく一部ですが、修正したい問題であり、心配する必要はありません。前もって感謝します。
また、私のバックグラウンド作業はすべて、タイムアウトを防ぐためにbackgroundTaskで設定されています。キーチェーンを取り巻く作業に問題はありませんが、トークンがいっぱいになるまで問題は発生しません。
編集 私は彼らのキーチェーンがバックグラウンドから値を取得しないという私の問題を理解しました。この質問は後で他の人にとって価値があると思うので、以下に回答を投稿して受け入れます。