1. ホーム
  2. iphone

[解決済み] iOS KeyChainがバックグラウンドから値を取得しない件

2023-03-28 09:37:09

質問

現在、iOS KeyChain にユーザー名 (メールアドレス)、メールアドレスとパスワードの塩漬けハッシュを保存しています。私はARC'ifiedバージョンを使用しています。 はこちら .

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 バージョンまたはデバイスに突き止めることはまだできないことを覚えておいてください。

ユーザーが場所を移動し (地域監視)、サーバーのステータスを更新したいと思います。私は、他のすべてのネットワーク呼び出しに対して行うのと同じ方法で、キーチェーンからトークンを引き出して、状態を更新しようとします。しかし、ユーザーによっては、その値がゼロになっています。それがないと、ネットワークのものを更新することができないのです。なぜ、ほとんどのユーザーには機能するのに、ごく一部のユーザーには機能しないのでしょうか?

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

keychainwrapperのARCでないバージョンに戻しましたが、やはり同じ結果になってしまいます。これについて何かフィードバックがあれば幸いです。私のユーザーのごく一部ですが、解決して心配のないようにしたい問題です。事前にありがとうございます。

また、私のバックグラウンドの作業は全てbackgroundTaskで設定し、タイムアウトを防いでいます。キーチェーンにまつわる作業には何の問題もありませんが、トークンが満たされるまでは物事を進めないようにしています。

EDIT 私は彼らがキーチェーンがバックグラウンドから値を取得しないことについての私の問題を考え出した。私は、この質問が後で他の人にとって貴重になるかもしれないと感じるので、以下に答えを投稿し、受け入れます。

どのように解決するのですか?

私の質問は、その理由についてはほぼ的を得ていましたが、完全ではありませんでした。ブログに次ぐブログ、チュートリアルに次ぐチュートリアルを読み漁り、ついに、何が起こっているのかのヒントを与えてくれるものを見つけたのです。

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

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

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

ユーザー名とパスワードの値を設定しているところに、この行を追加します。魅力的なように動作します。これが誰かの助けになることを願っています。私がピースをまとめることができるまで、かなり長い間私を困惑させました。