无法获得背景 URL 与 return 的会话
Cannot get background URL Session to return
我曾多次尝试获取一些继承代码以成功发送后台会话请求,但均以失败告终。在前台时,它可以完美运行,但在后台时,它永远不会 return,或者在某些情况下,会收到身份验证挑战。
创建请求的代码非常样板化:
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 存储库来测试这段代码——它安排了一个本地通知,允许你在后台 运行 会话任务。
在应用委托的 handleEventsForBackgroundURLSession
中,您没有对完成处理程序执行任何操作。你应该:
保存副本completionHandler
;
使用该标识符启动后台 NSURLSession
;和
处理完所有委托方法后,调用保存的完成处理程序;我们经常在 URLSessionDidFinishEventsForBackgroundURLSession
.
中这样做
顺便说一下,您不应该在后台会话中使用数据任务。您通常应该使用下载或上传任务。
此外,这些背景模式对于背景来说并不是必需的 NSURLSession
。后台提取是为不同的问题而设计的,即定期轮询以查看您的服务器是否有可用数据。如果您需要,请务必使用 fetch
后台模式,但请注意,这是一个独立于仅执行后台请求的主题。
参见 Fetching Small Amounts of Content Opportunistically in the App Programming Guide for iOS: Background Execution for a discussion of background fetch, and compare that to the Downloading Content in the Background 部分。
同样,remote-notification
键也不相关。正如文档所说, remote-notification
在 "The app wants to start downloading content when a push notification arrives. Use this notification to minimize the delay in showing content related to the push notification."
时使用
我曾多次尝试获取一些继承代码以成功发送后台会话请求,但均以失败告终。在前台时,它可以完美运行,但在后台时,它永远不会 return,或者在某些情况下,会收到身份验证挑战。
创建请求的代码非常样板化:
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 存储库来测试这段代码——它安排了一个本地通知,允许你在后台 运行 会话任务。
在应用委托的 handleEventsForBackgroundURLSession
中,您没有对完成处理程序执行任何操作。你应该:
保存副本
completionHandler
;使用该标识符启动后台
NSURLSession
;和处理完所有委托方法后,调用保存的完成处理程序;我们经常在
URLSessionDidFinishEventsForBackgroundURLSession
. 中这样做
顺便说一下,您不应该在后台会话中使用数据任务。您通常应该使用下载或上传任务。
此外,这些背景模式对于背景来说并不是必需的 NSURLSession
。后台提取是为不同的问题而设计的,即定期轮询以查看您的服务器是否有可用数据。如果您需要,请务必使用 fetch
后台模式,但请注意,这是一个独立于仅执行后台请求的主题。
参见 Fetching Small Amounts of Content Opportunistically in the App Programming Guide for iOS: Background Execution for a discussion of background fetch, and compare that to the Downloading Content in the Background 部分。
同样,remote-notification
键也不相关。正如文档所说, remote-notification
在 "The app wants to start downloading content when a push notification arrives. Use this notification to minimize the delay in showing content related to the push notification."