фоновые загрузки iOS, когда приложение неактивно
когда мое приложение первоначально загружается, пользователю необходимо загрузить большой файл, что-то вроде 200 МБ (верхний предел). Я определенно не могу ожидать, что пользователь будет держать приложение открытым, пока этот файл не будет загружен. Поэтому он/она может закрыть приложение и приложение будет идти в фоновом режиме.
Как я могу продолжить загрузку файла в этом сценарии? Возможно ли это в iOS?
7 ответов
можно запустить фоновую задачу, когда вы начать загрузку:
приложения, которые переходят в фоновый режим может запросить дополнительную количество времени, чтобы закончить любые важные задачи в последнюю минуту.
выполнение задачи конечной длины в фоновом режиме
однако такая задача ограничена неопределенным количеством времени выполнения Системой. Однако загрузка файла 200Mb может быть слишком большой задачей в этом случай.
добавить ниже в - (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
в одном из моих приложений я загружал огромное количество данных. Я определенно не могу ожидать, что пользователь сохранит приложение на переднем плане, пока данные не будут загружены. Я просто использую следующий код для загрузки данных, пока приложение находится в фоновом режиме. Его работа правильно : -)
Пожалуйста, выполните следующие действия:
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);
вы можете использовать NSURLSession, представленный в iOS 7.0 и более поздних версиях, чтобы продолжить загрузку / загрузку файла, даже если приложение приостановлено.
класс NSURLSession и связанные классы предоставляют API для загрузить контент. Этот API предоставляет богатый набор методов делегата для поддержки аутентификации и дает вашему приложению возможность выполнять фоновые загрузки, если приложение не запущено или усвн, пока ваше приложение приостановлено.
и
фоновые сеансы позволяют выполнять загрузку и загрузку контента в фоновом режиме, пока приложение не запущено. Вы можете создать настройка фонового сеанса путем вызова backgroundSessionConfiguration: метод Класс NSURLSessionConfiguration.
классный учебник по использованию NSURLSession в этом ссылке.
AFNetworking позволяет выполнять тяжелую работу в фоновом режиме.
AFNetworking библиотека-отличное сочетание NSURLConnection и NSOperationQueue.Эта библиотека используется для асинхронной загрузки в фоновом режиме, не влияя на другие приложения.
AFNetworking позволяет обрабатывать загрузку с ExpirationHandle т. е. если в любом случае во время загрузки соединение потеряно, оно будет снова подключить к нему.
Источник Библиотека на AFNetworking
Источник AFNetworking работает в фоновом режиме
Ссылка На Apple Яблоко
фоновое выполнение и многозадачность Яблоко
#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");
}
}
}
вы можете узнать больше из этой скольжения.
Я просто делаю некоторые простые полезные изменения из фрагмента этого слайда.
Надеюсь, это поможет.
создайте приложение iOS для газетного киоска; не стандартное приложение iOS.
стандарт для iOS МКИ:
- не удается загрузить данные при закрытии.
- может загружать данные в ограниченное время при нажатии на фон.
- недостаточно времени для загрузки 200 Мб.
приложения газетного киоска имеют дополнительную привилегию времени для загрузки при закрытии или inBackground. Раз в каждые 24 часа, они имеют привилегию ответить a remoteContentReady делегировать вызов.
создание приложения газетного киоска ничем не отличается от создания стандартного приложения iOS. Вы просто пометите его как приложение newStand.
тогда у вас будет привилегия запускать код, который находится внутри делегирования remoteContentReady.
чтобы получить сигнал remoteContentReady, вы должны отправить сигнал с вашего сервера (c#, php, bla bla).
Не для каждого приложения iOS. Что-то вроде remoteNotification сигнал. Для этого может потребоваться сертификация ssl для вашего веб-сайта.
С Наилучшими Пожеланиями