Фоновая загрузка iOS, когда приложение неактивно
Когда мое приложение загружено изначально, пользователю необходимо загрузить большой файл примерно 200 МБ (верхний предел). Я определенно не могу ожидать, что пользователь будет поддерживать приложение открытым до тех пор, пока этот файл не будет загружен. Таким образом, он может закрыть приложение, и приложение войдет в фон.
Как я могу продолжить загрузку файла в этом сценарии? Возможно ли это в iOS?
Ответы
Ответ 1
При запуске загрузки можно запустить фоновое задание:
Приложения, которые переходят на фоновый режим, могут запросить дополнительные количество времени для завершения любых важных задач в последнюю минуту.
Выполнение задачи конечной длины в фоновом режиме
Однако такая задача ограничивается системой времени undefined времени выполнения. Однако загрузка файла в 200 Мб может быть слишком большой задачей в этом случае.
Ответ 2
Добавьте ниже в - (void)applicationDidEnterBackground:(UIApplication *)application
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
и вам хорошо идти... У меня есть это в одном из моих опубликованных приложений диспетчера приложений
Это будет работать нормально. Вы также можете проверить, сколько времени у вас есть, так как Apple разрешает только 10-минутные фоновые задания. Использование:
NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining];
NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug
Ответ 3
Вы можете использовать NSURLSession, представленную в iOS 7.0 и более поздних версиях, чтобы продолжить загрузку/загрузку файла, даже когда приложение приостановлено.
Документация Apple
Класс NSURLSession и связанные классы предоставляют API для загрузка контента. Этот API предоставляет богатый набор методов делегатов для поддержки аутентификации и дает вашему приложению возможность выполнять фоновое скачивание, когда ваше приложение не запущено, или в iOS, пока ваше приложение приостановлено.
и
Фоновые сеансы позволяют выполнять загрузку и загрузку содержимого в фоновом режиме, пока ваше приложение не работает. Вы можете создать конфигурации фонового сеанса, вызвав backgroundSessionConfiguration: метод на Класс NSURLSessionConfiguration.
Прохладный учебник по использованию NSURLSession на этой ссылке.
Ответ 4
В одном из моих приложений я загружал огромное количество данных. Я определенно не могу ожидать, что пользователь сохранит приложение на переднем плане, пока данные не будут загружены. Я просто использую следующий код, чтобы загрузить данные, когда приложение находится в фоновом режиме. Его работа правильно:-)
Прочтите следующие шаги:
1) используйте следующую строку в файле заголовка ViewController
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
синтезировать его в .m файле.
2) в ViewDidLoad назначить UIBackgroundTaskIdentifier, например:
self.backgroundTask = UIBackgroundTaskInvalid;
3) Используйте следующую строку кода, здесь я просто поддерживаю метод getDataFromServer внутри beginBackgroundTaskWithExpirationHandler: block.
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: (UIApplication *) метод делегирования приложения приложения AppDelegate:
NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining);
Ответ 5
AFNetworking позволяет выполнять тяжелую работу в фоновом режиме.
AFNetworking Библиотека - отличная комбинация NSURLConnection и NSOperationQueue. Эта библиотека используется для асинхронной загрузки в фоновом режиме, не затрагивая другое приложение.
AFNetworking позволяет обрабатывать загрузку с помощью ExpirationHandle, то есть, если во время загрузки соединение будет потеряно, оно снова будет подключитесь к нему.
Источник библиотеки для AFNetworking
Источник ссылки Работа AFNetworking в фоновом режиме
Ссылка на Apple Reference Apple
Выполнение фона и многозадачность Apple
Ответ 6
#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.
Я просто делаю некоторые полезные полезные изменения из фрагмента этого слайда.
Надеюсь, это поможет.
Ответ 7
Создайте приложение newsStand iOS; не стандартное приложение iOS.
Стандартные приложения iOS:
- Невозможно загрузить данные при закрытии.
- может загружать данные в течение ограниченного времени при нажатии на фон.
- Не хватает времени для загрузки 200 МБ.
Приложения NewsStand имеют дополнительную временную привилегию для загрузки при закрытии или inBackground.
Через каждые 24 часа у них есть привилегия отвечать на вызов делегата remoteContentReady.
Построение приложения newsStand ничем не отличается от создания стандартного приложения iOS. Вы просто отметите его как приложение newStand.
Тогда у вас будет привилегия запускать код, который находится внутри делегирования remoteContentReady.
Чтобы получить сигнал remoteContentReady, вам необходимо отправить сигнал с вашего сервера (С#, php, bla bla).
Не для каждого приложения для iOS. Что-то вроде сигнала remoteNotification. Для этого вам может понадобиться сертификация ssl для вашего сайта.
С наилучшими пожеланиями