Vor kurzem habe ich wieder geklemmt. Ich lebe in Europa und hier verketten sie das Geld Ihres Autos, anstatt Geldstrafen für unsachgemäßes Parken und Abschleppwagen zu verhängen. Um rauszukommen, müssen Sie einen Anruf tätigen, eine runde Summe bezahlen und darauf warten, dass der Mann mit den Schlüsseln die Kette anhebt. Es ist lang, demütigend und manchmal (je nach Region) räuberisch teuer.
An diesem Tag war ich überall zu spät. Ich wartete darauf, dass der Arbeiter mit den Schlüsseln klingelte, und fragte mich, wie dumm ich wurde. Ich rannte hinein, verließ das Auto für eine halbe Stunde anstatt der maximal 20 Minuten - genau in der 21. Minute und wurde erwischt. Leider war der gestreifte Van des Parkplatzes nicht weit entfernt und sie reagierten sofort. Sie hatten mich aus verschiedenen Gründen schon einmal erwischt: Ich vergaß, die bezahlte Frist lief ab, und manchmal konnte ich mein Auto einfach nicht im Labyrinth der Straßen finden.
"Es muss für alles eine Anwendung geben", dachte ich und begann, in den App Store einzutauchen. Nach einer Menge zweifelhafter Ergebnisse nahm mein Selbstvertrauen ab und ich beschloss zu klären: "Es muss für alles eine Android-Anwendung geben." Dann fand er seinen Huavei und stieg in den Darm des Spielladens. Von dort ergossen sich weitere Trümmer auf mich, und als ich in ungeschicktem Handwerk ertrank, spuckte ich aus. Entweder sehe ich irgendwie falsch aus oder es gibt keinen bequemen und verständlichen Park-Tracker. Die Schlussfolgerung ist einfach: Wenn wir nichts haben, machen wir es selbst.
Vor dem Hintergrund sah ich bereits einen
langfristigen Bau , der mir fast meine gesamte Freizeit nahm. Ich beschloss, eine Pause einzulegen und in der Pause eine weitere Projektion zu sammeln. Nachdem ich die gewünschte Funktionalität geschätzt hatte, stellte ich mir einen Zeitraum von anderthalb Monaten vor. Mit Blick auf die Zukunft werde ich sagen, dass es im Prinzip noch schneller geworden ist. Das Ergebnis war eine kompakte und saubere
Anwendung auf beiden Plattformen, sehr praktisch. Jetzt benutze ich es selbst und schlage vor, dass Sie es versuchen.

Idee
Was möchte ich von einem Park-Tracker? Was vermisse ich immer, wenn ich eine Geldstrafe bekomme? Nach dem Nachdenken formulierte ich die folgende Einführung:
- Einfach. Idealerweise mit einem Knopfdruck. Ein Minimum an ablenkenden Funktionen: keine Profile, Parkverlauf, Unterstützung für mehrere Autos gleichzeitig usw.
- Mit Benachrichtigungen. Ich würde das Auto nicht vergessen, wenn mich die Bewerbung daran erinnern würde: Bruder, du hast dort übrigens einen Parkplatz und es läuft bald ab.
- Betrachten Sie die Gehzeit. Dies ist der einfachste Gedanke, den ich nirgendwo verkörpert gesehen habe. Ich muss nicht wissen, dass der Parkplatz in 5 Minuten abläuft, wenn ich eine halbe Stunde davon entfernt bin. Ich muss daran erinnert werden, dass ich ein paar Minuten vor dem Ende zum Auto komme und gehe.
- Route und Navigation zum Parkplatz. Navigation natürlich über Google oder Apple Maps, aber die Route kann in Ihrer Anwendung angezeigt werden. Dies ist hilfreich, wenn Sie das Auto in einem unbekannten Bereich stehen lassen, der Timer tickt und Sie im Kreis durch dieselben Straßen laufen.
Ich habe Flutter als technologische Basis gewählt, da ich seit einiger Zeit damit arbeite und es für gut halte. Für Routen habe ich mich entschieden, die HERE-API auch nicht zum ersten Mal zu verwenden, sondern für die Karte - Mapbox. Ich skizzierte mehrere Optionen für die Benutzeroberfläche, wählte die minimalistischste aus und beteiligte mich an der Arbeit.
Entwicklung
Über den Entwicklungsprozess selbst gibt es grundsätzlich nicht viel zu erzählen. Hier gibt es keinen Serverteil, den einfachsten Client, der im Wesentlichen aus einer großen Ansicht in verschiedenen Zuständen besteht. Auf der ersten Seite wählen Sie entweder eine Voreinstellung aus - 1, 2, 4, 6 Stunden - oder verwenden den Schieberegler, um Ihre Parkdauer anzupassen. Nachdem ich es live ausprobiert hatte, stellte ich fest, dass der Schieberegler unhöflich genug war, und fügte die Schaltflächen „+“ und „-“ hinzu. Eine lustige und ziemlich offensichtliche Nuance war, dass die Zeit weitergeht, während Sie sich entscheiden. Sie müssen diese Ansicht also in Echtzeit aktualisieren. Klicken Sie nach Auswahl des Begriffs auf die einzige Schaltfläche unten. Die Standort- und Zeitdaten werden gespeichert und das Parken beginnt. Es ist wichtig zu beachten, dass ich grundsätzlich alle Daten an Bord speichere, nichts wird auf einen Server übertragen. Das wird mir in Zukunft übrigens Schwierigkeiten bereiten, aber dazu später mehr.
Die zweite Seite ist in der Tat der Park-Timer. Ich habe hier eine Reihe von Optionen ausprobiert: Ich habe mit wild überladenen Prototypen von Informationen begonnen, sie dann iterativ entfernt und bis an die Grenzen vereinfacht. Ich wollte wirklich, dass der Parkstatus nicht trocken, sondern visuell angezeigt wird. Daher war das Hauptelement dieser Seite zusammen mit der Karte eine Donut-Tabelle. Es zeigt die verstrichene Zeit, die Gehzeit und die verbleibende Zeit. Wenn Sie sich nicht in der Nähe des Autos befinden und die Gehzeit ungleich Null ist, wird eine Navigationsstartschaltfläche angezeigt und auf der Karte wird eine ungefähre Route zum Parkplatz angezeigt. Das ist in der Tat alles.
Trotz der visuellen Einfachheit hat dieser Bildschirm meine Nerven ziemlich durcheinander gebracht. Es versteht sich, dass während des Parkens eine Reihe von Prozessen gleichzeitig ablaufen:
- Die Zeit vergeht und der Timer läuft ab
- Sie bewegen sich und die Reisezeit ändert sich
All dies geschieht in Echtzeit und sollte sofort auf der Benutzeroberfläche angezeigt werden. Die Karte sollte reibungslos neu erstellt werden, die Karte sollte sich bewegen und die Route neu zeichnen. Wenn die Gefahr einer Verspätung besteht oder das Parken abläuft, sollte auch die entsprechende Warnung angezeigt werden. Außerdem: Wenn Sie die Anwendung schließen und öffnen, müssen Sie dies alles korrekt wiederherstellen. Und schließlich das Beängstigende: Alle Funktionen sollten im Hintergrund arbeiten können, da die Anwendung den größten Teil ihres Lebens im Hintergrund verbringen wird. Solche Dinge.
Ich werde die Implementierung nicht im Detail beschreiben, ich kann nur sagen, dass die Flatterarbeit mit den Staaten sehr würdig ist. Wo sich in einem reinen Android ein überladenes objektorientiertes Design herausstellen würde, stellte sich heraus, dass es einfach und elegant war. Normale verständliche Zustände, vernünftige Bindung von Ansichten an Modelle - bei Aufgaben wie diesem leuchtet das Flattern. Es war jedoch nicht ohne typische Pfosten: Beispielsweise hat die lokale Bibliothek zum Arbeiten mit Karten keinen animierten Übergang zu neuen Koordinaten. Ich musste in ihren Code einsteigen, einige private Methoden herausholen und meine Krücke hinzufügen. Es ist möglich, dass diese Funktionalität bald hinzugefügt wird, aber dies ist das ganze Flattern - seien Sie bei aller Attraktivität auf solche Entdeckungen vorbereitet.
Alles andere schien reibungslos zu funktionieren. Eigentlich gab es nicht viel anderes: ein paar Dialoge und eine Intro-Seite, für die meine Freundin (sie war
Künstlerin ) nette Animationen zeichnete. Schließlich übersetzte ich die gesamte Anwendung einschließlich der Karte ins Russische. Aber dann begann der Schmerz: Benachrichtigungen.
Benachrichtigungen
Für mich war die Möglichkeit, intelligente Benachrichtigungen zu senden, der Schlüssel zur Anwendung - ohne sie gibt es nichts, worüber man sich aufregen könnte. Als ich jedoch anfing, an dieser Funktion zu arbeiten, stellte ich fest, dass ich auf meinen eigenen Fuß getreten war. Es gab tatsächlich zwei Probleme. Das erste ist das Flattern, das nicht weiß, wie man mit Low-Level-API-Geräten arbeitet: Sie müssen eine Dichtung in Form eines Plug-Ins schreiben, das zwei native Codes und eine Abstraktion auf dem Pfeil enthält. Das zweite Problem ist meine grundsätzliche Position, dass alles an Bord durchgeführt werden sollte. Wir fassen also zusammen, was benötigt wird. Es ist notwendig, dass die Anwendung
im Hintergrund :
- Ständige Überwachung Ihrer Geolokalisierung,
- Überprüft, wie viele Minuten zu Fuß zum Parkplatz
- Wird mit ablaufendem Timer überprüft
- Wenn das Risiko besteht, keine Zeit für die Rückkehr zu haben, wird ein Benachrichtigungsschuss erstellt
Fühlen Sie das Ausmaß der Tragödie? Es ist klar, dass es keine technische Möglichkeit gibt, dies zu tun, wenn die Anwendung vollständig beendet wird. Angenommen, es wird einfach minimiert und der Bildschirm ist ausgeschaltet. HIER gibt mir die API die Route und die Schätzung der Gehzeit. Bedeutet dies, dass die Anwendung im Hintergrund Spam-Anfragen sendet? Wie viel Code wird überhaupt ausgeführt? Wie gehen wir mit Gedächtnis und Energieverbrauch um?
Ich setzte mich zum Nachdenken. Begonnen mit einem kleinen: Technisch gesehen hatte Flutter in letzter Zeit die Möglichkeit, Code im Hintergrund auszuführen. Es wird als isolieren bezeichnet. Wenn alles korrekt geschrieben ist, können Sie die Logik auf eine bestimmte Weise erstellen, sodass nicht alles vor dem Hintergrund ausgeführt wird, sondern bestimmte Funktionen. In der Tat müssen wir im minimierten Modus keine Schnittstellen zeichnen oder Zustände aktualisieren - wir sind an der bloßen Logik der Zeitberechnung interessiert, und diese Logik ist ziemlich kompakt und billig. Gleichzeitig sollte es nicht wie in der Originalversion durch eine Änderung der Geolokalisierung ausgelöst werden, sondern durch einen internen Timer. Denn die Benachrichtigung sollte fliegen, auch wenn Sie sich nicht bewegen, sondern still sitzen.
Nun, wir haben einen leichtgewichtigen Code geschrieben, der im Hintergrund ausgeführt werden kann und von einem Timer gesteuert wird. Wie können wir es im Rahmen nativer Anwendungen auslösen und dort Geolokalisierungsdaten übertragen? Es stellte sich anders heraus.
Die Logik von Android und iPhone in Bezug auf die Codeausführung im Hintergrund ist radikal anders. Bei einem iPhone fehlt es als solches: Der Hintergrundcode kann nur ein Systemereignis einer bestimmten Art auslösen, z. B. das Abspielen von Audio-Streaming oder, zum Glück für mich, das Aktualisieren des Standorts. Fordern Sie dazu einfach Berechtigungen an und abonnieren Sie das Ereignis im nativen Teil des Flater-Plug-Ins. Von dort aus rufen wir über einen bestimmten Kommunikationskanal (MethodChannel) den Rückruf in einem Pfeil auf, übergeben die Geodaten an ihn und beginnen den Hintergrund mit der Logik, die wir benötigen. Schönheit
Android funktioniert anders. Technisch gesehen kann er Code im Hintergrund ausführen, ohne an Systemereignisse gebunden zu sein. Dazu müssen Sie den Dienst beschreiben. Es hängt getrennt von der Anwendung, entweder vollständig im Hintergrund oder auf dem Untergrund (dort macht es sich durch eine angehängte Nachricht im Blind bemerkbar). Es scheint, dass das Problem behoben wurde: Im nativen Teil des Plugins beschreiben wir einen Hintergrunddienst, der den Speicherort verfolgt und den Darth-Code abruft. Es gibt jedoch eine Nuance. Ab Android Version 8.0 hat sich die Einstellung zu solchen Diensten geändert: Wenn die Anwendung derzeit minimiert wird, werden ihre Hintergrunddienste höllisch von der Achse abgeschnitten, um Energie zu sparen. Und wenn Ihr Code beispielsweise eine Datensicherung durchführt, ist es Ihnen im Grunde egal, zu welchem Zeitpunkt die Achse ihn arbeiten lässt - Hauptsache, er funktioniert. In meinem Fall müssen wir den Ortswechsel jedoch fast in Echtzeit verfolgen, und das Timing ist hier entscheidend. Daher besteht der einzige Ausweg darin, den Dienst fehlerfrei zu starten. Wir beschreiben eine kleine Benachrichtigung im Vorhang, abonnieren den Ort und senden ihn über den MethodChannel an den Dart. Alles scheint zu funktionieren.
Übrigens, zurück zu den Themen Speicher, Energieverbrauch und Anzahl der Anforderungen - der Code wird ausgeführt, wenn der Standort auf 50 Meter verschoben wird, oder per Timer. Außerdem ist er selbst sehr leicht und die Anfragen gehen nicht durch mich, sondern gehen direkt zur HIER-API. Ich selbst erhalte keine Daten und speichere sie nirgendwo. Im Allgemeinen ist eine solche Implementierung hier sehr gut beschrieben, dies ist der Blog eines der Flatteringenieure - der Code ist auch dort beigefügt. Sein Beispiel ist etwas anders, aber der allgemeine Ansatz ist klar, deshalb empfehle ich, es zu lesen.
Ergebnis
Das ist in der Tat alles. Für einen Monat Freizeit habe ich eine Anwendung erhalten, die ein bestimmtes Problem perfekt löst. Ich hoffe, dieser Artikel wird für jemanden interessant sein und die Anwendung wird Sie vor Geldstrafen und Stress bewahren. Sie können hier schauen und schimpfen:
Android ,
iOS .
Vielen Dank für Ihre Aufmerksamkeit.