Не вдається endBackgroundTask: не існує жодного фонового завдання з ідентифікатором, або, можливо, воно вже завершено


78

Я використовую фонове завдання для запуску таймера у фоновому режимі для оновлення місцезнаходження користувача. Це оголошено як:

UIBackgroundTaskIdentifier bgTask;

у файлі заголовка та ініціалізується як:

bgTask = UIBackgroundTaskInvalid;

Але все-таки я отримую таке повідомлення в gdb:

Не вдається endBackgroundTask: не існує жодного фонового завдання з ідентифікатором 23dc, або, можливо, воно вже завершено. Перерва в UIApplicationEndBackgroundTaskError () для налагодження.

Чому? І як я можу це вирішити?


Відповіді:


95

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

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


1
Я бачу те саме питання. Не впевнений, чи справді це проблема iOS 13 чи ні. Цінуємо, якщо ви могли б розмістити свій додаток Single View десь для відтворення. Дякую.
beshio

7
Повідомлення я почав отримувати після того, як додав код, який включає за замовчуванням центр сповіщень та користувача. Я отримую повідомлення, коли виходжу з програми.
hashemi

7
Отримайте таку ж проблему на iOS 13. Я використовую фоновий режим для AVAudioPlayer, він добре працює на iOS 12.
ChuckZHB

1
Також мій додаток використовує AVAudioPlayer у фоновому режимі, але це попередження дається з порожнім новим проектом. @beshio, якщо ви хочете спробувати відкрити XCode 11, Файл -> Новий проект -> Додаток Single View, запустіть, і ви знайдете його
Франческо Чераволо

6
Я отримую те саме випуск на iOS 13. Я використовую фреймворк BackgroundTasks. Я показую, коли мій додаток увійшов у фоновому режимі.
Гурдіндер Сінгх,

32

У Xcode перейдіть до навігатора точки зупинку (Перегляд> Навігатори> Показати навігатор точки зупинку), потім натисніть кнопку + внизу ліворуч і виберіть Додати символічну точку зупинки та введіть “UIApplicationEndBackgroundTaskError” як символ.


1
Це привело мене в потрібну область. Дякую. Але це вказувало на обмін повідомленнями google firebase, щоб нічого не можна було виправити безпосередньо в додатку.
Micah Montoya

5
Так. У мене була та ж проблема, система обміну повідомленнями Google Firebase. iOS 13.x має багато проблем, і всі програми стикаються з випадковими фоновими збоями.
Салех Султан

5
Для мене це зупинилося на UIKitCore, тож схоже на помилку Apple
Іслам Q.

@IslamQ ви коли-небудь вирішували це? У мене точно така ж проблема. Точка зупинки зупиняється на UIKitCore.
thecloud_of_unknowing

@thecloud_of_unknowing ні, я поки що це проігнорував
Іслам Q.

11

Вам потрібно встановити bgTask = UIBackgroundTaskInvalid

за два моменти

  1. В обробнику закінчення терміну дії.
  2. Після закінчення свого завдання.

Я вважаю, що вам не вистачає жодного з цих двох моментів, і саме тому ви отримуєте цю помилку.

Див. Приклад яблучного коду:

- (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/documentation/backgroundtasks/bgtask?language=objc


Це не дозволяє мені це робити, там сказано: Явне перетворення "UIBackgroundTaskIdentifier" (він же "без підпису довгий") у "BGAppRefreshTask * 'заборонено з ARC
Джексон

6

Відтворено, ось і весь мій додаток:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
    {
        return true
    }
}

І коли я беру це на другий план, я отримую те саме повідомлення. Ніякої розкадровки чи будь-якого іншого шуму.


5

Чи використовуєте ви оновлення місцезнаходження у фоновому режимі?

Якщо так, додайте наведений нижче код під час отримання авторизації місцезнаходження від користувача - Apple змінила значення за замовчуванням allowsBackgroundLocationUpdatesна NOз iOS 9 і далі.

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

Переконайтеся, що ви активували «Оновлення місцезнаходження» для фонових режимів у рамках вашого проекту «Підписання та можливості». Інакше він розбиється.


3

Використовуючи Swift 5 - IOS 13.2.2 - Xcode 11.2 beta 2 (11B44) мені вдалося позбутися цієї помилки,

  • увімкнення push-сповіщень у можливостях програми

  • Імпортуйте фреймворк UserNotifications

  • потім додайте цей код в

додаток func (_ додаток: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Будь-який]?) -> Bool {

  let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in

            // If granted comes true you can enabled features based on authorization.
            guard granted else { return }
            DispatchQueue.main.async {
                application.registerForRemoteNotifications()
            }
        }

3
не вирішив проблему на моєму реальному пристрої з iOS 13.2.2 та Xcode 11.2.1
Адам Смака

також не вирішив проблему на iOS 13.3.1, swift 5, Xcode 11.3.1
user3069232

Ваші кроки 2 та 3 не є необхідними, якщо ви реєструєтесь лише для безшумного (фонового) сповіщення.
LukeSideWalker

1

Щодо повідомлення "Не вдається закінчити BackgroundTask: не існує жодного фонового завдання з ідентифікатором ...", як сказали інші, це може бути червоний оселедець, не пов'язаний з тим, що ви робите.

Щодо вашої мети - намагатися періодично отримувати місцезнаходження користувача, а не намагатися підтримувати роботу програми у фоновому режимі за допомогою таймера, натомість вам слід скористатися різними послугами для оновлення місцезнаходження користувача у фоновому режимі , наприклад службою визначення місцезнаходжень відвідувачів. або серйозна зміна служби розташування . За допомогою цих служб ОС може активувати ваш додаток, коли місцезнаходження користувача змінюється.


Я також отримую це попередження, і, наскільки мені відомо, у мене немає жодних фонових завдань за допомогою мого простого додатка для записів. Наприклад, коли користувач натискає веб-адресу і відкривається сафарі, я отримую попередження. Які червоні оселедці мені слід шукати. Або деякі ресурси, які я можу переглянути, щоб дізнатись більше?
Mox

Я не знаю жодного вичерпного списку, оскільки вони різноманітні. І коли ви починаєте користуватися сторонніми бібліотеками, ситуація погіршується. Ведення списку, мабуть, було б вправою марно. Лол. Для мене, як правило, я просто шукаю Stack Overflow або загальну веб-пошукову систему для будь-якого конкретного повідомлення консолі, і часто зустрічаю дискусії, не схожі на це. Ви швидко обхопите руки, які не пов'язані з вашим власним кодом. А для мого лісозаготівля я використовую уніфікований журнал OSLogіз рядком “категорія”, який я потім можу легко відфільтрувати на консолі, відокремлюючи пшеницю від полови.
Роб

1

У мене була та сама проблема, і я з’ясував причину та спосіб вирішення проблеми!

Apple вирішила цю проблему в iOS 13.4 GM, хоча у мене є обхідний шлях для попередніх версій.

Хоча вам слід охопити використання сцен, коли ваш додаток запущено під iOS 13 та новішими версіями, ви можете повністю відмовитись, поки ви все ще підтримуєте iOS 12 або старішу версію.

  1. Спочатку повністю видаліть Application Scene Manifestзапис “ ” із Info.plist.
  2. Якщо є клас делегата сцени, видаліть його.
  3. Якщо в делегаті програми є якісь методи, пов’язані зі сценою, видаліть ці методи.
  4. Якщо його немає, додайте властивість var window: UIWindow?до делегата програми.
  5. Тепер ваша програма повинна використовувати лише делегат програми, а під iOS 13 вона повинна мати той самий життєвий цикл, що і iOS 12.

Щасливого кодування!


0

Я думаю, що є помилка, яка працює з xcode 11.2 та рамкою swiftUI, тому що я завжди отримую

"Не вдається закінчити BackgroundTask: не існує жодного фонового завдання з ідентифікатором ..."

повідомлення, навіть якщо мій додаток не працює з фоновими завданнями! Хороша новина полягає в тому, що це зупиняє мій додаток лише під час запуску з xcode; натисніть кнопку "продовжити виконання програми", і програма знову запуститься.


Ви говорите не про збій, а про точку зупинки, коли програма зупиняється для налагодження. Швидше за все, ви встановили точку зупинки для UIApplicationEndBackgroundTaskError.
Starsky

Ви праві, це не збій, але я не встановив точку зупинки.
абанет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.