1

アプリがバックグラウンド状態にあるとき、基本的にBluetoothドングルで動作し、サーバーとデータを送受信するときに、アプリには多くのタスクがあります。バックグラウンド状態のアプリがクエリを送信すると、システムがこのクエリで「フリーズ」することがあります。そして、アプリを起動した後、システムは「フリーズアウト」し、

Error Domain=kCFErrorDomainCFNetwork Code=-1001 "The request timed out.

現時点では、アプリは最後の AFNetworking 3.1.0 と BFTask ヘルパーを使用しています。

詳細については。ユーザーが何らかの理由でアプリを使用し、アプリがバックグラウンド状態になった後 (ユーザーがホームボタンを押すか、デバイスをロックした後)、アプリは通常バックグラウンド状態で動作し続けます。システムまたはユーザーがアプリを強制終了できます。アプリは、ウェイクアップの瞬間に (ジオロケーション サービス、ジオフェンシングを介して) 何らかのユーザー操作を行った後にウェイクアップできます。現時点では、ログで次のことを確認できます。

> Request method: POST url: https://******/v1/account/token headers: {
    UserName = "***@***.com";
    "grant_type" = password;
    password = ****
} at time: 2016-08-15 15:30:45 +0000

コード:

    if ([request.method isEqualToString:@"GET"]) {
            return [manager GET:request.url parameters:request.params progress:nil success:^(NSURLSessionTask *operation, id responseObject) {

            } failure:^(NSURLSessionTask *operation, NSError *error) {

                    processError(operation, error);
                }
            }];

ユーザーがアプリを起動してしばらくすると、このコードが実行を継続しようとすると、タイムアウトでエラーが発生します。

    error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x156d8ce10
{Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" 
UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=https://******/v1/account/token, NSErrorFailingURLKey=https://******/v1/account/token, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.} 
at time: 2016-08-15 15:46:28 +0000

ユーザーがアプリを再起動すると、約 16 分の時間差があります。そして、これは http クエリの別の部分にある可能性があります

問題は、iOS がバックグラウンドでクエリをフリーズする理由と、これを修正する方法です。

4

1 に答える 1

1

ネットワークでさまざまな実験を行った後、ついに問題が見つかりました。CFNetwork 診断を有効にすると、アプリ内のすべてのリクエストに関する詳細情報を取得できます。また、CFNetwork は -1001 エラーではなく、すべてのエラーが Code=-1005 「null」としてマークされますが、-1005 エラーは「ネットワーク接続が失われました」です。AFNetworking でこのエラーが発生した理由はわかりませんが、これは理にかなっています。問題は、Wi-Fi または 3G/4G に接続し、インターネットに接続していない (ローカルのみ) ときに発生し、この時点でアプリが要求を実行しようとすると、現時点で CFNetwork アラート -1005 エラーが発生しますが、AFNetworking は - でエラーを返します。 1001コード。それは私のトピックの質問の問題です。

現時点では、すべてのリクエストがホストにpingを送信する前に、これに対するエレガントなソリューションはありません。応答がある場合は、リクエストを実行します。多分あなたはより良い方法を知っていますか?

于 2016-09-06T12:08:00.407 に答える