在后台IOS中运行请求

时间:2015-06-19 20:23:39

标签: objective-c afhttprequestoperation

我希望在我的应用处于后台时运行一些请求。我的应用支持后台模式 - >背景提取。

但是当我的应用程序处于后台时,代码总是返回失败! 有没有办法运行请求?我也试过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];

1 个答案:

答案 0 :(得分:2)

后台提取是一项非常具体的技术,可让操作系统机会性地调用您的代码,而代码又调用您的Web服务以查看是否有任何新数据需要检索。但是你没有太多时间来执行该请求(30秒?)。它不适用于任何实质性内容(或者,如果是,您将背景提取与背景NSURLSession结合,这是一种完全不同的技术)。当后台提取执行其中一次机会性调用时,您将在完成后调用完成处理程序。

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

有三种基本的后台网络方法,每种方法各有利弊。

  • 有后台提取,操作系统会在自己选择的时候发起机会网络请求;

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

  • NSURLSession背景为NSURLSessionConfiguration,其中iOS守护程序代表您的应用执行请求,并允许您上传和下载可能需要更长时间的请求(甚至在您的应用终止后,在应用完成后唤醒您的应用。

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

话虽如此,在进行后台联网时,我会考虑转移到NSURLSession,这会带来更多机会。使用AFNetworking,这可以通过AFHTTPSessionManager(而不是AFHTTPRequestOperationManager来实现;它有点复杂,但有关为背景会话配置AFNetworking的讨论,请参阅https://stackoverflow.com/a/21359684/1271826。如果您自己动手,则使用NSURLSession背景为NSURLSessionConfiguration,而不是使用NSURLConnection