iOS: длительная задача

Это пример с сайта developer.apple.com.

Задачи конечной продолжительности
Запуск фоновой задачи во время выхода

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task, preferably in chunks.

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

Я хочу реализовать Длительную задачу, а не "Конечную длину". Я не нашел ни одного примера, написанного с Objective-C для текущей версии SDK. Могу ли я запустить его, скажем, при запуске приложения и запускать его постоянно, независимо от того, находится ли приложение на переднем плане или в фоновом режиме? Как я могу это сделать?

Я разработчик, ориентированный на реакцию, и я только начал изучать Objective-C. Поэтому мне может понадобиться простой пример для подражания. Я уже реализовал экземпляр моста для Cocoa Touch Class, он отлично работает. Все, что мне нужно, это запустить Long-Running Task в этом классе. Мне это нужно для BLE, но для простоты я бы сказал, давайте использовать отслеживание местоположения, так как его проще и быстрее проверить.

Моя LongRunningTask.m:

#import "LongRunningTask.h"

@implementation LongRunningTask

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(start:(RCTResponseSenderBlock)callback)
{
  // start the Long-Running Task here
  callback(@[@"done"]);
}

Я не понимаю, как определяется долговременная задача? Кажется, что нет определенного метода или какого-либо маркера, который бы объявил задачу долго выполняющейся. Итак, технически, если я получаю разрешение от пользователя на запуск долговременной задачи определенного типа, я могу непрерывно запускать любой код, который захочу, в пределах applicationDidEnterBackground? Даже если это не имеет ничего общего с моим разрешением?

И единственный фактор, влияющий на то, будет ли эта задача завершена через 10 минут, — это есть у меня разрешение или нет?

Спасибо!


person stkvtflw    schedule 07.03.2017    source источник


Ответы (1)


Поскольку термин Длительная задача означает задачу, которая активна до тех пор, пока приложение не будет уничтожено, я приведу простой пример LocationManager

Когда вы настраиваете свое приложение для получения обновлений местоположения и инициализируете LocationManager, приложение подвергается получению обновлений местоположения, пока вы не остановите обновления на переднем плане, то же самое и в случае с BLE.

Смотрите примеры,

_locationManager=[[CLLocationManager alloc] init];
_locationManager.delegate=self;
 if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [_locationManager requestWhenInUseAuthorization];
        [_locationManager requestAlwaysAuthorization];
 }
[_locationManager startUpdatingLocation];

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

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations

То же самое происходит с BLE.

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

введите здесь описание изображения

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

Надежда выше очищает ваши сомнения.

Ваше здоровье.

person iphonic    schedule 07.03.2017
comment
Итак, любой процесс становится Long-Running-Task, если у него есть разрешения в Capabilities? Например. если у меня где-то есть процесс сканирования BLE, он будет продолжать работать, когда приложение переходит в фоновый режим, если у меня включены аксессуары Use Bluetooth LE в «Возможности» и разрешение от пользователя? И нет ли каких-то конкретных методов или маркеров, которые отличают Long-Running Task от еще одного процесса (или функции, или как вы это называете в Objective-c)? - person stkvtflw; 10.03.2017
comment
Да, нет ничего конкретного для выполнения перечисленных длительных задач, но ими можно управлять с помощью указанных выше настроек. - person iphonic; 10.03.2017
comment
омг... это была недостающая головоломка в моей голове. Это абсолютно непонятно из документов Apple, потому что сначала они объясняют задачи конечной длины, что немного сложнее, а затем описывают длительные задачи ниже, так что похоже, что есть какая-то логическая связь... Спасибо! - person stkvtflw; 10.03.2017
comment
@stkvtflw Вы должны удалить stackoverflow.com/questions/42723116/ я думаю, это тот же вопрос. - person iphonic; 10.03.2017