EndBackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit Bezeichner oder sie wurde möglicherweise bereits beendet

77

Ich verwende die Hintergrundaufgabe, um den Timer im Hintergrund auszuführen und den Standort des Benutzers zu aktualisieren. Es ist deklariert als:

UIBackgroundTaskIdentifier bgTask;

in der Header-Datei und initialisiert als:

bgTask = UIBackgroundTaskInvalid;

Trotzdem bekomme ich diese Nachricht in der GDB:

EndBackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit der Kennung 23dc, oder sie wurde möglicherweise bereits beendet. Brechen Sie UIApplicationEndBackgroundTaskError () zum Debuggen ein.

Warum? Und wie kann ich das lösen?

Raj
quelle

Antworten:

95

Ich verliere viele Tage bei der Suche nach dem Code oder Framework, das diese Warnung verursacht hat, in der Debug-Konsole. BackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit der Kennung 2 (0x2) oder sie wurde möglicherweise bereits beendet. Brechen Sie UIApplicationEndBackgroundTaskError () zum Debuggen ein .

Schließlich habe ich ein leeres Projekt Single View App erstellt . Nur von Xcode generierter Code, ich starte die App auf dem Simulator, stelle sie in den Hintergrund und sehe die gleiche Warnung. Ich kann also sagen, dass es sich um ein iOS 13-Problem handelt. Ich hoffe, Apple wird das Problem schnell beheben, da ich in Crashlytics einen Absturz in meiner App gefunden habe, der dadurch verursacht wurde.

Francesco Ceravolo
quelle
1
Ich sehe das gleiche Problem. Ich bin mir nicht sicher, ob dies wirklich ein iOS 13-Problem ist oder nicht. Schätzen Sie, ob Sie Ihre Single View-App irgendwo zum Reproduzieren platzieren können. Vielen Dank.
Beshio
7
Ich habe die Nachricht erhalten, nachdem ich Code hinzugefügt habe, der Benachrichtigungscenter und Benutzerstandards enthält. Ich erhalte die Nachricht, wenn ich die App verlasse.
Haschi
7
Holen Sie sich das gleiche Problem auf iOS 13. Ich verwende den Hintergrundmodus für AVAudioPlayer, es funktioniert gut auf iOS 12.
ChuckZHB
1
Auch meine App verwendet AVAudioPlayer im Hintergrundmodus, aber diese Warnung wird bei einem leeren neuen Projekt ausgegeben. @beshio, wenn Sie versuchen möchten, XCode 11, Datei -> Neues Projekt -> Single View App zu öffnen, ausführen und Sie werden es finden
Francesco Ceravolo
6
Ich bekomme das gleiche Problem unter iOS 13. Ich verwende das BackgroundTasks-Framework. Ich zeige, wann meine App im Hintergrund eingegeben wurde.
Gurjinder Singh
32

Wechseln Sie in Xcode zum Haltepunktnavigator (Ansicht> Navigatoren> Haltepunktnavigator anzeigen), drücken Sie dann unten links die Taste +, wählen Sie Symbolischen Haltepunkt hinzufügen und geben Sie als Symbol „UIApplicationEndBackgroundTaskError“ ein.

Saleh Sultan
quelle
1
Das brachte mich in den richtigen Bereich. Vielen Dank. Aber es zeigte auf Google Firebase Messaging, also nichts, was direkt in der App behoben werden konnte.
Micah Montoya
5
Ja. Ich hatte das gleiche Problem, Google Firebase Messaging-System. iOS 13.x hat viele Probleme und alle Apps sind mit zufälligen Hintergrundabstürzen konfrontiert.
Saleh Sultan
5
Für mich hat es bei UIKitCore aufgehört, also sieht es aus wie Apple Bug
Islam Q.
@IslamQ hast du das jemals gelöst? Ich habe genau das gleiche Problem. Der Haltepunkt stoppt bei UIKitCore.
thecloud_of_unknowing
@thecloud_of_unknowing nein, ich habe es vorerst einfach ignoriert
Islam Q.
11

Sie müssen bgTask = UIBackgroundTaskInvalid setzen

in zwei Augenblicken

  1. Im Ablauf-Handler.
  2. Nach Beendigung Ihrer Aufgabe.

Ich glaube, Sie verpassen einen dieser beiden Momente und deshalb bekommen Sie diesen Fehler.

Siehe Apple-Beispielcode:

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

Link: https://developer.apple.com/documentation/backgroundtasks/bgtask?language=objc

Julian Osorio
quelle
Ich kann das nicht tun, heißt es: Die implizite Konvertierung von 'UIBackgroundTaskIdentifier' (auch bekannt als 'unsigned long') in 'BGAppRefreshTask *' ist mit ARC
Jackson
5

Verwenden Sie die Standortaktualisierung im Hintergrund?

Wenn ja, fügen Sie die folgenden Code zum Zeitpunkt des Erhaltens Standort Genehmigung vom Benutzer - Apple - verändert die Standardeinstellung für allowsBackgroundLocationUpdateszu NOvon iOS 9 ab.

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

Bitte stellen Sie sicher, dass Sie die 'Standortaktualisierungen' für Hintergrundmodi unter Ihrem Projekt 'Signieren & Funktionen' aktiviert haben. Sonst stürzt es ab.

Anand3777
quelle
5

Reproduziert, hier ist meine gesamte App:

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

Und wenn ich es in den Hintergrund bringe, bekomme ich die gleiche Nachricht. Kein Storyboard oder andere Geräusche.

Hans Terje Bakke
quelle
3

Mit Swift 5 - IOS 13.2.2 - Xcode 11.2 Beta 2 (11B44) konnte ich diesen Fehler durch beheben

  • Aktivieren von Push-Benachrichtigungen in den Funktionen der App

  • Importieren Sie das UserNotifications-Framework

  • Fügen Sie dann diesen Code hinzu

func application (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> 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()
            }
        }
uplearnedu.com
quelle
3
Problem auf meinem realen Gerät mit iOS 13.2.2 und Xcode 11.2.1 nicht gelöst
Adam Smaka
hat das Problem unter iOS 13.3.1, Swift 5, Xcode 11.3.1 ebenfalls nicht
gelöst
Ihre Schritte 2 und 3 sind nicht erforderlich, wenn Sie sich nur für eine stille (Hintergrund-) Benachrichtigung registrieren.
LukeSideWalker
1

In Bezug auf die Meldung "BackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit Kennung ..." kann dies, wie andere gesagt haben, ein roter Hering sein, der nichts mit dem zu tun hat, was Sie tun.

In Bezug auf Ihr Ziel, den Standort des Benutzers regelmäßig abzurufen, anstatt zu versuchen, Ihre App mit einem Timer im Hintergrund laufen zu lassen, sollten Sie stattdessen verschiedene Dienste zur Aktualisierung des Benutzerstandorts im Hintergrund in Anspruch nehmen , z. B. den Besuchsstandortdienst oder der Service für signifikante Änderungsorte . Mit diesen Diensten kann das Betriebssystem Ihre App aktivieren, wenn sich der Standort des Benutzers ändert.

rauben
quelle
Ich erhalte diese Warnung ebenfalls und habe, soweit ich weiß, mit meiner einfachen Notiz-App keine Hintergrundaufgaben. Wenn ein Benutzer beispielsweise auf eine Web-URL tippt und die Safari geöffnet wird, wird eine Warnung angezeigt. Was sind einige der roten Heringe, nach denen ich suchen sollte? Oder einige Ressourcen, die ich überprüfen kann, um mehr zu erfahren?
Mox
Ich kenne keine vollständige Liste, da sie vielfältig sind. Und wenn Sie Bibliotheken von Drittanbietern verwenden, verschlechtert sich die Situation. Eine Liste zu führen wäre wahrscheinlich eine Übung der Sinnlosigkeit. Lol. Für mich durchsuche ich im Allgemeinen nur den Stapelüberlauf oder eine allgemeine Websuchmaschine nach einer bestimmten Konsolennachricht und finde häufig Diskussionen, die dieser nicht unähnlich sind. Sie bekommen schnell Ihre Arme um sich, die nichts mit Ihrem eigenen Code zu tun haben. Und für meine Protokollierung verwende ich Unified Logging mit einer OSLogKategorie mit der Zeichenfolge "Kategorie", die ich dann einfach in der Konsole filtern kann, um die Spreu vom Weizen zu trennen.
Rob
1

Ich hatte das gleiche Problem und fand die Ursache und Lösung heraus!

Apple hat dieses Problem in iOS 13.4 GM behoben, obwohl ich eine Problemumgehung für die früheren Versionen habe.

Während Sie Szenen verwenden sollten, wenn Ihre App unter iOS 13 und höher ausgeführt wird, können Sie sich vollständig abmelden, solange Sie noch iOS 12 oder früher unterstützen.

  1. Entfernen Sie zunächst den Application Scene ManifestEintrag " " vollständig aus der Info.plist.
  2. Wenn es eine Szenendelegatklasse gibt, entfernen Sie diese.
  3. Wenn Ihr App-Delegat szenenbezogene Methoden enthält, entfernen Sie diese Methoden.
  4. Wenn dies fehlt, fügen Sie die Eigenschaft var window: UIWindow?Ihrem App-Delegaten hinzu.
  5. Ihre App sollte jetzt nur den App-Delegaten verwenden und unter iOS 13 den gleichen Lebenszyklus wie iOS 12 haben.

Viel Spaß beim Codieren!

Manivel Nagarajan
quelle
0

Ich denke, es gibt einen Fehler, der mit xcode 11.2 und dem swiftUI-Framework funktioniert, weil ich immer das bekomme

"BackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit Bezeichner ..."

Nachricht auch wenn meine App nicht mit Hintergrundaufgaben arbeitet! Die gute Nachricht ist, dass dies meine App nur stoppt, wenn sie von xcode ausgeführt wird. Verwenden Sie die Schaltfläche 'Programmausführung fortsetzen' und die App wird erneut ausgeführt.

abanet
quelle
Das ist kein Absturz, von dem Sie sprechen, sondern ein Haltepunkt, wenn die App zum Debuggen angehalten wird. Höchstwahrscheinlich haben Sie einen Haltepunkt für festgelegt UIApplicationEndBackgroundTaskError.
Starsky
Sie haben Recht, es ist kein Absturz, aber ich habe keinen Haltepunkt festgelegt.
Abanet