Flutter: Flutter sollte eine Abstraktion für die Ausführung im Hintergrund bereitstellen

Erstellt am 2. Mai 2016  ·  139Kommentare  ·  Quelle: flutter/flutter

Kunden möchten Dart-Code als Hintergrundprozesse sowohl auf iOS als auch auf Android ausführen, um beispielsweise Daten zu synchronisieren, wenn WLAN verfügbar ist, aber die App nicht geöffnet ist usw.

@mpcomplete hat einen Hintergrundprozess auf Android erstellt, um Dart-Code auszuführen, um Flattern zu aktualisieren. Mir ist aber keine Parallele zu iOS bekannt.

Dieses Problem verfolgt die Entwicklung von APIs in Plugins oder auf andere Weise. Die Engine-Unterstützung für diese Abstraktionen wird in https://github.com/flutter/flutter/issues/6192 nachverfolgt.

truckable wellbeing engine framework plugin new feature

Hilfreichster Kommentar

Schnelles Update: Die Hintergrundausführung für iOS ist implementiert und steht zur Überprüfung bereit (PR Flattern/Engine#5539). Sobald das gelandet ist, beginne ich mit der Aktualisierung der Android-Hintergrundausführung, um eine konsistente Benutzeroberfläche zu haben, und veröffentliche ein Beispiel-Plugin. Das alles wird hoffentlich bis Ende des Monats erledigt sein.

Alle 139 Kommentare

Soll der im Hintergrund laufende Code in Dart oder in Java/Objective-C geschrieben sein?

Dies entstand im Zusammenhang mit dem Wunsch, das lokale Datenmodell zu aktualisieren, wenn Konnektivität verfügbar war. B. U-Bahn-Pläne/Zeiten, zu denen Sie möglicherweise in eine U-Bahn ein- oder aussteigen. Ich denke also, das Ziel wäre, dass der ausgeführte Code Dart ist, sodass Sie nicht für jede Plattform einen separaten Datenmodell-Manipulationscode haben müssen.

CC @kasperl; Wir haben viele Möglichkeiten untersucht, Code im Hintergrund für unsere verschiedenen Ziele auszuführen, und vielleicht könnten einige Erkenntnisse daraus gezogen werden.

Haben wir einige Anwendungsfälle von unseren Benutzern? Die einzige, die ich hörte, war: „Wir möchten als Antwort auf eine Push-Nachricht einen Code auf dem Gerät ausführen. Wir möchten die Daten auf dem Gerät synchronisieren, auch wenn die App nicht geöffnet ist.“

Normalerweise ist es ziemlich eingeschränkt, was eine App tatsächlich im Hintergrund tun darf, also denke ich, dass wir uns in diesem Fall von dort Inspiration für die Anwendungsfälle holen können. Hier ist zum Beispiel das iOS-Modell:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Ich glaube, das ist der gleiche Fehler wie #6192, ja.

Blatt-Tag und Meilensteinwert aus #6192 hinzugefügt

@mravn-google @sigurdm etwas zum Nachdenken!

Zuweisung an Mikkel für eine sehr anfängliche Untersuchung, um Machbarkeit und Kosten besser zu verstehen.

Hier ein Update von Leafy:

Aufgrund von Einschränkungen bei Datenbenachrichtigungen (dh Benachrichtigungen, bei denen die App auf irgendeine Weise reagieren muss) tendiert leafy zur Verwendung von Anzeigebenachrichtigungen (dh Benachrichtigungen, die ohne Beteiligung der App direkt auf den Benutzerbildschirm geschoben werden). Unterstützung dafür gibt es bereits in Flutter.

Bei Gesprächen mit anderen Teams ist jedoch ein weiterer Anwendungsfall aufgetaucht: Wenn Sie Wearables oder [Startbildschirm]-Widgets von Ihrer App aus unterstützen möchten, müssten Sie die Benutzeroberfläche in nativem Code schreiben, da diese Oberflächen noch nicht von Flutter unterstützt werden. Es wäre jedoch schön, in der Lage zu sein, „die App aufzuwecken und nach Daten zu fragen“, damit die Modellebene und die Geschäftslogik über die Flutter-App und die Wearable-App geteilt werden können. Da ich noch nie eine davon geschrieben habe, bin ich mir nicht sicher, wie bestehende native Apps dies tun, aber es scheint sicherlich ein gültiger Anwendungsfall für Hintergrundaufgaben zu sein.

Ich habe gerade mit dem Autor von Flutter Talk für die Berliner DroidCon gesprochen, und das war eine seiner wichtigsten Fragen. "Wie das geht, auf die Flutter-Art"

Um es klarzustellen, es ist derzeit möglich, Hintergrundprozesse als Teil einer App zu schreiben, die Flutter verwendet. Diese Prozesse können jedoch nur Obj-C/Swift- oder Java/Kotlin-Code ausführen. Bei diesem Fehler geht es darum, die Einschränkung in unserer Engine zu beheben, um das Ausführen von Dart-Code in diesen Hintergrundprozessen zu ermöglichen, sowie möglicherweise eine Abstraktion bereitzustellen, um das Planen solcher Hintergrundarbeit von Dart aus zu ermöglichen (wahrscheinlich gehört das in ein Plugin, sobald FlutterView-muss). Be-On-Screen-Einschränkung wird entfernt).

https://github.com/flutter/flutter/issues/6192#issuecomment -258928555 diskutiert die aktuelle Engine-Beschränkung und unsere Absicht, sie zu lösen. FYI @a-siva

Dies hängt auch mit (einem Duplikat von?) https://github.com/flutter/flutter/issues/5048 zusammen.

Wir haben einen Anwendungsfall, den ich nicht erwähnt sehe: Wir verfolgen den Standort alle 5 Sekunden und haben bestimmte andere Informationen, die an dieses Ereignis angehängt sind, wobei die gesamte Geschäftslogik in Dart implementiert ist. Wenn unser Benutzer eine andere Aktivität in den Vordergrund bringt, müssen wir eine dauerhafte Benachrichtigung anzeigen und diesen Dart-Code weiterhin alle 5 Sekunden ausführen.

Dies ist ein Blocker für uns. Ich wäre an Problemumgehungen interessiert, die wir im Moment implementieren könnten, da dies den Versand verzögern wird.

Ich würde versuchen, den Timer einfach aktiv zu lassen und zu sehen, was passiert. Ich würde nicht glauben, dass es zuverlässig wäre, aber unsere App hat auch einen Anwendungsfall der einmaligen Cache-Bereinigung (15 Minuten nachdem die App in den Hintergrund gestellt wurde) und wir haben gesehen, dass sie erfolgreich ausgeführt wurde. Wir planen es, während die App in Dart gestoppt wird. Etwas wie das:

<strong i="6">@override</strong>
void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
        new Future.delayed(const Duration(seconds: 5), () => _doSomething());
    }
}

Es würde nicht funktionieren, wenn:

  • App wird explizit vom Benutzer beendet (z. B. vom Task-Switcher).
  • Die App wird vom Betriebssystem aufgrund von Speicherdruck beendet.
  • Auf iOS? Ich glaube nicht, dass wir das versucht haben, also zögern Sie nicht, es zu versuchen und wieder zu berichten.

Ich bin mir bei den iOS-Gegenstücken nicht sicher, aber auf Android könnte ein Flutter-Plugin erstellt werden, das einen Vordergrunddienst startet, der dem Prozess eine höhere Priorität verleiht und es weniger wahrscheinlich macht, dass er in ressourcenintensiven Zeiten beendet wird. Würde dies auch dem langlaufenden Dart-Timer eine bessere Überlebenschance geben?

Ja, das könnte helfen, da Ihre Aktivität (also Ihre Flatteransicht) aktiv bleibt. Ich bin immer noch nicht davon überzeugt, dass wir genug Klarheit haben, um ein Plugin zu machen.

Wenn es darum geht, regelmäßige Hintergrundabfragen von Informationen zu unterstützen, ist es möglicherweise besser, ein Plugin nur dafür zu entwerfen. Es sollte ermöglichen, einen Rückruf in Dart zu registrieren, der über einen Timer im nativen Code aufgerufen wird, anstatt den Timer in Dart zu implementieren. Wir könnten das mit einem Dienst auf Android machen.

ODER

Wir könnten einfach ein HowTo zum Erstellen von KeepAlive™ Flutter-Apps haben.

Unter iOS können Sie einen UIBackgroundMode in Ihrem Info.plist festlegen, um es viel unwahrscheinlicher zu machen, dass die App beendet wird.

Richten Sie unter Android einen leeren Dienst ein. Dies ist hauptsächlich eine AndroidManifest.xml-Änderung + eine triviale Dienstklassenimplementierung.

Ein generisches KeepAlive-Plugin scheint nicht praktikabel zu sein, da es immer noch eine manuelle Einrichtung auf iOS erfordern würde und nicht klar ist, ob der Vordergrund-/Hintergrunddienst auf Android verwendet werden soll (der Vordergrunddienst ist schwieriger zu beenden, erfordert aber eine dauerhafte Benachrichtigung).

Selbst mit einem Vordergrunddienst könnte das Betriebssystem unseren Prozess aus irgendeinem Grund beenden.

Ich denke, die ideale Lösung muss den Alarm-Manager von Android verwenden, der für Fälle gedacht ist, in denen Sie Ihren Anwendungscode zu einem bestimmten Zeitpunkt ausführen lassen möchten, auch wenn Ihre Anwendung derzeit nicht ausgeführt wird. Aber selbst damit, wie können wir den Dart-Prozess mit demselben Status neu starten, da wir einen angemeldeten Firebase-Benutzer haben, der authentifizierte Datenbankschreibvorgänge durchführt?

@pauldemarco, daher dieser Fehler ... Flutter hat derzeit keine Möglichkeit, Dart-Code in irgendeinem Zustand auszuführen, ohne dass FlutterView ausgeführt wird. Dazu gehören Alarm Manager, Wearable/Native Widget Data Sync oder Push Notifications (obwohl der Anwendungsfall für letzteres langsam verschwindet https://github.com/flutter/flutter/issues/6192).

Ich würde denken, dass das Problem des _gleichen Zustands_ auf App-Ebene und nicht auf Flutter-Ebene gelöst werden sollte. Bei nativen Apps haben Sie das gleiche Problem. Sobald ein Prozess tot ist, können Sie den Status nicht wiederherstellen, es sei denn, Sie speichern ihn irgendwo (z. B. gemeinsame Einstellungen oder SQLite). Vermutlich würden Sie dasselbe in Ihrem Dart-Code tun. Eine Sache, die Flutter tun kann, ist Nachrichten wie applicationWillTerminate auf iOS und onSaveInstanceState auf Android zu kommunizieren, damit Sie sich darauf vorbereiten können.

Fragen:

  • Was sind die iOS- und Android-Modelle für die Ausführung im Hintergrund?

    • Welche Signale können die Ausführung der Anwendung auslösen?

    • Wie lange muss man laufen? Woher weißt du, wann das aufgebraucht ist?

  • Welches Ausführungsmodell wollen wir für die Ausführung im Hintergrund? (z. B. ein separates Isolat? Den dart:ui-Hauptthread verwenden?)
  • Wollen wir das Ausführen von Code unterstützen, ohne dass die App (wie in runApp ) zuerst ausgeführt wurde?
  • Können wir eine kanonische Liste von Anwendungsfällen sammeln?

Derzeit ist dies für die nahe Zukunft nicht geplant. Es ist ein großer Prozess, wir müssten etwas anderes von unserer kurzfristigen Prioritätenliste streichen, um dies bald zu tun.

Anwendungsfall
Wir haben verschiedene Betriebsmodi, die Ereignisse in unterschiedlichen Intervallen (5 Sekunden, 10 Minuten, 30 Minuten, 6 Stunden) aufzeichnen. Wir brauchen eine Möglichkeit, um sicherzustellen, dass der Protokollierungsprozess ausgeführt wird, unabhängig davon, ob die App gerade ausgeführt wird oder nicht.

Welche Signale können die Ausführung der Anwendung auslösen?

Auf Android würde dies über einen PendingIntent erfolgen, der von einem geplanten Alarm in AlarmManager gesendet wird.
Ich bin mir im Moment nicht sicher, ob es das iOS-Gegenstück dazu gibt.

Wie lange muss man laufen? Woher weißt du, wann das aufgebraucht ist?

Wir müssen zuerst die erforderlichen Informationen für das Ereignis sammeln, von denen einige asynchron sind (GPS-Standort), und das Ereignis dann in einem Online-Datenspeicher (Firebase) aufzeichnen. Dieser gesamte Vorgang kann bis zu 30 Sekunden dauern.

Welches Ausführungsmodell wollen wir für die Ausführung im Hintergrund? (z. B. ein separates Isolat? Den dart:ui-Hauptthread verwenden?)

Ich glaube nicht, dass uns das wichtig ist, wir werden keine teuren Berechnungen durchführen.

Wollen wir das Ausführen von Code unterstützen, ohne dass die App (wie in runApp) zuerst ausgeführt wurde?

Ich bin mir der Auswirkungen hier nicht sicher. Ich nehme an, da wir unsere Geschäftslogik und den Status in der normalen App initialisieren, wäre es am besten, diese Dinge zuerst auszuführen, damit wir Absturzberichte usw. verwenden können.

Ich kann einen weiteren Benutzerfall hinzufügen, diese Funktionalität ist das einzige, was mich davon abhält, meine App fertigzustellen. Ich hatte dafür eine Android-App und entschied mich, eine neuere, bessere Version zu erstellen, die idealerweise auch auf iOS funktioniert. Ich bin mit den Komponenten in iOS nicht vertraut (bei der Recherche fand ich heraus, dass Hintergrundaufgaben in iOS viel eingeschränkter sind als auf Android), aber ich kann die von mir verwendeten Android-Komponenten benennen.

Welche Signale können die Ausführung der Anwendung auslösen?

Der Großteil des Codes wird auch durch einen Alarm im AlarmManager ausgelöst.

Um diesen Alarm jedoch ständig zu starten, wird beim Booten des Geräts und auch beim Paket-Upgrade (android.intent.action.MY_PACKAGE_REPLACED) Code ausgeführt, da frühere Alarme entfernt würden.

Wie lange muss man laufen? Woher weißt du, wann das aufgebraucht ist?

Idealerweise für weniger als eine Sekunde. Es wird eine kleine Netzwerkanfrage gestellt und das Ergebnis beibehalten, in einigen Fällen wird eine Benachrichtigung angezeigt. Danach kehrt die Methode zurück.

Welches Ausführungsmodell wollen wir für die Ausführung im Hintergrund? (z. B. ein separates Isolat? Den dart:ui-Hauptthread verwenden?)

Ist mir auch egal.

Wollen wir das Ausführen von Code unterstützen, ohne dass die App (wie in runApp) zuerst ausgeführt wurde?

In meinem Fall wäre nach einmaligem Ausführen in Ordnung, aber wenn so etwas wie ein Boot-Empfänger möglich ist, sollte es auch dann laufen, wenn die App vorher nicht gestartet wurde.

https://stackoverflow.com/questions/41924890/how-do-i-run-code-in-the-background-even-with-the-screen-off ist Flutters meistgesehene Stapelüberlauffrage, soweit ich kann erzählen. :) Es scheint definitiv Interesse an diesem Raum zu geben.

https://github.com/flutter/flutter/issues/6192 wurde reaktiviert, um die zugrunde liegende Unterstützung für die tatsächliche Ausführung von Dart-Code bereitzustellen, wenn ein FlutterView nicht gerendert wird.

Dies ist auf unserem kurzfristigen Radar, wird aber mindestens ein paar Monate dauern.

Tut mir leid, dass ich die Zuweisung von @zanderso von diesem Fehler aufgehoben habe, ich wollte ihn dem zugrunde liegenden Hintergrundausführungsfehler (#6192) zuweisen.

CC @kasperl; Wir haben viele Möglichkeiten untersucht, Code im Hintergrund für unsere verschiedenen Ziele auszuführen, und vielleicht könnten einige Erkenntnisse daraus gezogen werden.

@mit-mit hast du deine Ergebnisse in irgendeiner Form dokumentiert?

Ein weiterer Grund für eine Hintergrundverarbeitung ist, wenn Sie eine Streaming-Audio-App erstellen möchten. Der Benutzer öffnet die App, um einen Audiostream zu starten. Der Hintergrundprozess lädt den Stream herunter und spielt das Audio ab, empfängt Ereignisse zum Starten/Stoppen/Pause/ff/Zurückspulen und sendet Ereignisse zum Ändern der Benutzeroberfläche, z. B. die Audio-Metadaten der Suchleiste an die Benutzeroberfläche. Sie benötigen einen Hintergrundprozess, wenn der Benutzer Ihre Apps verlässt und der Download/die Wiedergabe des Streams fortgesetzt werden muss

Daran arbeiten wir derzeit. Keine ETA zu diesem Zeitpunkt.

@zanderso hat hier ein Update gepostet: https://github.com/flutter/flutter/issues/6192#issuecomment -342214725

@a-siva teilt mir mit, dass dies noch andauert; Android läuft und wir arbeiten gerade an iOS.

Wir haben dafür einen Anwendungsfall, bei dem wir den Standort des Benutzers im Hintergrund verfolgen möchten, um zu registrieren, ob er zu einem bestimmten Zeitpunkt (z. B. während einer Veranstaltung) an einen bestimmten Ort gegangen ist oder nicht.

@bjornbjorn kannst du dafür nicht Geofences verwenden? Ich weiß nicht, ob IOS etwas Ähnliches hat, aber Sie können dieses Play Service Geofencing erreichen

Gibt es Neuigkeiten @Hixie ? Ich befinde mich derzeit in der Phase, in der meine App als Hintergrunddienst ausgeführt werden muss (der größte Teil der App ist in Go geschrieben), aber sie wird schließlich beendet. Ich habe angefangen, den Vordergrunddienst auf der Java-Seite zu implementieren, aber es wird ziemlich unangenehm, wenn ich ihn irgendwann für iOS neu implementieren muss.

Einige Schätzungen, ob dies in der nächsten Woche oder im nächsten Monat für Android verfügbar sein wird, würden uns sehr freuen :)

@rusenask wie in https://github.com/flutter/flutter/issues/6192 beschrieben, wir haben jetzt ein Plugin dafür auf Android! Bitte werfen Sie einen Blick auf https://pub.dartlang.org/packages/android_alarm_manager und lassen Sie uns wissen, ob das Ihren Anforderungen entspricht.

Es sieht vielversprechend aus und ich könnte meine App wahrscheinlich mit diesem Alarmmanager vom "Daemon" -Stil in eher "periodische Bursts" ändern. Um aufzuwachen, konsumieren Sie alle Nachrichten und Herunterfahren.

Idealerweise würde ich jedoch etwas verwenden, mit dem mein Prozess immer im Vordergrund ausgeführt werden kann. https://stackoverflow.com/questions/15758980/android-service-needs-to-run-always-never-pause-or-stop . Kurz gesagt, meine App führt einen Bot aus, sodass sie so ziemlich immer ausgeführt werden muss.

Wir müssen sicherstellen, dass wir dies dokumentiert haben, bevor wir dies als erledigt betrachten.

Sollen wir ein neues Dokumentationsproblem eröffnen?

@zanderso -- @mjohnsullivan ist der beste Ansprechpartner für die Dokumentationsseite.

Ist die ETA bekannt?

@it2bz ETA für was genau? Unterstützung auf Android? Dokumentation? Unterstützung für iOS? Beispiele?

@Hixie Support für Android und iOS und zumindest grundlegende Dokumentation mit Beispielen

Können Sie für iOS genau erläutern, was Sie möchten? Apple hat strenge Beschränkungen, was Anwendungen im Hintergrund tun können, daher wäre es für uns hilfreich, genau zu wissen, in welche APIs wir uns einklinken sollen.

Ich suche Gelegenheitshintergrundarbeit mit Benutzerstandort

Sieht so aus, als wäre dies der Thread "Hintergrundwissen fragen", also fange ich an. Ich wollte einen Musikplayer mit Flutter implementieren, bin mir aber nicht sicher, ob es möglich wäre (API-weise), die Musik weiterzuspielen, auch wenn die App auf dem Telefon minimiert ist. Ich weiß, dass Sie auf Android einen Dienst starten könnten, der tatsächlich fortgesetzt werden könnte, selbst wenn die App geschlossen wird. Es würde dann die Aktivität bei Bedarf neu starten. Ist etwas Ähnliches derzeit bei Flutter möglich?

@SirWindfield Am besten verwenden Sie die native Mediaplayer-API jeder Plattform, die weiterhin getrennt von der App abgespielt wird.

@kirbyfan64 Das dachte ich mir, danke!

@Hixie , eine Lösung wie diese (Cordova): https://github.com/katzer/cordova-plugin-background-mode , oder so (Swift): https://github.com/yarodevuci/backgroundTask wäre schön für Flutter-Hintergrundaufgaben.

@holospeed Das sind Ansätze, die Apple Sie wahrscheinlich nicht versenden lassen würde, also schätze ich, dass wir keine Zeit damit verbringen möchten, dies selbst zu implementieren. Es ist sicherlich etwas, das Sie gerne als von der Community bereitgestelltes Paket auf Pub implementieren möchten, wenn Sie sich jedoch für persönliche Apps auf iOS interessieren.

Vielleicht wäre eine Lösung, spezifische Hintergrund-Plugins wie ein Plugin für die Audiowiedergabe im Hintergrund und ein Plugin für GPS/Ortung im Hintergrund usw. zu erstellen, anstatt zu versuchen, einen abstrakten Hintergrundmechanismus zu erstellen, der alles unterstützen muss.

Ist es möglich einen Timer im Hintergrund laufen zu lassen, der die App zum bringen bringt
Vordergrund zu einer bestimmten Zeit?

Am Mittwoch, den 21. März 2018 um 08:49 Uhr schrieb Dylan Drost [email protected] :

Vielleicht wäre eine Lösung, spezielle Hintergrund-Plugins wie a
Plugin für die Audiowiedergabe im Hintergrund und ein Plugin für GPS/Ortung
im Hintergrund usw., anstatt zu versuchen, einen abstrakten Hintergrund zu erstellen
Mechanismus, der alles unterstützen muss.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/flutter/flutter/issues/3671#issuecomment-374867947 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AK-c-E0KdEkvbH5uCBIM8FaAbYQkSU2tks5tghQWgaJpZM4IVsUk
.

@ iBob101 Ich glaube, dass dies möglich ist, wenn Sie das Plugin android_alarm_manager in Kombination mit dem Plugin android_intent verwenden .

In meinem Anwendungsfall sind alle Hintergrundaufgaben, die ich benötige, das Abspielen von Audio im Hintergrund zu einer bestimmten Zeit, also denke ich, dass der Vorschlag von @aegis123 großartig ist. Wir können klein anfangen und mit der Zeit einen Mechanismus bereitstellen, der jeden Hintergrundprozess unterstützt

Ich brauche das auch, um im Hintergrund Musik abzuspielen.

Ich habe mir angesehen, wie dies im Plugin android_alarm_manager gemacht wurde, und nach allem, was ich sammeln kann, wird ein Dart-Code auf dem Android aufgerufen, indem runFromBundle aufgerufen wird . Die aufgerufene Dart-Funktion wird durch den Einstiegspunkt angegeben, aber was ist, wenn diese Funktion Informationen übergeben muss? Ein Beispiel für einen Anwendungsfall wäre eine Chat-App, die direkte Antworten über Benachrichtigungen ermöglicht. Gemäß diesem Link ermöglicht die Benachrichtigung eine Remote-Eingabe, aber es scheint nicht möglich zu sein, den gelesenen Text an die Dart-Funktion weiterzuleiten, damit er verarbeitet werden kann, damit die Antwort gesendet werden kann.

Ein weiteres Beispiel ist eine E-Mail-Anwendung, die eine Benachrichtigung anzeigt, wenn eine neue E-Mail empfangen wurde, Aktionen können angezeigt werden, von denen eine die Möglichkeit sein könnte, die E-Mail zu archivieren, was durch eine Dart-Funktion erfolgt. Diese Funktion müsste jedoch wissen, welche E-Mails archiviert werden müssen.

@MaikuB Sie könnten eine PR erstellen, damit ein Wörterbuch weitergegeben werden kann, das Schlüsselwertpaare enthalten kann.

Im Allgemeinen würde ich für mein Anwendungsbeispiel jedoch etwas Ähnliches wie die Androids Service-Komponente benötigen. Und da Flutter nicht darauf ausgelegt ist, jede einzelne API verfügbar zu haben, die jedes Betriebssystem bereitstellen kann, könnte es tatsächlich eine bessere Idee sein, die App in Kotlin/Java oder Swift zu schreiben.

Ich glaube, @bkonyi prüft derzeit, was wir für dieses Problem auf iOS tun können.

Das heißt, wir können mit Flutter keinen Hintergrunddienst haben? Zum Beispiel: Ein Dienst zum Popup von Push-Benachrichtigungen vom Server.

@s-bauer Always running ist keine Sache für Android, außer vielleicht Vordergrundbenachrichtigungen, aber ich habe keine Erwähnungen von startForeground in Ihrem Code gefunden.

Ich bin mir nicht sicher, was Ihre technischen Daten sind, aber denken Sie daran, dass Android-Telefone nach ein paar Stunden in den Tiefschlaf gehen, wenn der Bildschirm ausgeschaltet ist und nicht bewegt wird. Alle Dienste (außer dem Vordergrund) werden so geplant, wie es das Betriebssystem für am besten hält. Eine Push-Benachrichtigung von FCM oder ein Alarm von AlarmManager unter einer bestimmten Einrichtung sind vielleicht die einzigen 2 Dinge unter der Kontrolle eines Entwicklers, die in der Lage sind, ein Android-Gerät / eine Android-App zu aktivieren, wann immer der Entwickler es wünscht, aber nicht für eine unbestimmte Zeit Zeit. Es gibt viele andere Methoden, die davon abhängen, was das Betriebssystem für den Akku am besten hält. Weitere Einzelheiten finden Sie unter Doze-Modus. https://developer.android.com/training/monitoring-device-state/doze-standby

Auf dem iPhone sind die Dinge viel eingeschränkter.

Ich sehe auch nicht, warum ein Dienst oder eine Verbindung am Leben bleiben muss, um Push-Benachrichtigungen von FCM oder APNS zu erhalten, vielleicht übersehe ich etwas?

Schnelles Update: Die Hintergrundausführung für iOS ist implementiert und steht zur Überprüfung bereit (PR Flattern/Engine#5539). Sobald das gelandet ist, beginne ich mit der Aktualisierung der Android-Hintergrundausführung, um eine konsistente Benutzeroberfläche zu haben, und veröffentliche ein Beispiel-Plugin. Das alles wird hoffentlich bis Ende des Monats erledigt sein.

@bkonyi würde dies auch das Problem lösen mit: https://github.com/flutter/flutter/issues/17566 ?

@piotrpalek , ja, das wird es, obwohl das Verhalten wahrscheinlich etwas anders sein wird als zuvor, da wir aus verschiedenen Gründen das UI-Isolat für Rückrufe nicht mehr freigeben können. Jegliche Kommunikation mit der Vordergrund-UI muss über isolierte Ports, MethodChannel s oder andere Methoden hergestellt werden, die nicht darauf angewiesen sind, Speicher mit dem Hauptisolat zu teilen.

Statusaktualisierung: Sowohl iOS- als auch Android-Hintergrundausführungsänderungen stehen zur Überprüfung an und werden noch wiederholt. Ich gehe davon aus, dass die iOS-Änderungen in Flutter/Engine Nr. 5539 in den kommenden Tagen landen werden, sofern keine größeren Änderungen gewünscht werden, und die Android-Änderungen in Flutter/Engine Nr. 5640 sollten hoffentlich nächste Woche vorgenommen werden, nachdem die Kommentare aus der Überprüfung bearbeitet wurden. Danke für Ihre Geduld!

Genial. Ja, ich hatte die PRs gesehen, da sie beide auf dieses Problem verweisen. Sie haben erwähnt, dass Sie ein Beispiel-Plugin erstellen, und ich habe das iOS-Plugin gesehen. Wird es ein Android-Beispiel geben? Ich vermute, das Android-Alarmmanager-Plugin könnte aktualisiert werden, sobald die Änderungen vorgenommen wurden

@MaikuB , ja, das AlarmManager-Plugin wird aktualisiert, sobald Flutter/Engine#5640 landet und Flutter/Plugins#642 fertig ist.

Hallo. Irgendwelche Neuigkeiten zu diesem Thema? Die Auflösung wurde auf den Meilenstein von Bucket 7 verschoben. Wird es wirklich dort landen? Dies ist eine entscheidende Funktionalität für unser Projekt. Danke für jede Antwort.

Leider musste ich für ein paar Tage meine Prioritäten verschieben, aber jetzt arbeite ich wieder daran. Wir sind _fast_ da, also danke, dass du so geduldig bist!

Nachdem nun Flutter/Engine#5539, Flutter/Engine#5947 und Flutter/Engine#5954 gelandet sind, sind alle Funktionen, die für die Hintergrundausführung auf Android und iOS benötigt werden, in der Engine implementiert und sollten es im Laufe des nächsten Jahres in das Flutter-Hauptrepository schaffen Motor rollen. Dokumentation und Beispiele sind in Arbeit, und der Plugin-Fix android_alarm_manager steht zur Überprüfung an (flutter/plugins#642).

@bkonyi wird android_alarm_manager jetzt auch auf IOs funktionieren?

@ianldgs , leider nein. iOS bietet keinen Mechanismus zum regelmäßigen Ausführen von Code, sodass es wahrscheinlich nicht möglich ist, eine iOS-Implementierung zu erstellen (siehe diesen SO-Beitrag ). Oft ist es möglich, die gleichen Ziele mit einem der eingeschränkten Ausführungsmodi im Hintergrund zu erreichen (z. B. signifikante Standortänderungen, Push-Benachrichtigungen, Bluetooth-Statusänderung usw.).

@bkonyi , wird dies ein Problem beheben, das wir derzeit haben, wenn native Hintergrundaufgaben für einen längeren Zeitraum (3 Minuten) auf iOS nicht ausgeführt werden können?

Zur Verdeutlichung hier unsere aktuelle Ausgabe...

Hintergrund:
Unsere App verwendet Bluetooth-Beacons, um festzustellen, wie viel Zeit jemand an einem Standort verbringt. Wir haben unseren gesamten Beacon-Code nativ in AppDelegate.swift geschrieben.

Problem:
Flutter scheint unsere App nach ein paar Sekunden herunterzufahren, wenn wir nativen Code im Hintergrund ausführen, nachdem wir durch ein Standortereignis (in diesem Fall Region betreten/verlassen) geweckt wurden, obwohl wir unsere Hintergrundausführungszeit verlängern.

Warum wir glauben, dass es mit Flutter zu tun hat:
Wir haben unseren nativen Beacon-Code mit einer nativen iOS-App getestet und haben kein Problem damit, konstant 180 Sekunden Ausführungszeit im Hintergrund zu erreichen.

Was wir ausprobiert haben:
Die einzige Problemumgehung, mit der wir erfolgreich waren, besteht darin, eine 30-Sekunden-Verzögerung in main() vor runApp() einzufügen, wenn unsere App im Hintergrund gestartet wurde. Dies hat jedoch andere Probleme verursacht.

Entschuldigung für die lange Erklärung, aber dies ist ein großes Problem für uns und wir versuchen, es in den nächsten Wochen zu veröffentlichen.

Wir hoffen wirklich, dass dieser Fix auch unser Problem behebt.

Um es noch einmal klarzustellen, wir kümmern uns nicht so sehr darum, Dart-Code im Hintergrund auszuführen. Unser Hauptanliegen ist vielmehr, dass Flutter unsere App nicht vorzeitig beendet, wenn es im Hintergrund aufgeweckt wird.

Jede Hilfe wäre sehr willkommen.

Danke!

@AndrewPetrovics Leider glaube ich nicht, dass dies die Probleme beheben wird, die Sie sehen, da diese Änderungen in erster Linie das Ausführen von Dart-Code aus dem Hintergrund ermöglichen sollen. Ich bin nicht sehr vertraut mit iOS-Hintergrundausführungsrichtlinien, aber ich arbeite tatsächlich an einem Geofencing-Plugin für Android + iOS, das Ihrem Anwendungsfall ähnlich klingt, also werde ich nach dem Problem Ausschau halten, das Sie einmal haben Ich beginne heute/morgen mit dem iOS-Teil.

@chinmaygarde , weißt du zufällig etwas über die Probleme, die @AndrewPetrovics hat? Vielleicht lohnt es sich, dafür ein neues Problem einzureichen.

@bkonyi , hört sich gut an. Wir haben vorerst eine Problemumgehung gefunden, aber es ist sehr hackig. Ich werde bei Gelegenheit ein separates Thema erstellen.

Danke!

@bkonyi Darf ich fragen, wann android_alarm_manager 0.2.0 öffentlich auf pub.dartlang.org bereitgestellt wird?

@ethael es sollte jetzt verfügbar sein, wartete nur darauf, die Erlaubnis zur Veröffentlichung des Updates zu erhalten.

Gibt es Beispiele oder Dokumentationen dazu?
Danke!

@Solban Es gibt zwei Beispiele im Flutter/Plugins-Repository:

Ich habe auch ein Geofencing-Plugin in Arbeit , das sowohl Android (Kotlin) als auch iOS (Obj-C) unterstützt, aber ich bin mir nicht sicher, ob das in Flutter/Plugins leben wird oder nicht.

Hier ist einige nützliche Dokumentation für Funktionen im Zusammenhang mit der Ausführung im Hintergrund:

  • Die PluginUtilities -Klasse zum Weiterleiten von Rückrufen zwischen Isolaten
  • Der IsolateNameServer , der nützlich ist, um SendPort -Objekte bei Flutter zu registrieren, damit andere Isolate nachschlagen können (hier scheint die eigentliche Dokumentation zu fehlen, aber die Schnittstelle ist ziemlich einfach).
  • Die FlutterNativeView , die verwendet wird, um das Hintergrundisolat für das Plugin auf Android zu erzeugen
  • Der FlutterHeadlessDartRunner , der verwendet wird, um das Hintergrundisolat für das Plugin auf iOS zu erzeugen

Derzeit gibt es keine formelle Dokumentation zum Schreiben von Plugins mit Hintergrundausführungsfunktionen. Es sollte jedoch in den kommenden Wochen einen Medium-Beitrag im Flutter-Blog geben, der durch den Prozess des Entwerfens, Implementierens und Verwendens von Plugins führt, die die Ausführung im Hintergrund verwenden.

Gibt es eine Lösung für die weitere Hintergrundarbeit? Der einzig richtige Weg, um einen langlaufenden Code in Android kontinuierlich auszuführen, ist Foreground service .
Ein Anwendungsbeispiel wäre eine fortgesetzte GPS-Standortverfolgung.

@audkar Derzeit gibt es kein Plugin, das kontinuierliche Hintergrundarbeit bewältigen kann, aber das bedeutet nicht, dass dies nicht möglich ist. Ein Plugin, das die oben erwähnte Funktionalität in Kombination mit einem Vordergrunddienst verwendet (anstelle von JobIntentService , das ich für das Geofencing-Plugin verwendet habe), würde gut funktionieren.

Ich portiere gerade mein iOS/Android Background Geolocation/Geofencing SDK zu Flutter. Es wird flutter_background_geolocation heißen.

Ich habe ungefähr 5 Tage Erfahrung mit Dart / Flutter, aber ich verstehe es. Es sollte innerhalb von 2 Wochen fertig sein (obwohl die Dokumentation mit Dart-spezifischen Beispielen etwas länger dauert).

Dieses SDK ist fast 5 Jahre alt und wird ständig unterstützt. Es wurde ursprünglich für Apache Cordova entwickelt und später auf React Native und NativeScript portiert . Es funktioniert auch in reinen nativen Apps. Unter der Haube ist es die gleiche Obj-c + Java-Kernbibliothek, die mit jeder Entwicklungsplattform verwendet wird.

Das SDK wurde ursprünglich entwickelt, um Ersthelfer in Katastrophengebieten (z. B. Wirbelstürme, Erdbeben) in einer Umgebung zu verfolgen, in der das Mobilfunknetz wahrscheinlich zerstört wird. Es musste die Verfolgung fortsetzen, auch wenn die App beendet oder das Gerät neu gestartet wurde. Das Plugin enthält eine eigene SQLite-Datenbank und einen HTTP-Dienst zum automatischen Hochladen von Standorten auf Ihren Server. Dies ist besonders wichtig für Android, wenn die App beendet wurde und nur noch der Vordergrunddienst des SDK "kopflos" läuft.

:Warnung: Dieses SDK ist nicht für soziale Apps konzipiert. Es wurde speziell für Anwendungsfälle zur "Flottenverfolgung" entwickelt (z. B. Taxi, Lieferservice, Notfallmaßnahmen, Joggen usw.).

Hier ist ein kurzes Demo-Video .

Siehe Betriebsphilosophie .

Bearbeiten Ich werde auch eine andere Bibliothek als flutter_background_fetch , die als Abhängigkeit von flutter_background_geolocation enthalten sein wird. Dieses Modul weckt etwa alle 15 Minuten eine iOS-/Android-App im Hintergrund und bietet Ihnen 30 Sekunden Hintergrundzeit für regelmäßige Arbeiten. Weitere Informationen finden Sie in der react-native -Version.

Ok, ich habe flutter_background_geolocation veröffentlicht. Es gibt wahrscheinlich noch ein paar Lücken in der Fassade für die nativen Bibliotheken, und die Beispiele in den Dokumenten müssen aus der React Native-Version übersetzt werden.

@Christocracy gute Nachrichten. Was ist mit dem Hintergrundabruf? irgendwelche Schätzungen dazu?

@ethael Fetch kommt in etwa 2 Wochen. Es ist ein sehr einfaches Plugin.

@bkonyi Ich habe Ihr Standortänderungs-Plugin ausprobiert, um mit der Ausführung im Hintergrund zu experimentieren. Es scheint, dass der Dart-Callback, der vom Headless Runner ausgeführt wird, keine anderen Plugins verwenden kann und mit MissingPluginException fehlschlägt.

Unter Android haben Sie dieses Problem mit dem Plugin android_alarm_manager mit AlarmService.setPluginRegistrant(this); gelöst, um die Plugins vom Hintergrunddienst intern zu registrieren. Aber ich sehe nicht, wie ich das Äquivalent für iOS erreichen kann.

Ist es derzeit möglich, andere Plugins von einem Headless Runner auf iOS aufzurufen? Wenn ja, wie können wir Plugins in diesem Zusammenhang registrieren?

@bkonyi Dieses Problem wurde nicht behoben und sollte erneut geöffnet werden. Der AlarmManager scheint bestenfalls eine Problemumgehung zu sein, da er nur zeitgesteuerte Ereignisse unterstützt. Flutter braucht etwas Allgemeineres, damit Sie beispielsweise auf bestimmte Ereignisse wie Bluetooth-Geräte in Reichweite lauschen können. Und es muss iOS besser unterstützen. Ich verstehe, dass iOS viel restriktiver ist, aber Flutter sollte die Dinge unterstützen, die nativen Programmierern zur Verfügung stehen.

Ich war aufgeregt, mit Flutter zu beginnen, aber es scheint, als gäbe es viele Probleme wie dieses, die es für alle außer einfacheren Apps unbrauchbar machen. Ich habe mehr von Google erwartet, und ich denke, es ist unfair von ihnen, von Entwicklern zu erwarten, dass sie Plugins erstellen, um die großen Lücken zu füllen, die sie hinterlassen haben.

@dude8604 Google wird nicht alles bereitstellen, und ja, es liegt an den Plugin-Entwicklern von Drittanbietern (wie mir), Plugins zum Ökosystem beizutragen. Ich bringe gerade selbst zwei mit.

Ich habe viel Zeit mit Cordova, React Native und NativeScript verbracht. Nach 2 Wochen mit Flutter finde ich es ziemlich exzellent, obwohl es sicherlich Löcher gibt (zum Beispiel eine plattformübergreifende Kartenkomponente, zu der ich sicher in naher Zukunft beitragen werde).

Ich bin ein professioneller Plugin-Entwickler, der sich seit 5 Jahren auf den Hintergrundbetrieb von iOS und Android (insbesondere Geolokalisierung und Geofencing) spezialisiert hat. Was würdest du gerne wissen?

@christocracy Ich stimme zu, dass es Plugins von Drittanbietern geben muss, aber die Ausführung im Hintergrund oder zumindest die Möglichkeit, Callback-Funktionen für bestimmte Ereignisse zu registrieren, scheint etwas zu sein, das ein App-Framework bieten sollte. Mein Problem ist nicht, Plugins erstellen zu müssen, um die Kernfunktionalität zu erweitern, sondern ein Framework zu veröffentlichen, dem grundlegende Funktionen fehlen, und von Entwicklern zu erwarten, dass sie ihre Zeit einem gewinnorientierten Unternehmen zur Verfügung stellen, um die Lücken zu füllen. Jedenfalls ist dies nicht der richtige Ort, um darüber zu diskutieren.

Ich möchte einen Hintergrunddienst ausführen und bestimmte Ereignisse auslesen, die Daten verarbeiten und möglicherweise aufzeichnen und gegebenenfalls eine Benachrichtigung erstellen, die die Haupt-App startet, wenn sie gedrückt wird. Einige Beispiele für Ereignisse wären: Neues Bluetooth-Gerät in Reichweite, eingehende Daten an einer Steckdose, eingehende Daten von einem USB-Gerät, empfangene SMS, GPS-Standort geändert, Verbindungsversuch eines Bluetooth-Geräts, eine bestimmte physische Taste wird gedrückt, Beschleunigungsmesserdaten überschreiten a angegebenen Wert, wenn die Haupt-App beendet wird, und viele andere Dinge, an die ich nicht denke. Wenn jemand ein umfassendes Plugin (mit einer kostenlosen oder Open-Source-Lizenz) dafür erstellen könnte, das auf iOS und Android funktioniert, könnte dieses Problem meiner Meinung nach geschlossen werden. Und ich wäre unendlich dankbar, dass ich mit Flutter anfangen kann zu entwickeln.

@ dude8604 Ich glaube, ich weiß, was du willst. Um vieles davon zu tun, ist offensichtlich ein Vordergrunddienst mit seiner erforderlichen dauerhaften Benachrichtigung erforderlich. Der Benutzer ist sich Ihres laufenden Dienstes bewusst.

Kontaktieren Sie mich über mein Github-Profil.

Denken Sie daran, dass React Native im Grunde so war: „Sie erhalten Schaltflächen, Textfelder und eine Listenansicht, der Rest liegt bei Ihnen“ und es hat sich aufgrund der Community zu dem entwickelt, was es jetzt ist. Google kann unmöglich alle Implementierungen handhaben und es ist verrückt zu glauben, dass das Flutter-Team in der Lage sein wird, alle Funktionen von Android und iOS zu replizieren, wenn diese Funktionen von Teams hinzugefügt werden, die 100x (10.000x?) so groß sind wie Flutter.

android_alarm_manager und image_picker scheinen nicht zu funktionieren (wenn beide installiert sind), nachdem sie in ein neues Projekt implementiert wurden, auf dem Flutter 0.8.3-pre.47 ausgeführt wird. Das Schließen der App wird erzwungen. Das Beispiel funktioniert, also habe ich alles im Beispiel kopiert und meine Firebase eingerichtet, aber es funktioniert immer noch nicht.

Um das Problem hinzuzufügen, das @deckerst angesprochen hat, bin ich mir nicht sicher, ob es angemessen ist, dies als geschlossen zu betrachten, wenn es keine Parität zwischen Android und iOS gibt, wenn es darum geht, Code auszuführen, der andere Plugins verwendet

Bearbeiten: Ich habe gerade bemerkt, dass es ein anderes Problem gibt, um dies zu verfolgen

Nur damit dieser Artikel hier für diejenigen verwiesen wird, die ihn nicht gesehen haben:
https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124

Danke @slightfoot. Ich habe das gesehen und dort habe ich das Ticket (#21925) gefunden, um die Headless-Ausführung von iOS mit Plugins zum Laufen zu bringen. Eine Referenz zwischen diesen beiden Tickets wäre nützlich gewesen.

Gibt es in diesem Zusammenhang einen Plan, die kopflose Hinrichtung in die offizielle Dokumentation aufzunehmen, zB als Teil des Kochbuchs? Ich würde es annehmen, dachte aber, es lohnt sich zu fragen, da es wahrscheinlich einen größeren Teil der Community gibt, der nicht wissen würde, wie man Medium überprüft

Guter Punkt @ MaikuB , hat dafür einen Doc-Bug hinzugefügt!

Hintergrund-Unterstützung direkt im Flutter, siehe https://www.youtube.com/watch?v=_LfjILXswJs

Ich verstehe nicht ganz. Wenn Flutter jetzt die Ausführung im Hintergrund unterstützt, warum enthält das Tutorial dann hauptsächlich plattformspezifischen Code?

Holen Sie sich Outlook für Android https://aka.ms/ghei36


Von: Tonka [email protected]
Gesendet: Freitag, 21. September 2018 3:39:28 Uhr
Zu: flattern/flattern
Cc: Philipp Weiss; Erwähnen
Betreff: Betreff: [Flattern/Flattern] Flutter sollte eine Abstraktion für die Ausführung im Hintergrund bereitstellen (#3671)

Hintergrund-Unterstützung direkt im Flutter, siehe https://www.youtube.com/watch?v=_LfjILXswJs


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, sehen Sie sie auf GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423490126 an oder schalten Sie den Thread stumm https://github.com/notifications/unsubscribe-auth/ABWxFrGMGvfFtwkf025Q2Je6lUTZu2aPks5udMHggaJpZM4IVsUk .

@dude8604 Das Tutorial ist für Plugin -Entwickler, die ein Plugin entwickeln möchten, um eine bestimmte Hintergrundoperation auszuführen.

Verbraucher einiger bestimmter Plugins sind (so weit wie möglich) blind gegenüber den plattformspezifischen Implementierungen.

Gibt es also als Verbraucher eine Möglichkeit, beliebigen Code im Hintergrund auszuführen, wenn es kein Plugin für meinen speziellen Anwendungsfall gibt?


Von: Chris Scott [email protected]
Gesendet: Samstag, 22. September 2018 17:43:16 Uhr
Zu: flattern/flattern
Cc: Philipp Weiss; Erwähnen
Betreff: Betreff: [Flattern/Flattern] Flutter sollte eine Abstraktion für die Ausführung im Hintergrund bereitstellen (#3671)

@dude8604 https://github.com/dude8604 Das Tutorial richtet sich an Plugin-Entwickler, die ein Plugin entwickeln möchten, um eine bestimmte Hintergrundoperation auszuführen.

Verbraucher einiger bestimmter Plugins sind (so weit wie möglich) blind gegenüber den plattformspezifischen Implementierungen.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, sehen Sie sie auf GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423783230 an oder schalten Sie den Thread stumm https://github.com/notifications/unsubscribe-auth/ABWxFhmlurQ08wWXLmMvE3E6yQ_lYvS1ks5udtkkgaJpZM4IVsUk .

@ dude8604 Nein.

Soweit mir aktuell bekannt ist:

Sie können keinen beliebigen Code im Hintergrund ausführen. Android ist jetzt streng . iOS war es schon immer.

@ dude8604 , @christocracy ist richtig. Die im Medium-Artikel gezeigte Hintergrundausführungsfunktionalität richtet sich an Entwickler, die Plugins erstellen möchten, die Dart-Code im Hintergrund ausführen können. Die meisten Flutter-Benutzer müssen niemals plattformspezifischen Code für die Ausführung im Hintergrund schreiben, es sei denn, es gibt kein vorhandenes Plugin, das ihrem Anwendungsfall entspricht, da diese Plugins plattformspezifischen Code hinter einer Dart-Schnittstelle abstrahieren.

android_alarm_manager und image_picker scheinen nicht zu funktionieren (wenn beide installiert sind), nachdem sie in ein neues Projekt implementiert wurden, auf dem Flutter 0.8.3-pre.47 ausgeführt wird. Das Schließen der App wird erzwungen. Das Beispiel funktioniert, also habe ich alles im Beispiel kopiert und meine Firebase eingerichtet, aber es funktioniert immer noch nicht.

@rupert2133 würde es Ihnen etwas ausmachen, ein Problem mit weiteren Informationen zu melden? Fühlen Sie sich frei, mich zu erwähnen, damit ich benachrichtigt werde. Dieses Problem bezog sich auf die breitere Anforderung zur Ausführung von Dart-Code im Hintergrund und ist geschlossen, sodass alle zusätzlichen Antworten hier wahrscheinlich begraben werden.

Der android_alarm_manager und der image_picker scheinen danach nicht zu funktionieren (wenn beide installiert sind).

Das erinnert mich. Gestern hatte ich bei der Implementierung von Headless Android in meinem Plugin einen Fehler von googlemaps here .

Wenn alle Plugins im Headless-Zustand neu registriert werden, registrar.activity() == null .

Ich musste das manuell hacken, damit meine App startet:

public static void registerWith(Registrar registrar) {
    final GoogleMapsPlugin plugin = new GoogleMapsPlugin();
+    Activity activity = registrar.activity();
+    if (activity != null) {
      registrar.activity().getApplication().registerActivityLifecycleCallbacks(plugin);
      registrar
              .platformViewRegistry()
              .registerViewFactory(
                      "plugins.flutter.io/google_maps", new GoogleMapFactory(plugin.state, registrar));
+    }
  }

Dies wird ein Problem mit einer großen Anzahl von Plugins sein, vermute ich.

Ich möchte einen Hintergrunddienst ausführen und bestimmte Ereignisse auslesen, die Daten verarbeiten und möglicherweise aufzeichnen und gegebenenfalls eine Benachrichtigung erstellen, die die Haupt-App startet, wenn sie gedrückt wird. Einige Beispiele für Ereignisse wären: Neues Bluetooth-Gerät in Reichweite, eingehende Daten an einer Steckdose, eingehende Daten von einem USB-Gerät, empfangene SMS, GPS-Standort geändert, Verbindungsversuch eines Bluetooth-Geräts, eine bestimmte physische Taste wird gedrückt, Beschleunigungsmesserdaten überschreiten a angegebenen Wert, wenn die Haupt-App beendet wird, und viele andere Dinge, an die ich nicht denke. Wenn jemand ein umfassendes Plugin (mit einer kostenlosen oder Open-Source-Lizenz) dafür erstellen könnte, das auf iOS und Android funktioniert, könnte dieses Problem meiner Meinung nach geschlossen werden. Und ich wäre unendlich dankbar, dass ich mit Flutter anfangen kann zu entwickeln.

@bkonyi Welche der oben genannten Dinge kann ich derzeit mit bestehenden Plugins tun? Kann ich AlarmManager verwenden, um diese Ereignisse abzufragen? Aber AlarmManager funktioniert nicht unter iOS, oder?

@dude8604 Das Beste, was Sie für regelmäßige Ereignisse auf iOS erhalten, ist über die API "background-fetch". Ich werde dieses Plugin bald auf Flattern portieren.

Die iOS „Background Fetch“-API weckt etwa alle 15 Minuten (dies ist das schnellstmögliche Intervall ) eine schlafende App im Hintergrund, wodurch Ihre App genau 30 Sekunden Hintergrundlaufzeit erhält. iOS verwendet jedoch (vermutlich) maschinelles Lernen und drosselt dies basierend auf der Tageszeit und der Häufigkeit der Geräte-/App-Nutzung (z. B.: Nachts, wenn der Benutzer vermutlich schläft, können Abrufereignisse einmal pro Stunde eintreten.

@christocracy @bkonyi Also könnten all diese und ihre Android-Äquivalente in ein Plugin umgewandelt werden? Wie kann ich dafür einen Feature Request stellen?

@dude8604 Du kannst nicht einfach einen Zauberstab schwingen und *poof* . Du ziehst deine Arbeitshandschuhe an und machst es selbst. Wenn Sie es nicht selbst schaffen können, finden Sie jemanden, der es kann , und zahlen ihm Zehntausende von Dollar.

@christocracy Sie haben Recht, aber ich hatte gehofft, dass eines der größten Unternehmen der Welt über die Ressourcen verfügt, um ein voll funktionsfähiges Produkt zu entwickeln, und nicht von seinen Benutzern verlangt, Zehntausende von Dollar auszugeben, um es brauchbar genug zu machen.

Nun, ja, es ist ein großes Unternehmen.

Diese Körperschaft besteht auch aus Einzelpersonen, die nicht allgegenwärtig sind. Kein Framework kann jemals alles out-of-the-box abdecken, denn wenn Sie es versuchen, wird Ihr Projekt zu einem brennenden Haufen ... nun ja, Müll.
Es gibt Hunderte von plattformspezifischen APIs und kein einzelnes Team wird sie abdecken. Einiges musst du selbst binden.

@ dude8604 Bedenken Sie, dass Ihre Definition von "voll ausgestattet" nicht mit meiner übereinstimmt. Ihre Aufgabe ist es, die Kreuzung zu behandeln.

1 f you write this

Haben wir eine klare Richtung von Dokumenten? Ich habe gesehen, dass Release Preview 2 sagt, dass es die Hintergrundausführung unterstützt. Einige Beispiele wären gut zu gehen.

@Pushan-Gupta Hintergrundausführung ist eine Plugin-spezifische Sache.

Es hängt davon ab, was Sie tun möchten. Standort verfolgen? Push-Benachrichtigungen erhalten? Geofences überwachen? BT-Geräte erkennen? Leuchtfeuer? Spiel Musik?

Es gibt keinen „einen Ring, der sie alle regiert, Unterstützung für die Ausführung im Hintergrund“

@christocracy Sorry, das wusste ich nicht. Ich hatte ein bestimmtes Ziel. Angenommen, ich möchte einige Beiträge von der App anfordern. Aber die Verbindung ist weg. Sobald das Gerät wieder online ist, unabhängig davon, ob die App geöffnet ist oder nicht, muss die Warteschlange dieser Postanfragen verarbeitet werden.

Beispiel: Whatsapp stellt Nachrichten in die Warteschlange, bevor sie an den Server gesendet werden. Wenn das Gerät offline ist, speichert es die Warteschlange und bedient sie, sobald es online ist.

Übrigens habe ich eine PR am Laufen, in der die Plugin-Registrierung für Hintergrundisolate diskutiert wird. Falls jemand eine Idee hat...

https://github.com/flutter/engine/pull/6396

Was ist der Sinn von FlutterHeadlessDartRunner derzeit?
Ich habe derzeit die Hintergrundausführung auf Android implementiert (kein Plugin, nur FlutterNativeView(ctx, true) ), und das war ziemlich einfach.
Aber unter iOS stürzt es nur ab

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: <strong i="10">@escaping</strong> () -> Void) {
    let headless = FlutterHeadlessDartRunner.init()
    headless.run(withEntrypoint: "main") // just EXC_BAD_ACCESS here
}

Hallo,
Bitte helfen Sie in der Erinnerungs-App in Flutter ios

@MohdLucky Und die Hilfe, die Sie brauchen, ist ...?

@christocracy , hast du bitte ein Update zum Implementierungsstatus des background_fetch-Plugins?

Aktualisierung des Implementierungsstatus des background_fetch-Plug-ins nicht, bitte stellen Sie einen Beispielcode für bereit
Laufende Hintergrundbenachrichtigung.

Jedes Update dazu ... Ich dachte wirklich, dass dies Teil von Flattern ist :( .. das sind dann so ziemlich die gleichen Probleme wie bei anderen Web-Hybrid-Lösungen ...

@radvansky-tomas Ich weiß nicht, warum die Leute einfach nicht verstehen, dass dies nicht in der Verantwortung von Flattern liegt. Auch wenn Sie die Ausführung im Hintergrund nativ implementieren müssen, haben Sie immer noch den Vorteil einer einzigen Codebasis. Das Schreiben eines Flutter-Plugins, das Ihre Hintergrundarbeit erledigt, erfordert nur ein oder zwei Arbeitstage. Ich hatte das gleiche Problem, ich brauchte einen Android-Dienst, der in der Lage wäre, Musik für mich abzuspielen. Ich habe es einfach in Kotlin geschrieben, die Kommunikationsschicht mit Flutter implementiert und später dasselbe für iOS gemacht.
Es ist durchaus möglich, nur die nativen Hintergrundsysteme des Systems zu verwenden.
Anstatt hier herumzujammern, dass X nicht implementiert ist, können Sie es buchstäblich problemlos über das vom Team bereitgestellte Ökosystem implementieren.

@SirWindfield Leider weißt du nicht, wovon du sprichst. Dies ist ein wesentlicher Bestandteil der Architektur, nicht das Plugin selbst.

Flutter wird als plattformübergreifende Lösung präsentiert, die nativen Code erzeugt, dh es wird erwartet, dass es Code in seiner Sprache (Dart) ausführen kann, wann immer das Betriebssystem dies zulässt.

Wenn die App also ausgeführt wird, nachdem die Remote-Benachrichtigung empfangen wurde, und Sie einen Haltepunkt in den vorhandenen nativen Code einfügen können, sollten Sie in der Lage sein, Ihren Flatter-/Dart-Code aufzurufen, wo sich Ihre Dienste, Modelle und schließlich die Benutzeroberfläche befinden.

Um es in Ihrem Fall zu machen ... nehmen wir an, dass Ihre Musik im Hintergrund abgespielt wird und Sie dann Ihre Wiedergabeliste beenden ... nach 10 Minuten wird Ihre App heruntergefahren. Dann rufen Sie Siri an oder verwenden Kopfhörer, um die Wiedergabe Ihrer App erneut zu starten, welchen Einstiegspunkt Sie auch immer gewählt haben ... nativer Code wird ausgeführt, aber nicht seine Benutzeroberfläche, Ihr Flattercode wird nicht initialisiert und Sie sind verloren, da ich mit meinen Benachrichtigungen bin.

Also nein, es ist nicht möglich, ich kann native Plugin-Catching-Benachrichtigungen für mich schreiben, aber dann brauche ich Zugriff auf Flatter-Geschäftslogik, um Daten zu verarbeiten, in meinem Fall Krypto-Entschlüsselung und Freigabe lokaler Benachrichtigungen mit entschlüsselten Inhalten

Wir werden, ich habe es auf meinem Handy ausgiebig getestet und es funktioniert ohne Probleme.
Es kann jedoch sein, dass mein Telefon die App nie beendet hat. Meine schlechte dann.

@christocracy irgendein Update bezüglich des background_fetch Plugins Chris?

@ethael Hier ist das leere Repo, in dem Sie nach Updates suchen können.
https://github.com/transistorsoft/flutter_background_fetch

@radvansky-tomas Sie können Hintergrundereignisse in Dart-Code verarbeiten, indem Sie ein Hintergrundisolat erstellen, wie in diesem Medium-Beitrag zur Hintergrundausführung beschrieben. Wahrscheinlich müssen Sie für jede Plattform nativen Code schreiben, der Ihren speziellen Anforderungen entspricht, es sei denn, es gibt bereits ein Plugin, das das tut, was Sie wollen (unwahrscheinlich, da mir nicht bekannt ist, dass viele Plugins im Moment die Ausführung im Hintergrund unterstützen).

@bkonyi Vielen Dank für die Antwort, ich habe begonnen, das firebase_messaging-Plugin zu ändern, um die Ausführung im Hintergrund zu unterstützen ... aber bei diesem Problem geht es eher um eine generische Methode, dies zu tun. Ich meine, es sollte Teil von template = runner und seiner Dart-Seite sein, wo Entwickler solchen kopflosen Code, einige Regeln, Musterstandards ausführen können, wie es jetzt überall in einigen Blogs, Vorschlägen usw. der Fall ist.

Erste Arbeiten erledigt: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging

Befolgen Sie einige Anleitungen von https://github.com/bkonyi/FlutterGeofencing

Ich sollte es Ende dieser Woche fertigstellen, ich arbeite vorerst nur an iOS-Bits. Das Beispielprojekt verwendet ein lokales Benachrichtigungs-Plugin, um anzuzeigen, dass die Nachricht im Hintergrund empfangen wurde (stille Benachrichtigung), und veröffentlicht dann eine neue lokale, um den Erfolg zu manifestieren.

Erste Arbeiten erledigt: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging

Befolgen Sie einige Anleitungen von https://github.com/bkonyi/FlutterGeofencing

Ich sollte es Ende dieser Woche fertigstellen, ich arbeite vorerst nur an iOS-Bits. Das Beispielprojekt verwendet ein lokales Benachrichtigungs-Plugin, um anzuzeigen, dass die Nachricht im Hintergrund empfangen wurde (stille Benachrichtigung), und veröffentlicht dann eine neue lokale, um den Erfolg zu manifestieren.

@goderbauer und ich wollten diese Unterstützung eigentlich hinzufügen, aber wir helfen Ihnen gerne mit Design und Überprüfungen, wenn Sie vorhaben, eine Pull-Anfrage zu stellen.

Ich habe diesen Teil also so gut wie abgeschlossen, sodass ich jetzt stille Push-Benachrichtigungen erhalten kann und mein in Dart geschriebener Rückruf ausgeführt wird, während die App im Hintergrund läuft.

Allerdings kann ich dort auf kein anderes Plugin zugreifen. Callback muss eine Root-/statische Methode sein und weiß wirklich nicht, wie man von dort aus irgendetwas aufruft.

Also habe ich versucht, einen einfachen Test zu machen, um das Flatter-Plugin für lokale Benachrichtigungen zu verwenden, um eine lokale Benachrichtigung zu senden, nachdem eine stille Benachrichtigung empfangen wurde, aber das Plugin scheint nicht zugänglich zu sein (nicht registriert?).

Ähnliche Beiträge habe ich hier gefunden: https://github.com/flutter/engine/pull/6396

Gibt es einen anderen notwendigen Schritt, den ich tun muss, um diese Plugins zu laden?

Mein Rückruf auf Root-Ebene:
void callback(FirebaseMessage m, MessageEvent e) async { print('Message $m Event: $e'); final SendPort send = IsolateNameServer.lookupPortByName('messaging_send_port'); send?.send(e.toString()); }

Die Frage ist nicht, wie man von diesem Callback aus auf alle Dart-Codes + Plugins zugreifen kann ... Firestore abfragen usw

Meine Background-Fetch-Implementierung ist endlich veröffentlicht.
background_fetch

@christocracy Sie haben Recht, aber ich hatte gehofft, dass eines der größten Unternehmen der Welt über die Ressourcen verfügt, um ein voll funktionsfähiges Produkt zu entwickeln, und nicht von seinen Benutzern verlangt, Zehntausende von Dollar auszugeben, um es brauchbar genug zu machen.

Das ist wirklich wahr. Wenn Sie die Zeit der Menschen gewinnen, sollten Sie ihnen etwas zurückgeben. Wenn nicht, dann machen Sie diese ausgefallenen Marketingtitel nicht!

Es scheint, als ob dieses Problem den Leuten immer noch Sorgen bereitet? Es ist geschlossen und enthält viele Kommentare, daher ist es unwahrscheinlich, dass wir viele konkrete Projektänderungen aus dieser Ausgabe vornehmen werden. :( (Wir müssen neue einreichen, um weitere Fortschritte zu erzielen, erwarte ich.)

Ich wäre sehr daran interessiert, dass wir hier die konkreten Änderungswünsche dokumentieren. Klingt so, als wären weitere Hintergrundbeispiele erwünscht? (zB https://github.com/flutter/flutter/issues/23794)

In jedem Fall würden wir gerne einzelne Probleme mit individuellen Anfragen archivieren. Wie andere oben angemerkt haben, ist Flutter ein großes und komplexes Projekt, und obwohl wir hier bei Google ein großes (und schnell wachsendes) Team haben, haben wir immer noch nicht genug Ingenieure, die Vollzeit an Flutter arbeiten, um alle Probleme gleichzeitig zu lösen. Flutter ist zu 100 % Open Source und alle unsere Ausgaben sind auf GitHub. Patches sind natürlich immer willkommen. :)

Für alle gewünschten Probleme/Änderungen reichen Sie bitte neue Probleme ein, um alle Mitwirkenden wissen zu lassen, wie wir weiter helfen können: https://github.com/flutter/flutter/issues/new

Danke!

@eseidel Herausforderung angenommen: #24278

Ich hatte gehofft zu vermeiden, gerätespezifischen Code zu schreiben und eine Flutter Dart API-Implementierung zu haben, die möglicherweise auf Ereignissen basiert, die Geräte- und Betriebssystemspezifikationen und spezifische Implementierungen verbergen würden.

hier schon gelöst

@ Krunal79-flutter wie genau, dieser Ansatz hätte immer noch die gleichen Probleme. Die Sache ist, dass in Ihrem Szenario das Flattern bereits initialisiert ist und es dann keinen ordnungsgemäßen Hintergrundzugriff gibt. Das Problem, das ich hatte und habe, ist, wenn die App tatsächlich tot ist und die stille Benachrichtigung (oder App-Erweiterung) Ihre App aufweckt und Sie die "Dart" -Logik ausführen müssen, während Flattern noch nicht ausgeführt wird (dh keine Benutzeroberfläche vorhanden ist).

Dies sollte wirklich ein Thema mit viel höherer Priorität für jeden sein, der das Flutter-Team leitet. Die Implementierung von Hintergrundfunktionen ist für den durchschnittlichen Flutter-Entwickler ein großer Schmerz und bricht oft auf nicht triviale Weise zusammen. Und ich bin mir sicher, dass viele App-Entwickler derzeit damit zu kämpfen haben.

@tomoerlemans010 siehe bitte den Kommentar in https://github.com/flutter/flutter/issues/3671#issuecomment -438113161.

Dieses spezielle Problem ist geschlossen. Bitte fügen Sie Kommentare zu anderen offenen Problemen im Zusammenhang mit der Ausführung im Hintergrund hinzu oder erstellen Sie ein neues mit den Problemen, mit denen Sie konfrontiert sind.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen