在后台运行请求IOS
我想运行一些请求,而我的应用程序在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];
背景提取是一个非常具体的技术,让OS投机打电话给你的代码,进而调用Web服务,以查看是否有任何新要检索的数据。但是你没有太多时间来执行该请求(30秒?)。它不适用于任何实质性的事情(或者如果是的话,你会结婚背景NSURLSession
,一个完全不同的技术)。当后台获取执行这些机会主义调用之一时,您在完成时调用完成处理程序。
但是你的两个代码示例并没有显示你调用了应用程序代理的performFetchWithCompletionHandler
传递给你的完成处理程序。所以我不清楚你是否真的在进行后台获取,没有分享相关的代码,或者你是否在混合不同的技术。
有三种基本的后台联网方式,每种方式都有其优缺点。
存在后台提取,操作系统将在自己选择的时间发起机会性网络请求;
有
beginBackgroundTaskWithExpirationHandler
,它可以让你的应用程序继续运行几分钟(现在3分钟)来完成有限长度的任务......如果你开始一个你知道可能会占用的网络请求到几分钟,你不希望它只是因为用户离开你的应用程序而死亡;和有
NSURLSession
与背景NSURLSessionConfiguration
,其中iOS的守护代表您的应用程序的执行请求,并允许你上传和可能需要更长的时间(您的应用程序已终止,即使后)下载请求,完成后唤醒您的应用程序。
根据您的描述,我不清楚哪些适用于您的情况。当你说你的请求是在后台运行时,请求发起的确切程度以及可能需要多长时间,最坏的情况?
话虽如此,在做后台联网时,我会考虑转移到NSURLSession
,这就开辟了更多的机会。通过AFNetworking,这可以通过AFHTTPSessionManager
(而不是AFHTTPRequestOperationManager
;这有点复杂,但请参阅https://stackoverflow.com/a/21359684/1271826关于为后台会话配置AFNetworking的讨论)来实现。如果你自己做,它使用NSURLSession
背景NSURLSessionConfiguration
,而不是使用NSURLConnection
。
顺便说一句,当使用'NSURLConnection'时,不要将'start'与'initWithRequest:delegate:'结合使用。这已经开始为你。如果你使用'initWithRequest:delegate:startImmediately:'''NO' /'FALSE'作为最后一个参数,那么只能使用'start'方法。 – Rob