我已多次尝试并失败,以获得一些继承的代码来成功发送后台会话请求。在前台时,它可以完美地工作,但在后台它将永远不会返回,或者在某些情况下,会收到验证。
创建请求的代码很漂亮:
NSURLSessionConfiguration *sessionConfig =
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
sessionConfig.sessionSendsLaunchEvents = true;
sessionConfig.discretionary = false;
sessionConfig.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
sessionConfig.timeoutIntervalForResource = 60 * 60 * 24; //One day. Default is 7 days!
/* Create session, and optionally set a NSURLSessionDelegate. */
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
NSURLComponents *urlComponents = [NSURLComponents new];
urlComponents.scheme = @"https";
urlComponents.host = @"jsonplaceholder.typicode.com";
urlComponents.path = @"/posts/1";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[urlComponents URL]];
request.HTTPMethod = @"PUT";
NSLog(@"Making request: %@", request);
/* Start a new Task */
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
但我从未得到任何回报。我确实有所需的背景模式(可能)
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
我的代表委托了一切
<NSURLSessionDelegate, NSURLSessionDataDelegate,NSURLConnectionDataDelegate,NSURLConnectionDelegate,NSURLSessionTaskDelegate>
任何帮助都会受到赞赏 - 我很确定我在某处只缺少一行代码。我甚至创建了一个GitHub仓库,只是为了测试这个代码,它安排了一个本地通知,允许你在后台运行会话任务。
答案 0 :(得分:1)
在app delegate的handleEventsForBackgroundURLSession
中,您对完成处理程序一无所知。你应该:
保存completionHandler
的副本;
使用该标识符启动后台NSURLSession
;和
完成处理所有委托方法后,调用保存的完成处理程序;我们经常在URLSessionDidFinishEventsForBackgroundURLSession
。
顺便说一下,你不应该在后台会话中使用数据任务。您通常应该使用下载或上传任务。
此外,背景NSURLSession
不需要这些背景模式。后台提取是针对不同的问题而设计的,即定期轮询以查看您的服务器是否具有可用数据。如果您需要,那么请务必使用fetch
后台模式,但要意识到这是仅仅执行后台请求的单独主题。
请参阅 iOS应用程序编程指南:后台执行中的Fetching Small Amounts of Content Opportunistically,以获取有关后台提取的讨论,并将其与Downloading Content in the Background部分进行比较。
同样,remote-notification
密钥也是无关的。正如文档所说,当{34}应用程序想要在推送通知到达时开始下载内容时使用remote-notification
。使用此通知可以最大程度地减少显示与推送通知相关的内容的延迟。&#34;