即使用户强行退出iOS目标C中的应用,如何继续在后台下载新图像?

时间:2016-07-05 05:05:13

标签: ios objective-c download background afnetworking

我想在300左右下载许多图像,并在UI中显示。

我有两个问题:

  1. 如果应用程序位于前台,并假设用户将其发送到后台模式(通过单击主页按钮),那么如何确保下载继续?

  2. 如果用户强制退出应用程序(双击主页按钮并从应用程序切换器轻扫应用程序),那么如何确保应用程序下载图像?

  3. 我一直在阅读有关背景的东西。很少有人说在2.情况下下载无法继续。

    以下是我提到的链接:

    http://www.appcoda.com/ios7-background-fetch-programming/ http://www.appcoda.com/background-transfer-service-ios7/ iOS Background downloads when the app is not active

    我没有得到正确的方法来下载前景中的图像,后台/暂停,用户强制退出应用程序。我正在使用AFNetworking进行网络服务呼叫。

    以下是我的代码:

    我的图片详细信息就像上传到亚马逊的.json文件中的网址一样。要下载我做的文件,

    [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://someurl/imageFile.json"]];
    

    从这个文件中我读了图像的网址,并将它们与图像细节一起下载。这是一个很大的过程。我该如何处理?请帮忙..

1 个答案:

答案 0 :(得分:2)

您的1个问题的解决方案如下:

  

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

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
NSURLSessionConfiguration *sessionConfig;
float timeout = 5 * 60.0f;

BOOL iOS8OrNew = [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0;
if (iOS8OrNew) {
    sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
request.timeoutInterval = timeout;
}
else {
    sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
sessionConfig.timeoutIntervalForRequest = timeout;
}

sessionConfig.HTTPMaximumConnectionsPerHost = 10;
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:sessionConfig];

 NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request];


[manager setDidFinishEventsForBackgroundURLSessionBlock:^(NSURLSession * _Nonnull session) {
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if (appDelegate.backgroundSessionCompletionHandler) {
        void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler;
        appDelegate.backgroundSessionCompletionHandler = nil;
        completionHandler();
    }
    NSLog(@"All tasks are finished");
}];

在AppDelegate中添加以下代码:

 - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
  completionHandler:(void (^)())completionHandler {
   self.backgroundSessionCompletionHandler = completionHandler;

   //add notification
   [self presentNotification];
}

-(void)presentNotification{
    UILocalNotification* localNotification = [[UILocalNotification alloc] init];
    localNotification.alertBody = @"Download Complete!";
    localNotification.alertAction = @"Background Transfer Download!";

    //On sound
    localNotification.soundName = UILocalNotificationDefaultSoundName;

    //increase the badge number of application plus 1
    localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;

    [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
}

对于您的2解决方案

  

如果系统杀死您的应用并且您的后台会话具有有效下载,则您的下载将继续,系统将在下载完成后启动您的应用。但是,如果用户强制退出您的应用,则会取消所有任务。