Flutter-geolocator: Future löst sich nie auf IOS13 auf

Erstellt am 29. Apr. 2020  Â·  63Kommentare  Â·  Quelle: Baseflow/flutter-geolocator

🐛 Fehlerbericht

Wenn ich versuche,CurrentLocation zu bekommen, wird es nie aufgelöst. Ich bin kein iOS-Experte, also bitte, wenn ich etwas vergessen habe, erklÀre es mir einfach.

Future<Position> getCurrentPosition({
    LocationAccuracy accuracy = LocationAccuracy.best,
    GeolocationPermission geolocationPermission =
        GeolocationPermission.location,
  }) =>
      _geolocator.getCurrentPosition(
        desiredAccuracy: accuracy,
        locationPermissionLevel: geolocationPermission,
      );

Podfile:

config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

        ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
         'PERMISSION_LOCATION=1',
      ]

Info.plist:

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Need location when in use</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Always and when in use!</string>
    <key>NSLocationUsageDescription</key>
    <string>Older devices need location.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Can I haz location always?</string>

BEARBEITEN:

Ich habe es auf einem echten Android-GerÀt getestet und das Problem tritt auch auf.

Meine Manifest-Standortberechtigungen:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Erwartetes Verhalten

Geben Sie eine Position zurĂŒck.

Reproduktionsschritte

Rufen Sie einfach geolocator.GetCurrentPosition auf.

Version: 5.1.5.

Plattform:

  • [x] :iphone: iOS (getestet mit IOS-Simulator)
  • [x] :robot: Android (Getestet auf einem Xiomi Pocophone F1 mit Android 10QkQ1.190828.002)
android ios triage

Hilfreichster Kommentar

Hallo zusammen,

Ich freue mich, die von mir (endlich) veröffentlichte Version 6.0.0-rc.1 ankĂŒndigen zu können, die all diese Probleme beseitigen sollte.

Ich wĂŒrde mich sehr freuen, wenn Sie es ausprobieren und mir Ihr Feedback geben könnten.

Alle 63 Kommentare

Ich bekomme den gleichen Fehler. Dies geschieht sowohl auf iOS als auch auf Android. . . .

Ich erhalte den gleichen Fehler auf dem Simulator mit iOS 10.3 oder iOS 13.4 und auch auf meinem iPad mit iOS 13.4 .

mycode.dart:

Position pos = await Geolocator()
              .getCurrentPosition(
                  locationPermissionLevel:
                      GeolocationPermission.locationWhenInUse,
                  desiredAccuracy: LocationAccuracy.high)

Info.plist:

<key>NSLocationAlwaysUsageDescription</key>
<string>Can I haz location always?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need location when in use</string>

Version: 5.3.1

Gleiches Problem bei mir unter Android 8.0. Ich erwÀge, einen 10-Sekunden-Timer direkt in den Quellcode zu schreiben, der bei Erreichen ausgelöst wird.

@brenoasm tritt dieses Problem auf dem Simulator oder auf einem echten GerÀt auf?

@dammel Am Simulator ist es wichtig, den Simulator so zu konfigurieren, dass er einen Standort ausgibt. Dies kann ĂŒber die folgenden MenĂŒpunkte der Simulatoranwendung erfolgen: Funktionen -> Ort -> (wĂ€hlen Sie eine andere Option als "keine").

@mvanbeusekom Was ist, wenn ein echtes GerÀt keinen Standort ausgibt? Es sollte nicht sein, wenn der Benutzer GPS ausgeschaltet hÀtte, oder?

@mvanbeusekom Ich habe auf dem Simulator fĂŒr IOS getestet (ich habe kein IPhone, um es auf einem echten GerĂ€t zu testen). Ich habe es auf einem echten Android-GerĂ€t getestet und habe das gleiche Problem ... Ich werde die Informationen zu meinem Android-GerĂ€t bearbeiten und hinzufĂŒgen.

Ich habe das gleiche Problem mit einem echten Android-GerÀt ...

@mvanbeusekom Danke fĂŒr deine Hilfe. Dein Tipp fĂŒr die Simulatoren hat bei mir funktioniert.
Ich habe nichts geÀndert, aber es funktioniert jetzt wieder auf dem iPad (echtes GerÀt).

Getestet auf einem iOS-Simulator und einem iOS-GerÀt, hatte ich kein Problem, aber ich habe das gleiche Problem auf einem Android-Emulator

Ich werde versuchen, meinen Fall im Detail zu erklÀren.

Erstens tritt das Problem sowohl auf Android- als auch auf iPhone-GerÀten auf (ich verwende Testflight, um die App mit meinem QA-Team zu testen), aber auch im Android-Emulator und iOS-Simulator.

Die Methode 'getCurrentPosition' gibt manchmal keine Position zurĂŒck, aber nach einer Reihe von Versuchen tut sie es. Ich habe dieses Problem normalerweise, wenn ich die App zum ersten Mal installiere. Nach einer gewissen Zeit beginnt die Methode plötzlich, Ihnen die aktuelle Position zu bringen.

Das Problem bei diesem Problem ist, dass es nicht immer passiert. Sie können die App installieren, und manchmal gibt die Methode beim ersten Versuch die aktuelle Position zurĂŒck ...

ZusÀtzliche Anmerkungen:

  1. Wenn die Methode gut funktioniert und ich einen Hot Reload oder einen Hot Restart durchfĂŒhre, funktioniert die Methode weiterhin gut
  2. Die Methode löst keine Ausnahme aus ... aber wenn Sie ein 'await' eingeben, stoppt sie auf unbestimmte Zeit
  3. Ich habe versucht, eine Àltere Version von Geolocator zu verwenden, und das Problem besteht weiterhin
  4. Ich verwende Google Maps in meinem Projekt, daher dachte ich: "Vielleicht gibt es einen Konflikt mit einer neueren Version von Maps ... ?". Nö. Ich kompiliere mit alten Versionen von Google Maps und das Problem bleibt bestehen
  5. Das MerkwĂŒrdige ist, dass ich dieses Problem vor einigen Wochen nicht hatte ...

Mein Umfeld:

$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Linux, locale en_GB.UTF-8)

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Android Studio (version 3.6)
[✓] IntelliJ IDEA Community Edition (version 2019.3)
[✓] Connected device (2 available)

‱ No issues found!

Übergangslösung in meinem Projekt:

  1. Ich habe der Methode 'getCurrentPosition' ein Timeout hinzugefĂŒgt, und wenn sie 'null' zurĂŒckgibt, starte ich einen Timer und versuche es immer wieder ... nach einer Weile (manchmal Sekunden, manchmal sogar eine Minute) gibt die Methode die aktuelle Position zurĂŒck
  2. Wenn ich eine Anfangsposition benötige, verwende ich die Methode 'getLastKnownPosition()'

Ich denke, # 375 und # 386 beziehen sich auf dieses Problem

Hier das gleiche Problem, LG G6, Android 9.0.

Löst sich nie.

Es gibt einen seltsamen Weg, wie ich es zum Laufen bringen kann:
Ich starte die Google Maps App, um die Position dort zu erhalten. Dazu muss ich den Positionssensor und das WLAN aktivieren (wahrscheinlich wĂŒrde auch die mobile Datenverbindung funktionieren, nicht getestet).
So bekomme ich die Position in Google Maps.
Danach funktioniert es auch in meiner App (egal ob meine App danach gestartet wurde oder bereits lÀuft).
Wenn ich WLAN beende oder die Position ausschalte dann funktioniert es nicht mehr, auch wenn ich sie wieder einschalte.

Das Schließen von Google Maps zu einem beliebigen Zeitpunkt, auch bevor meine App geöffnet ist, spielt keine Rolle (aber manchmal muss ich Google Maps mehr als einmal öffnen.)
Es scheint mir, als ob Google Maps etwas festlegt, das auch nach dem Schließen von Maps bestehen bleibt und vom Geolocator benötigt wird.

Bearbeitung/Korrektur:
Es ist noch komplizierter, das Verfahren mit Google Maps funktionierte mit allen Argumenten fĂŒr "desiredAccuracy", aber beim Ausschalten des WLANs gab es 2 Kategorien:

  • LocationAccuracy.best und LocationAccuracy.high funktionierten noch, wurden aber langsamer
  • LocationAccuracy.medium, LocationAccuracy.lower und LocationAccuracy.lowest wurden nicht mehr aufgelöst, auch mit diesen Argumenten wird das Standortsymbol in der Statusleiste nie angezeigt.

Nach dem Neustart wird der GerÀtestandort nicht mehr aufgelöst. Ich muss also den Standort mit Google Maps abrufen und dann funktioniert es wieder wie beschrieben.

(Irgendwas wahrscheinlich unwichtig, unabhÀngig, nach einer Neuinstallation der App sieht der Berechtigungsdialog anders aus, hat kein "Don't ask again"-Checkbox, sondern nur das erste Mal, wenn der Dialog angezeigt wird, danach immer die gleicher Dialog mit der Checkbox)

Gleiches Problem, Android 10, OnePlus 7 Pro.

Der oben beschriebene Trick mit Google Maps hat bei mir nicht funktioniert, aber irgendwie hat sich nach einiger Zeit der Standort aufgelöst, ohne dass ich etwas Besonderes getan habe. Ich habe gerade eine zuvor geöffnete Seite im Browser gelesen, bin dann zurĂŒck zu meiner App gewechselt und habe einen Dialog gesehen, der mir den Ort mitteilte - der Dialog ist so eingerichtet, dass er anzeigt, wann die Zukunft aufgelöst wird, also hat er sich schließlich aufgelöst, aber es hat eine Weile gedauert . Danach löste sich der Ort bei jedem Versuch gut auf.
Wie oben erwÀhnt, wird der Standort nach dem Neustart nicht mehr aufgelöst.

Am Simulator funktioniert alles einwandfrei.

Nach der Nachricht von @SchmadenSchmuki habe ich einige Tests in meinem Projekt durchgefĂŒhrt, und dies ist mein Fazit: Es stimmt etwas nicht mit dem Google Maps-Plugin, das das Geolocator-Plugin betrifft. Zwischen ihnen besteht eine InkompatibilitĂ€t.

Dies ist der Ablauf meiner App, wenn ich sie zum ersten Mal starte:

  1. Es zeigt einen BegrĂŒĂŸungsbildschirm
  2. In der Zwischenzeit stellt die App eine Verbindung zu einer API her, um Benutzerdaten abzurufen
  3. Ich verwende Geolocator, um die aktuelle Position des Benutzers zu lokalisieren
  4. Die App beendet den BegrĂŒĂŸungsbildschirm, und dann zeige ich eine Karte, die zeigt, wo sich der Benutzer befindet

Bei diesem Flow schlĂ€gt die App fehl. Die 'getCurrentPosition()'-Methode von Geolocator schlĂ€gt fehl, sie gibt niemals einen Wert zurĂŒck. HINWEIS: Die Methoden „isLocationServiceEnabled()“ und „getLastKnownPosition()“ funktionieren einwandfrei.

ABER wenn ich den Fluss Àndere zu:

  1. Der Startbildschirm
  2. Verbinden Sie sich mit der API, um Benutzerdaten abzurufen
  3. Rendern Sie die Karte mit einem zufÀlligen Standort
  4. Verwenden Sie Geolocator, um die aktuelle Position des Benutzers zu lokalisieren
  5. Bewegen Sie die Kamera der Karte an die aktuelle Position

ES KLAPPT!!!!!

Meine Schlussfolgerung ist also, dass das Google Maps-Plugin in gewisser Weise „etwas“ belegt, das andere Plugins daran hindert, den Geolokalisierungsdienst zu verwenden. Wenn Google Maps gerendert wird, wird dieses "Etwas" freigegeben, und dann kann jeder problemlos arbeiten.

Wenn jemand anderes das bestĂ€tigen kann, können wir ein Problem fĂŒr Flutter-Jungs öffnen, um dies zu sehen

@KnucklesEQ vielen Dank fĂŒr die umfangreiche Berichterstattung. Ich werde mit dem Debuggen dieses Problems beginnen und mehr Zeit damit verbringen, das Problem zu reproduzieren und hoffentlich zu beheben. Es wĂ€re sehr hilfreich, wenn andere hier ĂŒberprĂŒfen könnten, ob sie alle auch das Google Maps-Plug-in verwenden.

Trotzdem denke ich, dass es mehrere Probleme gibt (Unterschiede zwischen Android 9 + Android 10, iOS braucht manchmal viele Sekunden, um einen Standort zurĂŒckzugeben, wenn Geolocator in Kombination mit Google Maps verwendet wird) und ich werde mich auf all diese konzentrieren und sehen, ob ich kann die Situation verbessern. Dies wird jedoch einige Zeit dauern, also haben Sie bitte Geduld mit mir, wĂ€hrend ich mein Bestes gebe und versuchen werde, hier Updates ĂŒber meine Fortschritte zu hinterlassen.

Ich verwende das Maps-Plugin nicht. Mir ist aufgefallen, dass, wenn ich die Berechtigung nur erteile, wĂ€hrend die App ausgefĂŒhrt wird (locationWhenInUse), das nĂ€chste Mal, wenn ich frage, sie nicht angezeigt wird und nie aufgelöst wird (nur Android, auf IOS hat es nie funktioniert, seit ich dieses Problem geöffnet habe).

Ich verwende kein Google Maps-Plugin.

Ich verwende auch kein Google Maps-Plugin.
(Bei Problemen habe ich ĂŒberprĂŒft, ob die Google Maps-App auch Probleme hat, den Standort zu erhalten, und dann habe ich gesehen, dass das Abrufen des Standorts dort Auswirkungen auf meine App hatte.)

mehr Details:
Das Problem tritt auf, wenn die folgenden Bedingungen zutreffen

  • Ich verwende den Standortmanager (Geolocator().forceAndroidLocationManager = true)
  • Ich verwende die Standard-Standortgenauigkeit, nĂ€mlich LocationAccuracy.best
  • ich bin drinnen

Ich habe es durch den Code verfolgt und was passiert, ist, dass unter den ersten beiden Bedingungen der Standortanbieter, der ausgewĂ€hlt wird, „GPS“ ist und das GerĂ€t das GPS-Signal im Inneren einfach nicht empfangen kann. Ich trat auf den Balkon und fast sofort funktionierten die Dinge normal.

Ich habe nicht versucht, mit der Standortgenauigkeit zu spielen, um zu sehen, wie sich dies auf die Auswahl des Standortanbieters auswirkt, aber ich habe versucht, den Anbieter einfach zum „Netzwerken“ zu zwingen (durch Hardcoding). Das funktioniert, aber die Genauigkeit des abgerufenen Standorts war offensichtlich nicht sehr gut - ~ 1080 Meter.

@minusminuszero hat recht, mir geht es genauso.
FĂŒr mich tut es also, was es sollte, auch sofort nach dem Neustart, entschuldigen Sie die Unannehmlichkeiten.
(Ich setze den Location Manager nicht, also ist es in meinem Fall forceAndroidLocationManager = false. Ich verwende LocationAccuracy.best und denke, es wĂŒrde auch mit LocationAccuracy.high funktionieren, funktioniert wahrscheinlich nicht fĂŒr niedrigere Genauigkeiten, da in diesen FĂ€llen das locationsymbol wird nicht in der Statusleiste angezeigt, aber dafĂŒr gibt es bereits ein Problem.)

Ich erlebe das Obige auch, mit genau den gleichen Schritten zum Reproduzieren (im Inneren sein, Standardstandort gemĂ€ĂŸ usw.)

mehr Details:
Das Problem tritt auf, wenn die folgenden Bedingungen zutreffen

  • Ich verwende den Standortmanager (Geolocator().forceAndroidLocationManager = true)
  • Ich verwende die Standard-Standortgenauigkeit, nĂ€mlich LocationAccuracy.best
  • ich bin drinnen

Ich habe es durch den Code verfolgt und was passiert, ist, dass unter den ersten beiden Bedingungen der Standortanbieter, der ausgewĂ€hlt wird, „GPS“ ist und das GerĂ€t das GPS-Signal im Inneren einfach nicht empfangen kann. Ich trat auf den Balkon und fast sofort funktionierten die Dinge normal.

Ich habe nicht versucht, mit der Standortgenauigkeit zu spielen, um zu sehen, wie sich dies auf die Auswahl des Standortanbieters auswirkt, aber ich habe versucht, den Anbieter einfach zum „Netzwerken“ zu zwingen (durch Hardcoding). Das funktioniert, aber die Genauigkeit des abgerufenen Standorts war offensichtlich nicht sehr gut - ~ 1080 Meter.

Wie sind Sie vorgegangen, um den Standort "Netzwerk" zu erzwingen? Dies wĂŒrde fĂŒr mich ausreichen, um das Problem zu beheben, da es zumindest in InnenrĂ€umen auftritt

Wie sind Sie vorgegangen, um den Standort "Netzwerk" zu erzwingen? Dies wĂŒrde fĂŒr mich ausreichen, um das Problem zu beheben, da es zumindest in InnenrĂ€umen auftritt

Ich tat dies, indem ich den Wert fĂŒr den Standortanbieter direkt im Geolocator-Plug-in-Code hartkodierte. Ich nehme an, die Wahl der niedrigen Genauigkeit hĂ€tte den gleichen Effekt, aber ich habe es nicht versucht.

Wahrscheinlich sollte die Methode einen Timeout-Parameter haben, oder?

Arbeitet das Flutter/Geolocator-Team an diesem Problem?

ja wir sind

Danke @mvanbeusekom!
Wissen Sie, was die Ursache des Problems ist?
Haben Sie einen Weg gefunden, es zu umgehen (oder eine Art vorĂŒbergehende Lösung)?
(Downgrade auf 4.0.3 hat es fĂŒr uns nicht gelöst)

Auf dem Simulator ist es wichtig, den Simulator so zu konfigurieren, dass er einen Standort ausgibt. Dies kann ĂŒber die folgenden MenĂŒpunkte der Simulatoranwendung erfolgen: Funktionen -> Ort -> (wĂ€hlen Sie eine andere Option als "keine").

Das hat das Problem fĂŒr mich behoben. Aber es ist ein sehr verwirrender Fehler, da er einfach ohne Ausnahmen oder irgendetwas fehlschlĂ€gt.

Auf dem Simulator ist es wichtig, den Simulator so zu konfigurieren, dass er einen Standort ausgibt. Dies kann ĂŒber die folgenden MenĂŒpunkte der Simulatoranwendung erfolgen: Funktionen -> Ort -> (wĂ€hlen Sie eine andere Option als "keine").

Das hat das Problem fĂŒr mich behoben. Aber es ist ein sehr verwirrender Fehler, da er einfach ohne Ausnahmen oder irgendetwas fehlschlĂ€gt.

Ja, fĂŒr mich auch.
Bitte fĂŒgen Sie eine ZeitĂŒberschreitung in der Standortanforderung hinzu und lösen Sie eine Ausnahme im Simulator aus, fĂŒr den kein Standort festgelegt ist.

Danke :)

Ich habe das gleiche Problem unter iOS, ich verwende auch das Google Maps-Plugin.
Ich habe eine App, die getLocationStream verwendet, aber ich erhalte keinen Berechtigungsdialog, bis ich auf die Registerkarte gehe, auf der ich eine Google-Karte habe.
Ich habe eine andere App, bei der ich Google Maps nicht mehr verwendet habe, aber vergessen habe, das Plugin zu entfernen, und ich hatte das gleiche Problem. Ich habe das Google Maps Plugin entfernt und jetzt funktioniert es richtig.

Irgendwelche Updates dazu?

Hallo zusammen, ich arbeite mit Hochdruck an diesem Problem. GrundsÀtzlich haben wir uns entschieden, den Geolocator von Grund auf neu zu bauen und mehrere Probleme auf einmal zu beheben.

Punkte, die enthalten sein werden, sind:

  • Berechtigungsprobleme beheben;
  • Stellen Sie sicher, dass getCurrentLocation innerhalb einer angemessenen Zeit abgerufen wird;
  • FĂŒgen Sie den Methoden getCurrentLocation und getPositionStream eine ZeitĂŒberschreitung hinzu, sodass die Anforderung eine ZeitĂŒberschreitung erleidet, wenn das Erfassen des Standorts lĂ€nger als erwartet dauert, und Sie die Anforderung neu starten können.
  • Mögliche Fehlermeldungen verbessern;
  • Wechseln Sie zu einer föderierten Plugin-Struktur, damit wir fĂŒr den Web-Support bereit sind;
  • Update auf Android v2-Plugin;

Der erste Schritt bestand darin, die Geokodierungsfunktionen auszubauen und sie in einem eigenen Plugin zu hosten (das jetzt auf pub.dev verfĂŒgbar ist.

Der zweite Schritt bestand darin, den gesamten erforderlichen Dart-Code zu erstellen und zu testen, der nun fertig ist und im Zweig federated_plugin angezeigt werden kann.

Die nĂ€chsten Schritte bestehen darin, iOS- und Android-Implementierungen hinzuzufĂŒgen und die Beispiel-App zu reparieren. Daran arbeite ich gerade, hoffentlich schaffe ich es in den nĂ€chsten zwei Wochen alles fertig zu stellen (bitte bedenkt, dass ich das auch in meiner Freizeit machen muss ;)).

Wie auch immer, ich möchte allen fĂŒr ihre Geduld und ihr Feedback danken, bitte warten Sie noch ein bisschen.

@mvanbeusekom
Das sind gute Neuigkeiten. Ich freue mich, dass Sie sich die Zeit nehmen, uns dieses Plugin zur VerfĂŒgung zu stellen.

Ein großes Dankeschön geht an Sie!

Ich freue mich auf die folgenden Updates.

Danke und viele GrĂŒĂŸe

HĂŒbsch! Lassen Sie uns wissen, wann es veröffentlicht wird, damit wir es testen können.

Als vorĂŒbergehenden Workaround können Sie den Status am GerĂ€t mit der Methode GeolocationStatus checkGeolocationPermissionStatus() prĂŒfen. Wenn der Standort deaktiviert ist, gibt diese Methode „deaktiviert“ zurĂŒck. Dann mĂŒssen Sie die Methode getCurrentPosition() nicht aufrufen.

Beispiel:

  Future<Position> getCurrentPosition() async {
    Position position;
    GeolocationStatus status = await _geolocator.checkGeolocationPermissionStatus(); 

    if (status != GeolocationStatus.disabled) {
      position = await _geolocator.getLastKnownPosition();

      if (position == null && status == GeolocationStatus.granted) {
        position = await _geolocator.getCurrentPosition(
          desiredAccuracy: LocationAccuracy.high,
          locationPermissionLevel: GeolocationPermission.locationWhenInUse,
        );
      }
    }

    return position;
  }

Kleines Update hier, heute Morgen habe ich ein neues Update fĂŒr den federated_plugin -Zweig veröffentlicht, das volle UnterstĂŒtzung fĂŒr iOS einschließlich einer Flutter-Beispiel-App enthĂ€lt.

Wir haben auch mit der Arbeit an Android begonnen, das die ÜberprĂŒfung des Berechtigungsstatus unterstĂŒtzt. Wir werden jetzt das Anfordern von Berechtigungen implementieren und Ortungsdienste handhaben.

Sie können sich den Code gerne ansehen oder sogar versuchen, ihn in eine Test-App zu integrieren und auf iOS auszufĂŒhren. Beachten Sie, dass es eine ganze Reihe von Breaking Changes enthĂ€lt, die alle dokumentiert werden. Im Moment wollte ich nur alle wissen lassen, dass es Fortschritte gibt, obwohl es einige Zeit dauert. Nochmals vielen Dank fĂŒr all Ihre Geduld.

Kleines Update hier, heute Morgen habe ich ein neues Update fĂŒr den federated_plugin -Zweig veröffentlicht, das volle UnterstĂŒtzung fĂŒr iOS einschließlich einer Flutter-Beispiel-App enthĂ€lt.

Wir haben auch mit der Arbeit an Android begonnen, das die ÜberprĂŒfung des Berechtigungsstatus unterstĂŒtzt. Wir werden jetzt das Anfordern von Berechtigungen implementieren und Ortungsdienste handhaben.

Sie können sich den Code gerne ansehen oder sogar versuchen, ihn in eine Test-App zu integrieren und auf iOS auszufĂŒhren. Beachten Sie, dass es eine ganze Reihe von Breaking Changes enthĂ€lt, die alle dokumentiert werden. Im Moment wollte ich nur alle wissen lassen, dass es Fortschritte gibt, obwohl es einige Zeit dauert. Nochmals vielen Dank fĂŒr all Ihre Geduld.

Danke, dass Sie hart daran gearbeitet haben. Werden Sie das Geolocator-Paket auf pub.dev mit dieser Änderung aktualisieren?

Ist dies auch die Datei fĂŒr das oben erwĂ€hnte Beispiel: position_updates_example_widget.dart?

Danke, dass Sie hart daran gearbeitet haben. Werden Sie das Geolocator-Paket auf pub.dev mit dieser Änderung aktualisieren?

Ist dies auch die Datei fĂŒr das oben erwĂ€hnte Beispiel: position_updates_example_widget.dart?

Nein, ich werde noch nicht auf pub.dev veröffentlichen. Dies ist eine vollstĂ€ndige Überarbeitung des Geolocator-Plugins und unterstĂŒtzt Android noch nicht. Sobald Android und die Dokumentation fertig sind, werde ich es auf pub.dev veröffentlichen.

Ja, dieses Widget ist Teil der Beispiel-App und zeigt, wie Sie auf Positionsaktualisierungen hören können.

Hallo,

Danke fĂŒr dieses Paket.

Gibt es eine Chance, alle oben genannten Aufgaben fĂŒr Android in dieser Woche zu erledigen?

Gibt es hierzu Neuigkeiten?

Nur auf Standortverzögerung warten, wenn die Anfrage zum ersten Mal gestellt wird.

Irgendwelche Neuigkeiten darĂŒber, wann die ĂŒberarbeitete Version veröffentlicht wird? @mvanbeusekom

@dalmia007 , ich habe noch kein Datum, aber es werden Fortschritte gemacht. Ich habe rudimentĂ€re UnterstĂŒtzung fĂŒr Android auf dem Zweig feature/federated_android hinzugefĂŒgt. Es enthĂ€lt das Anfordern von Berechtigungen, das Abrufen des letzten bekannten Standorts, das Abrufen des aktuellen Standorts und Standortaktualisierungen, die alle den Anbieter-Client fĂŒr verschmolzene Standorte (Teil der Google Play-Dienste) verwenden.

An folgendem arbeite ich noch:

Android-spezifisch:

  • Implementierung fĂŒr die oben genannten Funktionen, wenn die Google Play-Dienste nicht verfĂŒgbar sind;
  • Probleme automatisch lösen, wenn Ortungsdienste nicht aktiviert sind;

Allgemein:

  • Aktualisieren Sie die Dokumentation

Schauen Sie es sich gerne hier an

@mvanbeusekom vielen Dank fĂŒr das Update! 👍

Hallo zusammen,

Ich freue mich, die von mir (endlich) veröffentlichte Version 6.0.0-rc.1 ankĂŒndigen zu können, die all diese Probleme beseitigen sollte.

Ich wĂŒrde mich sehr freuen, wenn Sie es ausprobieren und mir Ihr Feedback geben könnten.

Es tut mir leid, dies zu sagen, aber es ist jetzt zweimal abgestĂŒrzt, genug, um bereits auf 4.0.3 zurĂŒckzukehren.

E/AndroidRuntime(19881): java.lang.RuntimeException: Failure delivering result ResultInfo{who=<strong i="6">@android</strong>:requestPermissions:, request=24, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.packagename.consumer.app/com.packagename.consumer.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.baseflow.geolocator.permission.PermissionResultCallback.onResult(com.baseflow.geolocator.permission.LocationPermission)' on a null object reference

Ist passiert, als ich im Dialog Allow Grant gedrĂŒckt habe und auch, als ich Deny gedrĂŒckt habe. Lassen Sie mich wissen, wenn ich etwas verpasst habe.

@Dohmanlechx nur um sicherzugehen, hast du das auf 6.0.0-rc.x oder auf der Version 5.3.2 bekommen?

Ich habe das auf 6.0.0-rc.1 bekommen (die IDE hat mich gebeten, auf 5.3.2+2 zu "aktualisieren", zu Ihrer Information)

@Dohmanlechx Dank Ihres Feedbacks habe ich ein Problem gefunden. Anscheinend erhÀlt der Geolocator in Ihrem Fall Feedback von einem anderen Plugin (ich vermute, Sie verwenden den permission_handler, um Berechtigungen zu verarbeiten, da der requestCode == 24 derselbe wie der permission_handler ist), das er zu verarbeiten versucht, was offensichtlich fehlschlÀgt. In diesen FÀllen sollte der Geolocator diese Nachrichten einfach ignorieren, da sie nicht zum Geolocator gehören. Ich werde das heute beheben und einen neuen Release Candidate veröffentlichen.

Vielen Dank fĂŒr Ihre RĂŒckmeldung!

Oh, tatsÀchlich, wir verwenden permission_handler . Guter Fund!

Alle Credits gehen an dich @Dohmanlechx ;). Dank Ihres Feedbacks konnte ich diesen Fehler entdecken und werde in KĂŒrze eine neue Version veröffentlichen können.

@Dohmanlechx Ich habe gerade Version 6.0.0-rc.3 veröffentlicht, die den aufgetretenen Fehler beheben sollte.

Sehr cool, sorgfÀltig auf dem Android-Emulator getestet, GewÀhren & Verweigern, Manipulieren des Standorts, funktionierte perfekt. Hat auch auf meinem echten Android-GerÀt gut funktioniert.

Aber es wird ĂŒberhaupt keine Systemanforderung fĂŒr den iOS-Simulator angezeigt, schĂ€tze, es ist beabsichtigt? Es stĂŒrzt jedoch zumindest nicht ab und die App funktioniert wie gewĂŒnscht, ohne dass ein Standort verfĂŒgbar ist. Leider kann ich aufgrund eines Xcode-Verbindungsproblems immer noch nicht auf meinem iPhone testen, und ich möchte keinen Build fĂŒr TestFlight bereitstellen, nur um jetzt zu testen. Werde berichten, sobald ich es auf dem iPhone getestet habe.

Aber so weit, so gut!

Vielen Dank fĂŒr das ausgiebige Testen @Dohmanlechx , es wird sehr geschĂ€tzt!

Das Plugin zeigt tatsĂ€chlich keine Dienstanfrage auf iOS, da es keine (öffentliche) API dafĂŒr gibt. Die einzige Möglichkeit, die wir hier haben, besteht darin, dem Benutzer manuell eine Meldung anzuzeigen, die erklĂ€rt, wie die Einstellungen manuell aktualisiert werden können. Wir haben eine Option, um den Benutzer zur App „Einstellungen“ umzuleiten (durch Aufrufen der Methoden openAppSettings() oder openLocationSettings() ). Ich habe dies ausfĂŒhrlicher in der Datei README.md dokumentiert.

Ich bedauere, dies mitteilen zu mĂŒssen, aber es hat auf meinem iPhone XS Max, OS 13.6.1, wie eine Katastrophe funktioniert.

Das erstmalige Abrufen der Position funktionierte genauso wie in der alten Version, gab die korrekte Position zurĂŒck, dauerte aber immer noch 7-8 Sekunden.

Aber ab dem zweiten Mal und weiter warf es sofort weiter. Ich musste aus folgenden GrĂŒnden von Exception err zu dynamic err wechseln:
_ Unbehandelte Ausnahme: Typ '_TypeError' ist kein Untertyp des Typs 'Exception' _.

Ich bekomme diese, wenn es fehlschlÀgt (nach dem ersten Abrufen):

2020-08-26 14:01:45.670206+0200 Runner[4565:206487] Flattern: Standort konnte nicht abgerufen werden: Schlechter Zustand: Kein Element
2020-08-26 14:01:45.670416+0200 Runner[4565:206487] Flattern: Standort konnte nicht abgerufen werden: Instanz von „NoLocationFoundException“

( NoLocationFoundException ist meine benutzerdefinierte Klasse)

_Schlechter Zustand: Kein Element_ sagt leider nicht viel aus ... unten ist mein Code:

static Future<void> _getUserLocation({bool isSneaky = false}) async {

  void _throw(dynamic err) {
    print("Could not fetch location: $err");
    if (!isSneaky) Fluttertoast.showToast(msg: getTranslation("location_fetch_error"));
    throw NoLocationFoundException();
  }

  await GeolocatorPlatform.instance
      .getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high,
        timeLimit: const Duration(seconds: _TIMEOUT_DELAY),
      )
      .then((position) => _userLatestPosition = position)
      .catchError(
    (err) {
      // Debug only, remove later
      Fluttertoast.showToast(msg: "error: $err");

      if (err is TimeoutException) {
        GeolocatorPlatform.instance.getLastKnownPosition().then((position) {
          if (position == null) _throw(err);
          return position;
        }, onError: (err) {
          _throw(err);
        });
      } else if (err is PermissionDeniedException) {
        XxlPermissionsHandler.request(Permission.location);
      } else {
        _throw(err);
      }
    },
  ).catchError((err) => _throw(err));
}

Ich hoffe aufrichtig, dass Sie dies auf Ihrem iPhone reproduzieren können.

@Dohmanlechx , danke fĂŒr das umfangreiche Feedback, ich glaube ich habe das Problem hier gefunden. Jetzt muss ich eine gute Lösung finden ;)

Kurz gesagt, die Methode getCurrentPosition ruft die Methode getPositionStream , nimmt das erste Element und schließt dann den Stream. Das Problem ist, dass getPositionStream Code wie diesen hat:

    if (_positionStream != null) {
      return _positionStream;
    }

Was Sie erraten können, verursacht die Bad state: No element -Ausnahme beim zweiten Aufruf von getCurrentPosition , da es first in einem bereits geschlossenen Stream aufruft. Ich werde daran arbeiten und bald einen neuen Kandidaten veröffentlichen.

@Dohmanlechx , Ihr Problem, bei dem Sie den "Schlechter Zustand: Kein Element" erhalten, sollte in 6.0.0-rc.4 behoben worden sein, das ich gerade veröffentlicht habe. Ich konnte das Problem nicht reproduzieren, aber ich konnte sicherstellen, dass das getCurrentPosition einen neuen Stream verwendet, wenn Sie es ein zweites Mal (und jedes weitere Mal) aufrufen.

Ich wĂŒrde es wirklich schĂ€tzen, wenn Sie es noch einmal versuchen und mich wissen lassen, ob es funktioniert.

Was mir aufgefallen ist, ist, dass Sie GeolocatorPlatform.instance.<some_method> direkt verwenden. Auf diese Weise ĂŒbergeben Sie jede Logik, die sich im Paket geolocator befindet, und gehen direkt zur Standardimplementierung, die sich in geolocator_platform_instance befindet geolocator , aber es ist immer noch besser, es nicht zu umgehen.

Wenn Sie das Geolocator-Paket importieren, sollten Sie die globalen Methoden direkt aufrufen können, zum Beispiel:

import 'package:geolocator/geolocator.dart';

final position = await getCurrentPosition();

Wenn Sie auf Kollisionen stoßen oder den globalen Methoden einfach ein PrĂ€fix voranstellen möchten, können Sie dem Import einen Alias ​​hinzufĂŒgen, etwa so:

import 'package:geolocator/geolocator.dart' as geolocator;

final position = await geolocator.getCurrentPosition();

Danke, ich habe auch den Code gemĂ€ĂŸ Ihren VorschlĂ€gen geĂ€ndert.

Der Absturz ist jetzt weg, aber leider immer noch zu instabil. 3 von 10 Mal ist es extrem schnell (ich wĂŒnschte wirklich, es wĂ€re 10 von 10 Mal), aber 7 von 10 Mal ĂŒberschreitet das Zeitlimit (10 Sekunden) und die Funktion wirft. Haben Sie auf Ihrem iPhone getestet und das getCurrentPosition() ? Getestet habe ich auf iPhone XS Max, OS 13.6.1.

_4.0.3_ ist langsam, aber stabil
_6.0.0-rc.4_ ist schnell, aber instabil

Aber keine Sorge, das ist völlig in Ordnung und absolut keine Katastrophe fĂŒr uns, zumal ich fĂŒr die Version 4.0.3 ein eigenes Zeitlimit geschrieben habe.

@Dohmanlechx freut mich zu hören, dass der Absturz behoben ist, das ist zumindest etwas;)

Mich interessiert wirklich, warum Sie immer noch langsame Updates erhalten, da ich es nicht reproduzieren kann. Ich habe eine sehr einfache Demo-App erstellt, um sie auszuprobieren:

main.dart:

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  <strong i="10">@override</strong>
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Position> _positions = <Position>[];

  <strong i="11">@override</strong>
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        body: ListView.builder(
          itemCount: _positions.length,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(title: Text(_positions[index].toString()),);
          },),
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () => getCurrentPosition().then((position) {
            setState(() {
              _positions.add(position);
            });
          }),
        ),
      ),
    );
  }
}

Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>geolocator_issue</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>$(FLUTTER_BUILD_NAME)</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>$(FLUTTER_BUILD_NUMBER)</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>The example App requires access to the device's location.</string>
</dict>
</plist>

Jedes Mal, wenn ich also auf die schwebende AktionsschaltflĂ€che drĂŒcke, wird getCurrentPosition aufgerufen und das Ergebnis zu ListView hinzugefĂŒgt. Ich habe diese App auf meinem persönlichen iPhone 7, dem iPhone 6 meiner Frau und dem Simulator (alle mit der neuesten iOS-Version) getestet, aber ich kann die SchaltflĂ€che spammen und der Standort wird fast sofort zurĂŒckgegeben. Ich bin wirklich verwirrt, warum Sie eine andere Erfahrung haben. Vielleicht können Sie diesen Beispielcode testen und sehen, ob Sie immer noch das gleiche Problem haben?

Ich bewundere deine HartnĂ€ckigkeit sehr. Ich habe ein neues Projekt erstellt und Ihre Codes verwendet, den iPhone-Bildschirm fast kaputt gemacht, indem ich die SchaltflĂ€che spammte, der Standort kehrte die ganze Zeit sofort zurĂŒck. Fantastisch! Morgen werde ich versuchen, Zeit fĂŒr die Fehlersuche in unserem Code zu finden, beginnend mit dem AusfĂŒhren getCurrentPosition() direkt im Widget und dann immer weiter weg bis zu seinem vorgesehenen Platz, um den ÜbeltĂ€ter zu finden. Ich vermute, es liegt am Berechtigungs-Plugin, aber wir werden sehen.

Danke fĂŒr das Feedback und die netten Worte, das freut mich sehr. Ich habe mich sehr bemĂŒht, den Geolocator neu zu erstellen, und dieses Problem war es, das mich wirklich dazu veranlasst hat, ihn zu starten, also möchte ich, dass er dieses Mal wirklich gut wird ;)

Bitte lassen Sie mich wissen, wie es geht und wenn ich helfen kann.

getCurrentPosition().then((position) {
   print(position);
}).catchError((err) {
   print(err);
});

Habe dies direkt im Widget versucht und jedes Mal, wenn ich geklickt habe, wurde ein Standort auf der Konsole angemeldet! Es ist also definitiv unser Code. Also liegt es jetzt an uns, danke fĂŒr alles!

Dies passiert jedoch _manchmal_ beim Abrufen der Position:

I/flutter (  393): ══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
I/flutter (  393): The following PlatformException was thrown while de-activating platform stream on channel
I/flutter (  393): flutter.baseflow.com/geolocator_updates:
I/flutter (  393): PlatformException(error, No active stream to cancel, null)
I/flutter (  393): 
I/flutter (  393): When the exception was thrown, this was the stack:
I/flutter (  393): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:572:7)
I/flutter (  393): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:161:18)
I/flutter (  393): <asynchronous suspension>
I/flutter (  393): #2      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
I/flutter (  393): #3      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:554:29)
I/flutter (  393): #4      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:551:18)
I/flutter (  393): #18     MethodChannelGeolocator.getPositionStream.<anonymous closure> (package:geolocator_platform_interface/src/implementations/method_channel_geolocator.dart:135:13)
I/flutter (  393): (elided 24 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter (  393): ════════════════════════════════════════════════════════════════════════════════════════════════════

@mvanbeusekom Ich kann die Position mit der neuesten Version 6.0.0 + 1 ĂŒberhaupt nicht abrufen. Versucht auf iOS-Simulator, Android-Emulator API 29, physischem OnePlus 6. Timeout wird jedes Mal ausgelöst.

image

image

Ich weiß nicht, was ich hier noch hinzufĂŒgen kann, um Sie beim Auffinden des Problems zu unterstĂŒtzen. getCurrentPosition gibt eine ZeitĂŒberschreitung zurĂŒck oder hĂ€ngt einfach, wenn der Parameter timeLimit nicht angegeben ist. Ich habe verschiedene Standortgenauigkeiten ausprobiert. Hat jemand dieses Problem?

Version 5.3.2+2 funktioniert gut auf dem iOS-Simulator (mit dem benutzerdefinierten Speicherort), dem Android-RealgerÀt und dem Android-Emulator

@mvanbeusekom , ich habe das alles durchgelesen und aktualisiere auf die neueste Version, um das Problem mit der 10-Sekunden-Verzögerung zu beheben.

Vielleicht ĂŒbersehe ich etwas, aber es gibt etwas, das ich in der neuen Version nicht mehr tun kann (Geocodierung).
FrĂŒher konnte ich manuell eine Position auf das Stadtzentrum setzen (falls der Benutzer den Standort verweigert), indem ich Folgendes tat:

Position userLocation;
List<Placemark> listAddresses = [];
if(permission.toString() != "PermissionStatus.granted"){
        listAddresses = await placemarkFromAddress("$city, $state");
         userLocation = listAddresses[0].position;
    }else{
getCurrentPosition...
}

Jetzt scheint _placemarkFromAddress_ in _ locationFromAddress _ geĂ€ndert worden zu sein, also habe ich versucht, mich anzupassen, indem ich die folgenden Änderungen in meiner Formel vorgenommen habe:

Position userLocation;
List<Location> listAddresses = [];
if(permission.toString() != "PermissionStatus.granted"){
        listAddresses = await locationFromAddress("$city, $state");
         userLocation = listAddresses[0].position;
    }else{
getCurrentPosition...
}

Aber ich bekomme folgenden Fehler:

A value type 'Location' can't be assigned to a variable of type 'Position'.

Wie kann ich den Standort in die Position umwandeln oder letztendlich, falls der Benutzer den Standort verneint, wie kann ich seine Position jetzt auf sein Stadtzentrum setzen?

Danke.

Ich habe auf die neueste Version aktualisiert, das Problem fĂŒr mich behoben 👍👍👍

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen