当我的应用程序最初下载时,用户需要下载200MB(上限)的大文件。我绝对不能指望用户在下载此文件之前保持应用程序处于打开状态。所以他/她可能关闭app&该应用程序将进入后台。
如何在此方案中继续下载文件?这在iOS中是否可行?
答案 0 :(得分:39)
在- (void)applicationDidEnterBackground:(UIApplication *)application
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
你很高兴...我在我发布的一个下载管理器应用程序
中有这个这样可以正常工作。你也可以查看你有多少时间,因为苹果只能启用10分钟的后台任务。使用:
NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining];
NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug
答案 1 :(得分:7)
即使应用程序被暂停,您也可以使用iOS 7.0及更高版本中引入的NSURLSession继续上传/下载文件。
NSURLSession类和相关类为其提供API 下载内容。此API提供了一组丰富的委托方法 用于支持身份验证并为您的应用程序提供支持 在您的应用未运行时执行后台下载,或者在iOS中执行后台下载 当你的应用被暂停时。
和
后台会话可让您执行内容的上传和下载 您的应用未运行时在后台运行。你可以创建一个 通过调用后台会话配置 backgroundSessionConfiguration :上的方法 NSURLSessionConfiguration类。
在此link使用NSURLSession的酷炫教程。
答案 2 :(得分:6)
开始下载时可以启动后台任务:
正在转换为后台的应用可以申请额外费用 完成任何重要的最后一分钟任务的时间。
Executing a Finite-Length Task in the Background
但是,此类任务仅限于系统未定义的执行时间。但是,在这种情况下,200Mb文件下载可能过于庞大。
答案 3 :(得分:5)
在我的一个应用中,我正在加载大量数据。在下载数据之前,我绝对不能指望用户将应用程序保持在前台。我只是使用以下代码在应用程序处于后台时下载数据。它的工作正常:-)
请完成以下步骤:
1)在ViewController的头文件中使用以下行
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
在.m文件中合成它。
2)在ViewDidLoad中分配UIBackgroundTaskIdentifier,如:
self.backgroundTask = UIBackgroundTaskInvalid;
3)使用以下代码行,这里我只是在beginBackgroundTaskWithExpirationHandler:block中保留getDataFromServer方法。
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}];
/* Here your downloading Code, let say getDataFromServer method */
[self getDataFromServer]; // Its dummy method
/* Your downloading Code End Here */
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
});
4)如果要检查后台下载数据的剩余时间,请在applicationDidEnterBackground中包含以下行:AppDelegate的(UIApplication *)应用程序委托方法:
NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining);
答案 4 :(得分:3)
AFNetworking 允许您在后台执行大量操作。
AFNetworking 库是NSURLConnection和NSOperationQueue的完美结合。使用此库在后台进行异步下载而不影响其他应用程序。
AFNetworking 允许您使用ExpirationHandle处理下载,即无论如何在下载过程中连接丢失,它将再次出现连接到它。
图书馆来源
参考来源 AFNetworking works in Background
Apple参考链接 Apple
后台执行和多任务处理Apple
答案 5 :(得分:0)
#pragma mark - View Loading handling
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
}
#pragma mark - Background handling when application goes background
UIBackgroundTaskIdentifier background_task;
- (void)appDidEnterBackground:(NSNotification *)notification {
UIApplication *application = [UIApplication sharedApplication];
if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
NSLog(@"Multitasking Supported");
if (background_task == UIBackgroundTaskInvalid) {
background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
NSLog(@"Background task expiration\n");
//Clean up code. Tell the system that we are done.
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
}];
//To make the code block asynchronous
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//### background task starts
NSLog(@"Running in the background\n");
for(int cnt=0; cnt<10; cnt++) //while(TRUE)
{
NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
[NSThread sleepForTimeInterval:1]; //wait for 1 sec
}
//#### background task ends
//Clean up code. Tell the system that we are done.
NSLog(@"here you can do something before it really enters background");
[NSThread sleepForTimeInterval:1]; //wait for 1 sec
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
});
}
else
{
NSLog(@"Multitasking Not Supported");
}
}
}
您可以从slide了解更多信息 我只是从这张幻灯片的片段中做了一些简单有用的修改。 希望这会有所帮助。
答案 6 :(得分:0)
构建newsStand iOS应用程序;不是一个标准的iOS应用程序。
标准iOS应用程序:
NewsStand应用程序在关闭或inBackground时有额外的时间权限可供下载。 每24小时一次,他们就有权回答remoteContentReady委托调用。
构建newsStand应用程序与构建标准iOS应用程序没什么不同。您只需将其标记为newStand应用程序。
然后您将有权运行remoteContentReady委托中的代码。
要接收remoteContentReady信号,您必须从服务器端发送信号(c#,php,bla bla)。
不是每个iOS应用都有。类似于remoteNotification信号的东西。您可能需要为您的网站获得ssl认证才能完成此任务。
最好的问候
答案 7 :(得分:0)
不幸的是,这里的大多数答案都已在2020年过时了! iOS 13将-beginBackgroundTaskWithExpirationHandler:
的时间从几分钟缩短为几秒钟,并且由于负面影响而终止了该应用程序。我还考虑在下载期间禁用自动屏幕保护程序模式。可以在这里找到更多信息: