无法让后台 URL 会话返回

Posted

技术标签:

【中文标题】无法让后台 URL 会话返回【英文标题】:Cannot get background URL Session to return 【发布时间】:2016-10-08 17:21:20 【问题描述】:

我已经多次尝试并失败了,以获取一些继承代码以成功发送后台会话请求。在前台时,它可以完美运行,但在后台,它要么永远不会返回,要么在某些情况下会收到身份验证挑战。

创建请求的代码非常样板:

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 存储库,只是为了测试这段代码——它安排了一个本地通知,允许你在后台运行会话任务。

GitHub repo for BackgroundSender

【问题讨论】:

【参考方案1】:

在应用程序委托的handleEventsForBackgroundURLSession 中,您没有对完成处理程序执行任何操作。你应该:

保存completionHandler的副本;

使用该标识符启动后台NSURLSession;和

处理完所有委托方法后,调用保存的完成处理程序;我们经常在URLSessionDidFinishEventsForBackgroundURLSession 这样做。


顺便说一句,您不应该在后台会话中使用数据任务。您通常应该使用下载或上传任务。


此外,背景NSURLSession 不需要这些背景模式。后台获取是针对不同的问题而设计的,即定期轮询以查看您的服务器是否有可用数据。如果您需要,那么请务必使用fetch 后台模式,但要意识到这是与仅执行后台请求不同的主题。

请参阅ios 应用程序编程指南:后台执行中的Fetching Small Amounts of Content Opportunistically,了解有关后台获取的讨论,并将其与Downloading Content in the Background 部分进行比较。

同样,remote-notification 键也不相关。正如文档所说,remote-notification 用于“应用想要在推送通知到达时开始下载内容。使用此通知可以最大限度地减少显示与推送通知相关的内容的延迟。”

【讨论】:

handleEventsForBackgroundURLSession 没有实现,因为我从未见过它被调用。您关于不使用数据任务的评论似乎是问题所在 - 我将其更改为下载任务只是为了看看它是否可以工作,并立即得到了一个 handleEventsForBackgroundURLSession 调用。远程通知密钥是来自原始项目的工件,但认为它也可能适用于由本地通知启动的启动任务。 非常好。顺便说一句,当您完成处理已完成请求的委托方法时,请确保调用传递给 handleEventsForBackgroundURLSession 的完成处理程序,否则操作系统将终止您的应用程序,而不是优雅地挂起它,从而阻止其他后台进程(如远程通知和后台获取)。

以上是关于无法让后台 URL 会话返回的主要内容,如果未能解决你的问题,请参考以下文章

跨域登录

EXTJS,SERVLET后台返回数据火狐无法获取,且报错:uncaught exception: [object Object]

如果后台用framset框架,session过期,整个跳出,返回 登录页面

我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?

在 PHP 中的 PayPal 中返回 URL

XCTest 中未保留经过身份验证的 Vapor 会话