我希望我的iOS应用程序在后台从服务器下载一些产品信息。它应该在app active和inactive模式下工作。
使用NSURLSessionDataTask
我可以获取数据。但无法以非活动模式处理数据。
如果我可以在app处于后台/非活动状态时处理数据,请指导我吗?或任何其他建议。
请参阅下面的代码:
NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDataTask *sessinURLResData = [session dataTaskWithURL:urlIs completionHandler:^(NSData * dataa,NSURLResponse *response,NSError * error){
responseData = dataa;// process the data and save in local DB
}];
[sessinURLResData resume];
答案 0 :(得分:4)
至少有两种背景提取:
如果您希望自己的应用在未在前台运行时定期检查数据,可以在应用的“功能”中启用“后台获取”,然后您的应用委托在{{1}中执行该获取}。您只能快速(30秒或更短)网络请求。但是您的应用程序会执行网络请求,并从应用程序委托调用相应的完成处理程序代码,报告失败,存在新数据或缺少新数据:
performFetchWithCompletionHandler
完全不同类型的后台网络请求是后台- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSURL *url = [NSURL URLWithString:@"..."];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
completionHandler(UIBackgroundFetchResultFailed);
return;
}
BOOL foundNewData;
// parse the data; setting `foundNewData` as appropriate
if (foundNewData) {
completionHandler(UIBackgroundFetchResultNewData);
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
}];
[task resume];
}
,非常适合在后台进行大量下载/上传。为此,即使应用程序不再处于前台(即使应用程序已终止),您启动的任何下载/上传也将继续,并且当它们全部完成时,您的应用程序将在必要时重新启动,并且相应的委托方法将是调用。但是,要做到这一点,你必须:
使用NSURLSessionConfiguration
;
使用基于委托的[NSURLSessionConfiguration backgroundSessionConfiguration:identifier]
(你是);
使用下载或上传任务,而不是数据任务;
使用不使用完成块的下载/上传任务工厂方法(您必须实现委托方法);
让应用委托回复NSURLSession
,抓取handleEventsForBackgroundURLSession
;以及
在会话委托中实施completionHandler
,当您完成所有处理后,会委托URLSessionDidFinishEventsForBackgroundURLSession:
。
还有其他技术可用于执行后台请求,但这些是iOS7的两个主要特定后台网络。您还没有告诉我们您正在使用哪些,也没有向我们展示足够的代码来诊断出现了什么问题。