iOS Background загружается, когда приложение не активно - PullRequest
20 голосов
/ 14 января 2012

Когда мое приложение изначально загружено, пользователю необходимо загрузить большой файл размером около 200 МБ (верхний предел).Я определенно не могу ожидать, что пользователь будет держать приложение открытым, пока этот файл не будет загружен.Таким образом, он / она может закрыть приложение, и приложение перейдет в фоновый режим.

Как продолжить загрузку файла в этом сценарии?Это вообще возможно в iOS?

Ответы [ 7 ]

39 голосов
/ 14 января 2012

Добавьте ниже в вашем - (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
7 голосов
/ 21 апреля 2016

Вы можете использовать NSURLSession, представленный в iOS 7.0 и более поздних версиях, для продолжения загрузки / выгрузки файла, даже когда приложение приостановлено.

Документация Apple

Класс NSURLSession и связанные классы предоставляют API для загрузки контента.Этот API предоставляет богатый набор методов делегатов для поддержки аутентификации и дает вашему приложению возможность выполнять фоновые загрузки, когда ваше приложение не запущено или, в iOS, когда ваше приложение приостановлено.

И

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

Классное руководство по использованию NSURLSession в этой ссылке .

6 голосов
/ 14 января 2012

Можно запустить фоновую задачу, когда вы начнете загрузку:

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

Выполнение задачи конечной длины в фоновом режиме

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

5 голосов
/ 27 сентября 2013

В одном из моих приложений я загружал огромное количество данных. Я определенно не могу ожидать, что пользователь будет держать приложение на переднем плане, пока данные не будут загружены. Я просто использую следующий код для загрузки данных, пока приложение находится в фоновом режиме. Работает нормально: -)
Пожалуйста, выполните следующие шаги:

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);
3 голосов
/ 26 сентября 2013

AFNetworking позволяет выполнять тяжелые операции в фоновом режиме. AFNetworking Библиотека представляет собой отличную комбинацию NSURLConnection и NSOperationQueue. Эта библиотека используется для асинхронной загрузки в фоновом режиме, не затрагивая другое приложение. AFNetworking позволяет обрабатывать загрузку с помощью ExpirationHandle, т. Е. Если во время загрузки соединение теряется, оно снова подключается к нему.

Источник библиотеки для AFNetworking

Справочный источник AFNetworking работает в фоновом режиме

Ссылка Apple Apple

Фоновое выполнение и многозадачность Apple

0 голосов
/ 26 июня 2015

Создание новостного приложения для iOS; не стандартное приложение для iOS.

Стандартные приложения для iOS:

  • не может загрузить данные в закрытом состоянии.
  • может загружать данные в течение ограниченного времени при переходе в фоновый режим.
  • Недостаточно времени для загрузки 200 МБ.

Приложения NewsStand имеют дополнительное время для загрузки, когда они закрыты или находятся в фоновом режиме. Раз в 24 часа они имеют право отвечать на вызов делегата remoteContentReady.

Создание приложения newsStand ничем не отличается от создания стандартного приложения iOS. Вы просто отметите его как приложение NewStand.

Тогда у вас будет привилегия для запуска кода, который находится внутри делегирования remoteContentReady.

Чтобы получить сигнал remoteContentReady, вы должны отправить сигнал с вашего сервера (c #, php, bla bla).

Не для каждого приложения iOS. Что-то вроде сигнала удаленного оповещения. Для этого вам может потребоваться сертификация ssl для вашего сайта.

С наилучшими пожеланиями

0 голосов
/ 13 июня 2014
#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");
        }
    }
}

Вы можете узнать больше из этого слайда .
Я просто делаю несколько простых полезных модификаций из фрагмента этого слайда. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...