应用程序未处于活动状态时会下载iOS背景

时间:2012-01-14 09:42:50

标签: objective-c ios ios5 background download

当我的应用程序最初下载时,用户需要下载200MB(上限)的大文件。我绝对不能指望用户在下载此文件之前保持应用程序处于打开状态。所以他/她可能关闭app&该应用程序将进入后台。

如何在此方案中继续下载文件?这在iOS中是否可行?

8 个答案:

答案 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继续上传/下载文件。

Apple documentation

  

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

图书馆来源

参考来源 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应用程序:

  • 关闭时无法下载数据。
  • 可以在推送到后台的有限时间内下载数据。
  • 没有足够的时间下载200mb。

NewsStand应用程序在关闭或inBackground时有额外的时间权限可供下载。 每24小时一次,他们就有权回答remoteContentReady委托调用。

构建newsStand应用程序与构建标准iOS应用程序没什么不同。您只需将其标记为newStand应用程序。

然后您将有权运行remoteContentReady委托中的代码。

要接收remoteContentReady信号,您必须从服务器端发送信号(c#,php,bla bla)。

不是每个iOS应用都有。类似于remoteNotification信号的东西。您可能需要为您的网站获得ssl认证才能完成此任务。

最好的问候

答案 7 :(得分:0)

不幸的是,这里的大多数答案都已在2020年过时了! iOS 13将-beginBackgroundTaskWithExpirationHandler:的时间从几分钟缩短为几秒钟,并且由于负面影响而终止了该应用程序。我还考虑在下载期间禁用自动屏幕保护程序模式。可以在这里找到更多信息: