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

后台获取是一项非常特殊的技术,它让操作系统有机会调用您的代码,然后调用您的 Web 服务以查看是否有任何新数据要检索。但是您没有太多时间来执行该请求(30 秒?)。它不适用于任何实质性的东西(或者如果是的话,你会将 background fetch 与 background 结合起来NSURLSession,这是一种完全不同的技术)。当后台获取执行这些机会性调用之一时,您在完成后调用完成处理程序。

但是您的两个代码示例并没有向我们展示您调用应用委托传递给您的完成处理程序performFetchWithCompletionHandler。因此,我不清楚您是否真的在进行后台获取并且没有共享相关代码,或者您是否正在混淆不同的技术。

有三种基本的后台网络方法,每种方法都有自己的优点和缺点。

  • 有后台获取,操作系统将在其自己选择的时间发起机会性网络请求;

  • beginBackgroundTaskWithExpirationHandler,它可以让您的应用程序继续运行几分钟(现在是 3 分钟)以完成有限长度的任务......如果您正在启动一个您知道可能需要几分钟的网络请求并且您不希望它因为用户离开你的应用而死;和

  • NSURLSession一个后台NSURLSessionConfiguration,其中一个 iOS 守护程序代表您的应用程序执行请求,并允许您上传和下载可能需要更长时间的请求(即使在您的应用程序被终止后),当它完成时唤醒您的应用程序。

根据您的描述,我不清楚哪些适用于您的情况。当您说您的请求在后台运行时,请求发起的精确度如何以及它们可能需要多长时间,最坏的情况是?

话虽如此,在做后台网络时,我会考虑转移到NSURLSession,这开辟了更多的机会。使用 AFNetworking,这是通过AFHTTPSessionManager(而不是AFHTTPRequestOperationManager; 这有点复杂,但请参阅https://stackoverflow.com/a/21359684/1271826以了解为后台会话配置 AFNetworking 的讨论)。如果你自己做,它使用NSURLSession背景NSURLSessionConfiguration而不是使用NSURLConnection.

于 2015-06-19T21:05:31.150 回答