Ich versuche, die Hintergrundaufgabe "Finite-Length" in meiner App auszuführen. Allerdings wird mein Code derzeit nicht ausgeführt, bevor die App gesperrt wird.Ausführung der Hintergrundaufgabe, bevor die App in den Status "Ausgesetzt" geht
Ich habe einige Tutorials verfolgt, die behaupten, dass das Folgende der Weg ist, aber offensichtlich bekomme ich etwas falsch. Relevante Code sollte unten gebucht werden (bitte nur für jede Klärung, ob ich etwas fehlt):
class Manager {
private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
init(){
// Add observer able of detecting when app will go to background
NotificationCenter.default.addObserver(self, selector: #selector(self.didEnterBackground(_:)), name: .UIApplicationDidEnterBackground, object: nil)
}
deinit {
// Observers removed when view controller is dismissed/deallocated
NotificationCenter.default.removeObserver(self)
}
// Routine performed when app will resign from active
@objc private func didEnterBackground(_ notification: Notification){
registerBackgroundTask()
// Code that needs to be executed before app is suspended ------
DispatchQueue.global().sync {
self.isBackgrounding = true
self.shutdownSession()
self.isConnected = false
self.isActivated = false
self.activate = false
self.connectionManager.closeConnectionToPeripherals()
}
// -----------------------------------------------------
self.endBackgroundTask()
}
func registerBackgroundTask() {
backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
self?.endBackgroundTask()
}
assert(backgroundTask != UIBackgroundTaskInvalid)
}
func endBackgroundTask() {
print("\n\n\nBackground task ended.\n\n\n")
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
}
ich ein Problem bin vor, wo die Hintergrundaufgabe zu sein scheinen immer beendet, bevor der Code ausgeführt wird. Wie stelle ich sicher, dass der Code in meinem synchronen Block ausgeführt wird, bevor die App angehalten wird?
Ich verstehe auch nicht die "registerBackgroundTask()" - obwohl das Internet darauf besteht, es so zu implementieren - wie es die endBackgroundTask() aufruft.
Ich habe den Code zu Ihrem Vorschlag umgeordnet, aber die "Hintergrundaufgabe beendet." wird immer noch sofort ausgeführt. Ich weiß, dass die Aufgabe ca. Insgesamt 7 Sekunden, also stimmt etwas immer noch nicht. Könnte es etwas damit zu tun haben, dass ich Funktionen aufruft und sie somit ausgeführt/gestartet, aber nicht intern abgeschlossen werden? – matiastofteby
Ja. Wenn die Funktionen, die Sie anrufen, asynchrone Arbeiten ausführen, kann das System Ihre App einfrieren, bevor sie zurückkehren. Wenn diese Funktionen asynchron sein müssen, müssen Sie sie ändern, indem Sie einen Completion-Block übergeben und 'endBackgroundTask' ausführen, sobald alle zurückgegeben wurden. – ersjoh