0

アプリがバックグラウンドにある間にリクエストを実行したい.マイアプリはバックグラウンドモードをサポートしています->バックグラウンドフェッチ。

ただし、以下のコードは、アプリがバックグラウンドにある間は常に失敗を返します! リクエストを実行する方法はありますか?私も NSURLConnection を試しましたが、時々応答を受け取り、時には応答を受け取りません!

 [[AFHTTPRequestOperationManager manager]POST:@"http://app.xxxx.com/message_delivery.php" parameters:@{@"message_id":MsgID} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {


    } success:^(AFHTTPRequestOperation *operation, id response) {
        NSLog(@"succesfuly tik");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"%@",error);
    }];

これらのコードは、時々機能しないことがあります

  NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://app.xxxx.com/message_delivery.php?message_id=%@",MsgID]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:2];
    [[[NSURLConnection alloc] initWithRequest:request delegate:self]start];
4

1 に答える 1

2

バックグラウンド フェッチは、OS が日和見的にコードを呼び出すことを可能にする非常に特殊なテクノロジであり、次に Web サービスを呼び出して、取得する新しいデータがあるかどうかを確認します。しかし、そのリクエストを実行する時間はあまりありません (30 秒?)。実質的なものを意図したものではありません(または、そうであれば、バックグラウンド fetch を background と組み合わせるとNSURLSession、まったく異なるテクノロジーになります)。バックグラウンド フェッチがこれらの日和見呼び出しのいずれかを実行する場合、完了時に完了ハンドラーを呼び出します。

しかし、あなたの 2 つのコード サンプルでは、​​アプリのデリゲートによって渡された完了ハンドラーの呼び出しが示されていませんperformFetchWithCompletionHandler。したがって、あなたが本当にバックグラウンド フェッチを行っていて、関連するコードを共有していないのか、それともさまざまなテクノロジを混同しているのかは不明です。

3 つの基本的なバックグラウンド ネットワーキング アプローチがあり、それぞれに長所と短所があります。

  • バックグラウンド フェッチがあり、OS は自ら選択したタイミングで日和見的なネットワーク リクエストを開始します。

  • がありbeginBackgroundTaskWithExpirationHandler、アプリを数分間 (現在は 3 分) 実行し続けて、有限の長さのタスクを完了させることができます。これは、数分かかることがわかっているネットワーク リクエストを開始する場合に便利です。ユーザーがアプリを離れたからといって、アプリが停止するのは望ましくありません。と

  • NSURLSessionバックグラウンドではNSURLSessionConfiguration、iOS デーモンがアプリに代わってリクエストを実行し、(アプリが終了した後でも) 時間がかかる可能性のあるアップロードおよびダウンロード リクエストを実行できるようにし、完了時にアプリを起動します。

あなたの説明に基づいて、これらのどれがあなたのケースに当てはまるかは私には明らかではありません. リクエストがバックグラウンドで実行されていると言う場合、リクエストはどのくらい正確に開始され、最悪の場合のシナリオでどのくらいの時間がかかる可能性がありますか?

そうは言っても、バックグラウンド ネットワーキングを行う場合は、に移行することを検討しNSURLSessionます。これにより、追加の機会が開かれます。AFNetworking では、これはAFHTTPSessionManager(ではなくAFHTTPRequestOperationManager; 少し複雑ですが、バックグラウンド セッション用に AFNetworking を構成する方法についてはhttps://stackoverflow.com/a/21359684/1271826を参照してください) で実現されます。自分で行う場合は、を使用するのではなく、NSURLSessionバックグラウンドで使用しています。NSURLSessionConfigurationNSURLConnection

于 2015-06-19T21:05:31.150 に答える