Подтвердить что ты не робот

Не удается endBackgroundTask: фоновая задача не существует с идентификатором, или она, возможно, уже была завершена

Я использую фоновую задачу для запуска таймера в фоновом режиме для обновления местоположения пользователя. Он объявлен как:

UIBackgroundTaskIdentifier bgTask;

в файле заголовка и инициализируется как:

bgTask = UIBackgroundTaskInvalid;

Но все же я получаю это сообщение в gdb:

Невозможно endBackgroundTask: не существует фоновой задачи с идентификатором 23dc или она может быть уже завершена. Перерыв в UIApplicationEndBackgroundTaskError() для отладки.

Почему? И как я могу это решить?

4b9b3361

Ответ 1

Вам нужно установить bgTask = UIBackgroundTaskInvalid

через два момента

  • В обработчике срока действия.
  • После завершения вашей задачи.

Я считаю, что вам не хватает одного из этих двух моментов, и именно поэтому вы получаете эту ошибку.

См. пример кода примера Apple:

- (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;
    });
}

ссылка: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Ответ 2

Вы используете обновление местоположения в фоновом режиме?

Если да, добавьте приведенный ниже код во время получения авторизации местоположения от пользователя - Apple изменила значение по умолчанию для allowsBackgroundLocationUpdates на NO с iOS 9 и далее.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    locationManager.allowsBackgroundLocationUpdates = YES;
}

Убедитесь, что вы активировали "Обновления местоположения" для фоновых режимов в своем проекте "Подписание и усиление". Возможности. В противном случае он потерпит крах.

Ответ 3

В Xcode переключитесь на навигатор точек останова ("Просмотр"> "Навигаторы"> "Показать навигатор точек останова"), затем нажмите кнопку "+" в левом нижнем углу и выберите "Добавить символическую точку останова" и введите "UIApplicationEndBackgroundTaskError" в качестве символа.

Ответ 4

Я теряю много дней в поисках фрагмента кода или инфраструктуры, который вызывал это предупреждение в консоли отладки. Не удается завершить BackgroundTask: не существует фоновой задачи с идентификатором 2 (0x2), или она может быть уже завершена. Разрыв в UIApplicationEndBackgroundTaskError() для отладки.

Наконец-то я создал пустой проект Single View App. Только код, сгенерированный Xcode, я запускаю приложение на симуляторе, помещаю его в фоновый режим и вижу то же самое предупреждение. Так что я могу сказать, что это проблема iOS 13. Я надеюсь, что Apple исправит это быстро, потому что в Crashlytics я обнаружил некоторый сбой в моем приложении, вызванный этим.

Ответ 5

Итак, bgTask работает следующим образом:

bgTask = [application beginBackgroundTaskWithName:kBGTaskName expirationHandler:^{}

Выполняйте свою работу внутри блока.
Вы также получите ошибку Can not endBackgroundtask, если вы поместите контрольную точку внутри блока, выполните некоторую работу и дайте ей запустить, как говорят через 10 секунд или около того. Вместо точки останова установите NSLog и проверьте. Он должен работать нормально.