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

Sri*_*aju 21 background objective-c download ios ios5

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

如何在此方案中继续下载文件?这在iOS中甚至可能吗?

Sau*_*abh 39

在下面添加你的 - (void)applicationDidEnterBackground:(UIApplication *)application

UIApplication  *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
        [app endBackgroundTask:bgTask]; 
}];
Run Code Online (Sandbox Code Playgroud)

你很高兴...我在我的一个已发布的下载管理器应用程序中有这个

这将工作得很好.你也可以查看你有多少时间,因为苹果只能启用10分钟的后台任务.使用:

NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining];
NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug
Run Code Online (Sandbox Code Playgroud)

  • 如果应用程序在后台运行超过10分钟,iOS将终止您的应用程序.因此,如果用户网络很慢,它将无法正常工作. (11认同)
  • 是的..苹果谈到时间限制..但我可以下载一个大小为800 MB的文件与上面的代码..并且该应用程序在应用程序商店.. (10认同)

Mar*_*thu 7

即使应用程序被暂停,您也可以使用iOS 7.0及更高版本中引入的NSURLSession继续上传/下载文件.

Apple文档

NSURLSession类和相关类提供用于下载内容的API.此API提供了一组丰富的委托方法,用于支持身份验证,并使您的应用能够在您的应用未运行时执行后台下载,或者在iOS中,当您的应用暂停时执行后台下载.

通过后台会话,您可以在应用未运行时在后台执行内容的上传和下载.您可以通过在NSURLSessionConfiguration类上调用backgroundSessionConfiguration:方法来创建后台会话配置 .

这个链接使用NSURLSession的一个很酷的教程.


小智 6

开始下载时可以启动后台任务:

转换到后台的应用可以请求额外的时间来完成任何重要的最后一分钟任务.

在后台执行有限长任务

但是,这样的任务仅限于系统未定义的执行时间.但是,在这种情况下,200Mb文件下载可能是一个太大的任务.

  • 这不再正确了.在ARC for ASIHttp上,您可以使用使用非ARC环境编译的静态库. (2认同)

Him*_*jan 5

在我的一个应用程序中,我正在加载大量数据.在下载数据之前,我绝对不能指望用户将应用程序保持在前台.我只是使用以下代码在应用程序处于后台时下载数据.它的工作正常:-)
请按以下步骤操作:

1)在ViewController的头文件中使用以下行

   @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
Run Code Online (Sandbox Code Playgroud)

在.m文件中合成它.

2)在ViewDidLoad中分配UIBackgroundTaskIdentifier,如:

   self.backgroundTask = UIBackgroundTaskInvalid;
Run Code Online (Sandbox Code Playgroud)

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;
    });
Run Code Online (Sandbox Code Playgroud)

4)如果要检查后台下载数据的剩余时间,请在applicationDidEnterBackground中包含以下行:AppDelegate的(UIApplication*)应用程序委托方法:

      NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining);
Run Code Online (Sandbox Code Playgroud)