Das Hauptereignis des Jahres in der Welt der iOS- und MacOS-Entwickler, WWDC, erfreut ausnahmslos alle Branchenbeteiligten mit der Veröffentlichung neuer Versionen des Betriebssystems, der Frameworks und der Hardware - im Allgemeinen alles, woran tatsächlich gearbeitet werden muss.
Dieses Jahr war keine Ausnahme und das Thema der aktiven Diskussion war die neue Version von iOS und SwiftUI sowie das iPadOS-Betriebssystem für Sie, die selbst verstanden haben, welche Geräte.
Es gab jedoch Themen, die weniger behandelt wurden, aber nicht weniger interessant waren - zum Beispiel wurde eine so nützliche Sache wie die Hintergrundausführung von Anwendungen angesprochen.
Kurz zum Thema
Für diejenigen, die nicht genau verstehen, was Hintergrundausführung ist, erklären wir Folgendes: Die Ausführung im Hintergrund bedeutet, dass die Anwendung einige Arbeiten in einem Zustand ausführt, in dem sie nicht physisch auf dem Smartphone-Bildschirm des Benutzers ausgeführt wird (d. H. Nicht im Vordergrund). .

Dieses Bild zeigt deutlich, unter welchen Bedingungen die Anwendung bleiben kann und wie sie von einer zur anderen gelangt.
Außerdem haben sich Apple-Entwickler in dieser Sitzung auf den Ressourcenverbrauch konzentriert (ich hoffe, es ist ziemlich offensichtlich, dass die Anwendung bei der Arbeit im Hintergrund weiterhin Energie verbraucht). Es ist jedoch Zeit, direkt zum Bericht zu gehen.
Was ist bei WWDC passiert?
Tatsächlich begannen die Redner mit der gleichen Sache wie ich - sprachen kurz über die Arbeit im Hintergrund und beschrieben die Aufgaben, die dort ausgeführt werden würden.

Wir nähern uns der Entwicklung. Es gibt drei Hauptüberlegungen für Apple, wenn es um die Hintergrundleistung geht:
- Macht
- Leistung
- Vertraulichkeit
Alles ist ganz einfach: Wenn eine Anwendungsaufgabe im Hintergrund ausgeführt wird, kann diese Ausführung erfolgen, während eine andere Anwendung im Vordergrund ausgeführt wird. Daher gibt es ein Ressourcenlimit für Sie, um sicherzustellen, dass die Ressourcen nicht überlastet werden. Wenn diese Grenzwerte überschritten werden, wird Ihre Anwendung möglicherweise von Apple zwangsweise beendet, was die weitere Startzeit verlangsamt. In Bezug auf den Datenschutz empfiehlt das Unternehmen Entwicklern dringend, alle Funktionen ihrer API zu verwenden, um den Benutzer darüber zu informieren, welche Daten die Anwendung für ihre Arbeit verwendet (auch im Hintergrund).
Die Liste dieser APIs war übrigens ziemlich beeindruckend - sie haben keine separate Überprüfung durchgeführt, aber ich rate Ihnen, darauf zu achten.
Ja, und auf der Sitzung selbst zeigten Apple-Entwickler anhand des Messenger-Anwendungsbeispiels einen kurzen Überblick über die Möglichkeiten (es lohnt sich, ein Video von WWDC anzusehen).
Hintergrundaufgaben
Fast die Hälfte des diesjährigen Berichts ist diesem Rahmen gewidmet.
2 Arten von Aufgaben, die diese Neuheit bietet:
- App-Aktualisierungsaufgabe
- Hintergrundverarbeitungsaufgabe
App-Aktualisierungsaufgabe
Die BG App Refresh Task ist eine spezielle Art von Hintergrundaufgabe, mit der wir Anwendungsdaten aktualisieren können. Eine Sache, die diese Art von Aufgabe besonders macht, ist das Benutzerverhalten. iOS erfährt, wie oft und zu welcher Zeit der Benutzer Ihre Anwendung startet, und versucht, BGAppRefreshTask zu einem Zeitpunkt zu starten, an dem es unwahrscheinlich ist, dass der Benutzer die Anwendung verwendet.

Ja, es wird nicht länger als 30 Sekunden funktionieren - die Funktion ist sehr unangenehm und bleibt von früheren Versionen des Betriebssystems übrig.
Betrachten Sie ein Beispiel für Code aus dem Internet.
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.refresh", using: DispatchQueue.global() ) { task in self.handleAppRefresh(task) } return true } private func handleAppRefresh(_ task: BGTask) { let queue = OperationQueue() queue.maxConcurrentOperationCount = 1 let appRefreshOperation = AppRefreshOperation() queue.addOperation(appRefreshOperation) task.expirationHandler = { queue.cancelAllOperations() } let lastOperation = queue.operations.last lastOperation?.completionBlock = { task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false)) } scheduleAppRefresh() } }
Es gibt mehrere Punkte, die Sie stoppen und besser berücksichtigen müssen:
- Installieren Sie den Ablaufhandler auf dem Taskobjekt (expirationHandler), da das System nur eine begrenzte Zeit zum Abschließen der Arbeit zur Verfügung stellt. Wenn diese überschritten wird, müssen Sie die Ressourcen löschen.
- Stellen Sie sicher, dass die Methode setTaskCompleted aufgerufen wurde, sobald der Vorgang abgeschlossen ist.
- BGTaskScheduler ist die Hauptklasse, mit der Hintergrundarbeiten geplant werden.
Hintergrundverarbeitungsaufgabe
Eine andere Art von Hintergrund-Hack ist die BG-Verarbeitungsaufgabe. Sie können es verwenden, um das ML-Modell auf dem Gerät zu trainieren oder eine Bereinigung in der Datenbank durchzuführen. Apple verspricht, dass das System bis zu mehreren Minuten Zeit für diese Art von Aufgabe einplanen kann. Dies ist eine sehr wichtige Neuerung für schwere Arbeiten, die nicht in miserable 30 Sekunden passen.
Wieder ein Beispiel:
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.train", using: DispatchQueue.global() ) { task in self.handleMLTrain(task) } return true } private func scheduleMLTrain() { do { let request = BGProcessingTaskRequest(identifier: "pl.snowdog.example.train") request.requiresExternalPower = true request.requiresNetworkConnectivity = true try BGTaskScheduler.shared.submit(request) } catch { print(error) } } }
Wichtige Punkte:
- RequiesExternalPower ist ein boolescher Wert, der angibt, ob ein an eine Stromquelle angeschlossenes Gerät für eine Verarbeitungsaufgabe erforderlich ist.
- requireNetworkConnectivity - Ein boolescher Wert, der angibt, ob für eine Verarbeitungsaufgabe eine Netzwerkverbindung erforderlich ist.
Debuggen
Auch hier ist nicht ohne Ausstattung. Die Verzögerung zwischen der geplanten Ausführungszeit der Hintergrundaufgabe und dem Zeitpunkt, zu dem das System die Anwendung startet, um sie abzuschließen, kann mehrere Stunden betragen. Bei der Entwicklung einer Anwendung können Sie zwei private Funktionen verwenden, um eine Aufgabe zu starten und ihre vorzeitige Fertigstellung gemäß der ausgewählten Zeitachse zu erzwingen. Debugging-Funktionen funktionieren nur auf Geräten.
- Aufgabenstart:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]
- Erzwungene vorzeitige Beendigung des Auftrags:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"]
Abschließend
BackgroundTasks ist eine großartige Möglichkeit, Ihre harte Arbeit mit der besten Benutzererfahrung in Ihrer Umgebung zu planen. Da seit der 13. Version des Systems viele Methoden zum Arbeiten im Hintergrund veraltet sind, wird das Framework in Anwendungen immer noch sehr beliebt sein. Angesichts der oben genannten Möglichkeiten ist dies ziemlich logisch.
Ich empfehle auch, ein
Video von WWDC anzuschauen. Die dort beschriebenen Beispiele sind sehr interessant.