当应用程序在后台时,不会调用 AFHTTPSessionManager 块
AFHTTPSessionManager block is not called when app is on background
我的应用得到静默推送,然后使用 AFNetworking 在后台做一些 http 请求,但它没有进入完整的块,代码是:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];
[manager GET:urlString
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"response objece:%@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error:%@", error);
}];
然后我发现也许我可以使用 NSURLSessionConfiguration 来配置会话:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.company.backgroundDownloadSession"];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration];
[manager GET:urlString
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"response objece:%@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error:%@", error);
}];
但是 AFNetworking 崩溃说:'由于未捕获的异常 'NSGenericException',正在终止应用程序,原因:'Data tasks are not supported in background sessions.'
我应该怎么办?感谢您的帮助!
几个想法:
适当的背景 NSURLSessionConfiguration
需要 NSURLSessionDownloadTask
或 NSURLSessionUploadTask
。但是,GET
方法会创建 NSURLSessionDataTask
.
要使用下载或上传任务,您必须单独构建请求,然后利用 AFURLSessionManager
发出下载或上传。尽管如此,如果您尝试创建 HTTP GET/POST 样式的请求,您可以使用各种请求序列化程序创建请求。只需使用 AFHTTPRequestSerializer
方法 requestWithMethod
.
有关结合后台使用 AFNetworking 的基本介绍 NSURLSessionConfiguration
,请参阅 。您必须将其与上面讨论的 requestWithMethod
结合起来。
请注意,使用特定于任务的完成块时要小心(因为即使应用程序终止,任务也会继续,这些块早已不复存在)。正如后台下载任务的 AFNetworking 文档所说:
Warning: If using a background NSURLSessionConfiguration
on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to use setDownloadTaskDidFinishDownloadingBlock:
to specify the URL for saving the downloaded file, rather than the destination block of this method.
如果您提出的要求不高,如果用户在提出要求时碰巧离开了您的应用程序,那么只要求 OS 稍等片刻可能会更容易仍在进行中。请参阅 App Programming Guide for iOS: Background Execution 的 执行有限长度任务 部分。
最重要的是,在发出请求之前,请执行以下操作:
UIApplication *application = [UIApplication sharedApplication];
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
然后在请求的完成块中,可以终止后台任务:
if (bgTask != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
这只适用于有限长度的任务,但它可能比尝试做背景要容易得多 NSURLSessionConfiguration
。
我的应用得到静默推送,然后使用 AFNetworking 在后台做一些 http 请求,但它没有进入完整的块,代码是:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];
[manager GET:urlString
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"response objece:%@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error:%@", error);
}];
然后我发现也许我可以使用 NSURLSessionConfiguration 来配置会话:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.company.backgroundDownloadSession"];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration];
[manager GET:urlString
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"response objece:%@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error:%@", error);
}];
但是 AFNetworking 崩溃说:'由于未捕获的异常 'NSGenericException',正在终止应用程序,原因:'Data tasks are not supported in background sessions.' 我应该怎么办?感谢您的帮助!
几个想法:
适当的背景
NSURLSessionConfiguration
需要NSURLSessionDownloadTask
或NSURLSessionUploadTask
。但是,GET
方法会创建NSURLSessionDataTask
.要使用下载或上传任务,您必须单独构建请求,然后利用
AFURLSessionManager
发出下载或上传。尽管如此,如果您尝试创建 HTTP GET/POST 样式的请求,您可以使用各种请求序列化程序创建请求。只需使用AFHTTPRequestSerializer
方法requestWithMethod
.有关结合后台使用 AFNetworking 的基本介绍
NSURLSessionConfiguration
,请参阅 。您必须将其与上面讨论的requestWithMethod
结合起来。请注意,使用特定于任务的完成块时要小心(因为即使应用程序终止,任务也会继续,这些块早已不复存在)。正如后台下载任务的 AFNetworking 文档所说:
Warning: If using a background
NSURLSessionConfiguration
on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to usesetDownloadTaskDidFinishDownloadingBlock:
to specify the URL for saving the downloaded file, rather than the destination block of this method.如果您提出的要求不高,如果用户在提出要求时碰巧离开了您的应用程序,那么只要求 OS 稍等片刻可能会更容易仍在进行中。请参阅 App Programming Guide for iOS: Background Execution 的 执行有限长度任务 部分。
最重要的是,在发出请求之前,请执行以下操作:
UIApplication *application = [UIApplication sharedApplication]; bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{ // Clean up any unfinished task business by marking where you // stopped or ending the task outright. [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }];
然后在请求的完成块中,可以终止后台任务:
if (bgTask != UIBackgroundTaskInvalid) { [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }
这只适用于有限长度的任务,但它可能比尝试做背景要容易得多
NSURLSessionConfiguration
。