1

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

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

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 存储库来测试此代码 - 它安排了本地通知以允许您在后台运行会话任务。

BackgroundSender 的 GitHub 存储库

4

1 回答 1

1

在应用程序委托中handleEventsForBackgroundURLSession,您没有对完成处理程序做任何事情。你应该:


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


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

有关后台获取的讨论,请参阅iOS 应用程序编程指南:后台执行中的机会性获取少量内容,并将其与后台部分中的下载内容进行比较。

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

于 2016-10-08T17:28:04.403 回答