Как продолжать загружать новые изображения в фоновом режиме, даже если пользователь принудительно покидает приложение в iOS, цель C?

Я хочу загрузить много изображений около 300 и отобразить их в пользовательском интерфейсе.

У меня есть два вопроса:

Если приложение находится на переднем плане, и предполагается, что пользователь отправляет его в фоновый режим (нажав кнопку «Домой»), то как я могу обеспечить продолжение загрузки?

Если пользователь принудительно покидает приложение (дважды щелкните кнопку «Домой» и проведите по приложению с помощью переключателя приложений), то как я могу гарантировать, что приложение загрузит изображения?

Я много читал о фоновых материалах. Мало кто также говорит, что в 2. случае загрузка не может продолжаться.

Ниже приведены ссылки, на которые я ссылался:

http://www.appcoda.com/ios7-background-fetch-programming/ http://www.appcoda.com/background-transfer-service-ios7/ iOS Background загружается, когда приложение не активно

У меня нет правильного подхода к загрузке изображений на переднем плане, в фоновом режиме / приостановлено, пользовательская сила выходит из приложения. Я использую AFNetworking для звонков через веб-сервис.

Ниже мой код:

У меня есть детали изображения, такие как URL в файле .json, загруженном в Amazon. Чтобы скачать файл, который я делаю,

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

Из этого файла я читаю URL изображений и скачиваю их вместе с деталями изображений. Это большой процесс. Как мне справиться с этим? Пожалуйста помоги..

Ответы на вопрос(1)

Решение Вопроса

Решение для вашего 1 вопроса ниже:

Фоновые сеансы позволяют выполнять загрузку и выгрузку контента в фоновом режиме, пока ваше приложение не запущено. Вы можете создать фоновую конфигурацию сеанса, вызвав метод backgroundSessionConfiguration: для класса NSURLSessionConfiguration.

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 решения

Если система убивает ваше приложение, и ваш фоновый сеанс имеет активные загрузки, ваши загрузки будут продолжены, и система запустит ваше приложение после завершения загрузки. Однако, если пользователь принудительно покинет ваше приложение, все задачи будут отменены.

 Ekta Padaliya05 июл. 2016 г., 08:21
@Medha Это работает сейчас?
 Ekta Padaliya05 июл. 2016 г., 07:46
@Medha Пожалуйста, примите ответ, если он работает.
 Medha05 июл. 2016 г., 07:46
Я. Я читал это в Apple doc. Но, тем не менее, даже если пользователь выходит из приложения, загрузка в Android происходит. Я не знаю, почему эта функция не существует в iOS
 Ekta Padaliya05 июл. 2016 г., 13:23
@Medha Вы должны зайти в фон приложения и возобновить его снова.
 Ekta Padaliya05 июл. 2016 г., 07:55
@Medha Если вы устанавливаете фоновую задачу NSURLSession, загрузка выполняется ОС, а не вашим приложением. Ваше приложение может завершить работу / зависнуть как угодно, но загрузка не остановится.
 Medha05 июл. 2016 г., 13:13
Я попробовал код и просматривая другие сайты, касающиеся NSURLSession. Это работает. Но у меня есть другой вопрос. Если приложение работает в фоновом режиме, скажем, в течение 2 дней. Если я хочу загрузить что-то через день, как мне это сделать? Я имею в виду, как мне снова запустить код возобновления NSURLSession?
 Medha05 июл. 2016 г., 07:31
Большое спасибо .. Я попробую это .. Но как насчет второго случая? В iOS можно ли загружать материалы, даже если пользователь выходит из приложения из-за переключения приложений?
 Medha05 июл. 2016 г., 07:49
Тогда я должен загружать контент при отправке удаленных уведомлений? Потому что, если пользователь выходит из приложения, этот делегат всегда будет вызываться. Это правильный способ?

Ваш ответ на вопрос