2015-06-19 49 views
0

我想运行一些请求,而我的应用程序在background.My应用程序支持背景模式 - >后台提取。在后台运行请求IOS

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

顺便说一句,当使用'NSURLConnection'时,不要将'start'与'initWithRequest:delegate:'结合使用。这已经开始为你。如果你使用'initWithRequest:delegate:startImmediately:'''NO' /'FALSE'作为最后一个参数,那么只能使用'start'方法。 – Rob

回答

2

背景提取是一个非常具体的技术,让OS投机打电话给你的代码,进而调用Web服务,以查看是否有任何新要检索的数据。但是你没有太多时间来执行该请求(30秒?)。它不适用于任何实质性的事情(或者如果是的话,你会结婚背景NSURLSession,一个完全不同的技术)。当后台获取执行这些机会主义调用之一时,您在完成时调用完成处理程序。

但是你的两个代码示例并没有显示你调用了应用程序代理的performFetchWithCompletionHandler传递给你的完成处理程序。所以我不清楚你是否真的在进行后台获取,没有分享相关的代码,或者你是否在混合不同的技术。

有三种基本的后台联网方式,每种方式都有其优缺点。

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

  • beginBackgroundTaskWithExpirationHandler,它可以让你的应用程序继续运行几分钟(现在3分钟)来完成有限长度的任务......如果你开始一个你知道可能会占用的网络请求到几分钟,你不希望它只是因为用户离开你的应用程序而死亡;和

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

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

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