Flutter-geolocator: Masa depan tidak pernah terselesaikan di IOS13

Dibuat pada 29 Apr 2020  Β·  63Komentar  Β·  Sumber: Baseflow/flutter-geolocator

Laporan Bug

Ketika saya mencoba getCurrentLocation, itu tidak pernah terselesaikan. Saya bukan ahli di IOS, jadi tolong jika saya lupa melakukan sesuatu, jelaskan saja kepada saya.

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

File Pod:

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>

EDIT:

Saya telah menguji pada perangkat Android asli dan masalahnya juga terjadi.

Izin lokasi manifes saya:

    <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" />

Perilaku yang diharapkan

Kembalikan Posisi.

Langkah-langkah reproduksi

Panggil saja geolocator.GetCurrentPosition.

Versi: 5.1.5.

Platform:

  • [x] :iphone: iOS (Diuji dengan Simulator IOS)
  • [x] :robot: Android (Diuji pada Xiomi Pocophone F1 dengan Android 10QkQ1.190828.002)
android ios triage

Komentar yang paling membantu

Hai semuanya,

Saya dengan senang hati mengumumkan bahwa saya (akhirnya) merilis versi 6.0.0-rc.1 yang akan menghilangkan semua masalah ini.

Saya akan sangat menghargai jika Anda bisa mencobanya dan memberi saya tanggapan Anda.

Semua 63 komentar

Saya mendapatkan kesalahan yang sama. Ini terjadi baik di iOS dan Android.....

Saya mendapatkan kesalahan yang sama pada simulator yang menjalankan iOS 10.3 atau iOS 13.4 dan juga di iPad saya dengan iOS 13.4 .

kode saya.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>

Versi: 5.3.1

Masalah yang sama bagi saya di Android 8.0. Saya mempertimbangkan untuk menulis penghitung waktu 10 detik langsung pada kode sumber yang muncul jika tercapai.

@brenoasm apakah Anda mengalami masalah ini di simulator atau perangkat nyata?

@dammel Di simulator, penting untuk mengonfigurasi simulator untuk memancarkan lokasi. Ini dapat dilakukan dengan menggunakan item menu berikut dari aplikasi simulator: Fitur -> Lokasi -> (pilih opsi selain "tidak ada").

@mvanbeusekom Bagaimana jika perangkat nyata tidak memancarkan lokasi? Seharusnya tidak jika pengguna telah mematikan GPS, bukan?

@mvanbeusekom Saya telah menguji pada Simulator untuk IOS (Saya tidak memiliki iPhone untuk mengujinya pada perangkat nyata). Saya telah mengujinya pada perangkat Android asli dan mendapatkan masalah yang sama... Saya akan mengedit dan menambahkan informasi perangkat Android saya.

Saya memiliki masalah yang sama dengan perangkat Android asli ...

@mvanbeusekom Terima kasih atas bantuan Anda. Tipp Anda untuk simulator bekerja untuk saya.
Saya belum mengubah apa pun, tetapi sekarang berfungsi di iPad (perangkat nyata) lagi.

Diuji pada simulator iOS dan perangkat iOS, saya tidak punya masalah tetapi saya memiliki masalah yang sama pada emulator Android

Saya akan mencoba menjelaskan kasus saya secara rinci.

Pertama, masalah terjadi di perangkat Android dan iPhone (saya menggunakan Testflight untuk menguji aplikasi dengan tim QA saya), tetapi juga di Android Emulator dan iOS Simulator.

Metode 'getCurrentPosition' terkadang tidak mengembalikan posisi, tetapi setelah serangkaian percobaan berhasil. Saya biasanya memiliki masalah ini ketika saya menginstal aplikasi untuk pertama kalinya. Setelah jangka waktu tertentu, tiba-tiba metode mulai membawa Anda ke posisi saat ini.

Masalah dari masalah ini adalah bahwa hal itu tidak selalu terjadi. Anda dapat menginstal aplikasi, dan terkadang pada percobaan pertama metode mengembalikan posisi saat ini...

Catatan tambahan:

  1. Jika metode mulai bekerja dengan baik dan saya melakukan hot reload atau hot restart, metode ini terus bekerja dengan baik
  2. Metode ini tidak mengeluarkan pengecualian apa pun ... tetapi jika Anda memberi 'menunggu', itu berhenti tanpa batas
  3. Saya mencoba menggunakan Geolocator versi lama, dan masalahnya tetap ada
  4. Saya menggunakan Google Maps dalam proyek saya, jadi saya pikir "mungkin ada konflik dengan versi terbaru Maps...?". Tidak. Saya mengkompilasi dengan Google Maps versi lama dan masalahnya tetap ada
  5. Yang aneh adalah bahwa beberapa minggu yang lalu saya tidak mengalami masalah ini ...

lingkungan saya:

$ 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!

Solusi sementara dalam proyek saya:

  1. Saya menambahkan batas waktu ke metode 'getCurrentPosition', dan jika mengembalikan 'null' saya memulai penghitung waktu dan mencoba lagi dan lagi... setelah beberapa saat (terkadang detik, terkadang bahkan satu menit) metode mengembalikan posisi saat ini
  2. Jika saya membutuhkan posisi awal, saya menggunakan metode 'getLastKnownPosition()'

Saya kira #375 dan #386 terkait dengan masalah ini

Masalah yang sama di sini, LG G6, Android 9.0.

Tidak pernah menyelesaikan.

Ada cara aneh bagaimana saya bisa membuatnya bekerja:
Saya memulai aplikasi google maps untuk mendapatkan posisi di sana. Untuk itu saya perlu mengaktifkan sensor posisi dan wifi (mungkin koneksi data mobil juga berfungsi, tidak diuji).
Jadi saya mendapatkan posisi di google maps.
Setelah itu juga berfungsi di aplikasi saya (tidak peduli apakah aplikasi saya dimulai setelahnya atau sudah berjalan).
Jika saya mengakhiri wifi atau mematikan posisi maka tidak berfungsi lagi, bahkan jika saya menyalakannya lagi.

Menutup google maps kapan saja, bahkan sebelum aplikasi saya dibuka, tidak masalah (tetapi terkadang saya harus membuka google maps lebih dari sekali.)
Sepertinya saya seperti peta google menetapkan sesuatu yang bertahan bahkan setelah peta ditutup dan yang dibutuhkan oleh geolocator.

Sunting/Koreksi:
Ini bahkan lebih rumit, prosedur dengan peta google bekerja dengan semua argumen untuk "akurasi yang diinginkan", tetapi ketika beralih dari wifi ada 2 kategori:

  • LocationAccuracy.best dan LocationAccuracy.high masih berfungsi tetapi menjadi lebih lambat
  • LocationAccuracy.medium, LocationAccuracy.lower dan LocationAccuracy.lowest tidak diselesaikan lagi, juga dengan argumen tersebut simbol lokasi di bilah status tidak pernah ditampilkan.

Setelah mem-boot ulang lokasi perangkat tidak teratasi lagi. Jadi saya perlu mengulangi mendapatkan lokasi dengan peta google dan kemudian berfungsi lagi seperti yang dijelaskan.

(Sesuatu yang mungkin tidak penting, tidak terkait, setelah penginstalan baru aplikasi, dialog izin terlihat berbeda, tidak memiliki kotak centang "Jangan tanya lagi", tetapi hanya saat pertama kali dialog ditampilkan, setelah itu selalu dialog yang sama dengan kotak centang)

Masalah yang sama, Android 10, OnePlus 7 Pro.

Trik yang dijelaskan di atas dengan peta google tidak berfungsi untuk saya, tetapi entah bagaimana setelah beberapa waktu lokasi mulai terselesaikan tanpa saya melakukan sesuatu yang spesifik. saya baru saja membaca halaman yang dibuka sebelumnya di browser, lalu beralih kembali ke aplikasi saya dan melihat dialog yang memberi tahu saya lokasi - dialog diatur untuk menunjukkan kapan masa depan selesai, jadi akhirnya itu terselesaikan, tetapi butuh beberapa saat . Setelah itu, lokasi diselesaikan dengan baik pada setiap upaya.
Seperti disebutkan di atas setelah reboot, lokasi tidak terselesaikan lagi.

Di simulator semuanya berfungsi dengan baik.

Setelah pesan @SchmadenSchmuki , saya melakukan beberapa tes di proyek saya, dan inilah kesimpulan saya: Ada yang salah dengan Plugin Google Maps yang memengaruhi plugin Geolocator. Ada ketidakcocokan di antara mereka.

Ini adalah alur aplikasi saya ketika saya memulainya untuk pertama kalinya:

  1. Ini menunjukkan layar splash
  2. Sementara itu, aplikasi terhubung ke API untuk menarik data pengguna
  3. Saya menggunakan Geolocator untuk menemukan posisi pengguna saat ini
  4. Aplikasi keluar dari layar splash, dan kemudian saya menunjukkan peta yang menunjukkan di mana pengguna berada

Dengan aliran ini, aplikasi gagal. Metode 'getCurrentPosition()' Geolocator gagal, tidak pernah mengembalikan nilai. CATATAN: metode 'isLocationServiceEnabled()' dan 'getLastKnownPosition()' berfungsi dengan baik.

TAPI jika saya mengubah aliran ke:

  1. Layar percikan
  2. Hubungkan ke API untuk menarik data pengguna
  3. Rendering peta dengan lokasi acak
  4. Gunakan Geolocator untuk menemukan posisi pengguna saat ini
  5. Pindahkan kamera peta ke posisi saat ini

BERHASIL!!!!!

Jadi, kesimpulan saya adalah, dalam beberapa hal, plugin Google Maps menempati "sesuatu" yang memblokir plugin lain untuk menggunakan layanan geolokasi. Saat Google Maps merender, itu membebaskan "sesuatu" itu dan kemudian semua orang dapat bekerja tanpa masalah.

Jika orang lain dapat mengonfirmasi itu, kami dapat membuka masalah untuk Flutter guys untuk melihat ini

@KnucklesEQ terima kasih banyak atas pelaporannya yang ekstensif. Saya akan mulai men-debug masalah ini dan menghabiskan lebih banyak waktu saya untuk mereproduksi dan semoga memperbaiki masalah. Akan sangat membantu jika orang lain di sini dapat memverifikasi apakah mereka semua juga menggunakan plugin Google Maps?

Namun saya pikir ada banyak masalah (perbedaan antara Android 9 + Android 10, iOS terkadang membutuhkan beberapa detik untuk mengembalikan lokasi, menggunakan Geolocator dalam kombinasi dengan Google Maps) dan saya akan mulai fokus pada semua itu dan melihat apakah saya bisa memperbaiki situasi. Ini akan memakan waktu, jadi tolong bersabarlah sementara saya melakukan yang terbaik dan akan mencoba untuk meninggalkan pembaruan di sini tentang kemajuan saya.

Saya tidak menggunakan plugin Maps. Saya perhatikan bahwa ketika saya memberikan izin hanya saat aplikasi sedang berjalan (locationWhenInUse), waktu berikutnya saya memintanya tidak akan muncul dan tidak pernah terselesaikan (Hanya Android, di iOS Tidak pernah berfungsi sejak saya membuka masalah ini).

Saya tidak menggunakan plugin Google Maps.

Tidak menggunakan plugin Google Maps juga.
(Ketika mengalami masalah saya memeriksa apakah aplikasi google maps juga memiliki masalah untuk mendapatkan lokasi dan kemudian saya melihat bahwa mendapatkan lokasi di sana berpengaruh pada aplikasi saya)

keterangan lebih lanjut:
masalah terjadi ketika kondisi berikut ini benar:

  • saya menggunakan pengelola lokasi (Geolocator().forceAndroidLocationManager = true)
  • saya menggunakan akurasi lokasi default, yaitu LocationAccuracy.best
  • saya di dalam

saya menelusurinya melalui kode dan apa yang terjadi adalah bahwa di bawah 2 kondisi pertama penyedia lokasi yang dipilih adalah 'gps' dan perangkat tidak dapat mengambil sinyal gps di dalamnya. Saya melangkah keluar ke balkon dan segera semuanya mulai bekerja secara normal.

Saya tidak mencoba bermain dengan akurasi lokasi untuk melihat bagaimana pengaruhnya terhadap pilihan penyedia lokasi, tetapi saya mencoba hanya memaksa penyedia untuk 'jaringan' (dengan hardcoding). Itu berhasil, tetapi akurasi pada lokasi yang diambil jelas tidak terlalu bagus - ~ 1080 meter.

@minusminuszero benar, itu sama untuk saya.
Jadi bagi saya itu melakukan apa yang seharusnya, juga segera setelah reboot, maaf atas ketidaknyamanannya.
(Saya tidak menyetel pengelola lokasi, jadi forceAndroidLocationManager = false dalam kasus saya. Saya menggunakan LocationAccuracy.best dan saya rasa itu juga akan berfungsi dengan LocationAccuracy.high, mungkin tidak berfungsi untuk akurasi yang lebih rendah karena dalam kasus ini simbol lokasi tidak muncul di bilah status, tetapi sudah ada masalah untuk itu.)

Saya mengalami hal di atas juga, dengan langkah yang sama persis untuk mereproduksi (berada di dalam, lokasi default acc, dll)

keterangan lebih lanjut:
masalah terjadi ketika kondisi berikut ini benar:

  • saya menggunakan pengelola lokasi (Geolocator().forceAndroidLocationManager = true)
  • saya menggunakan akurasi lokasi default, yaitu LocationAccuracy.best
  • saya di dalam

saya menelusurinya melalui kode dan apa yang terjadi adalah bahwa di bawah 2 kondisi pertama penyedia lokasi yang dipilih adalah 'gps' dan perangkat tidak dapat mengambil sinyal gps di dalamnya. Saya melangkah keluar ke balkon dan segera semuanya mulai bekerja secara normal.

Saya tidak mencoba bermain dengan akurasi lokasi untuk melihat bagaimana pengaruhnya terhadap pilihan penyedia lokasi, tetapi saya mencoba hanya memaksa penyedia untuk 'jaringan' (dengan hardcoding). Itu berhasil, tetapi akurasi pada lokasi yang diambil jelas tidak terlalu bagus - ~ 1080 meter.

Bagaimana Anda memaksa lokasi "jaringan"? Ini akan cukup bagi saya dalam hal memperbaiki masalah karena setidaknya terjadi di dalam ruangan

Bagaimana Anda memaksa lokasi "jaringan"? Ini akan cukup bagi saya dalam hal memperbaiki masalah karena setidaknya terjadi di dalam ruangan

Saya melakukannya dengan melakukan hardcoding nilai untuk penyedia lokasi secara langsung dalam kode plugin geolocator. Saya kira memilih akurasi rendah akan memiliki efek yang sama, tetapi saya tidak mencobanya.

Mungkin metode ini harus memiliki parameter batas waktu, bukan?

Apakah tim Flutter/Geolocator sedang mengerjakan masalah ini?

Ya kami

Terima kasih @mvanbeusekom!
Apakah Anda tahu apa sumber masalahnya?
Sudahkah Anda menemukan cara untuk melewatinya (atau semacam solusi sementara)?
(menurunkan ke 4.0.3 tidak menyelesaikannya untuk kami)

Pada simulator, penting untuk mengkonfigurasi simulator untuk memancarkan lokasi. Ini dapat dilakukan dengan menggunakan item menu berikut dari aplikasi simulator: Fitur -> Lokasi -> (pilih opsi selain "tidak ada").

Itu memperbaiki masalah bagi saya. Tapi itu adalah bug yang sangat membingungkan karena gagal begitu saja tanpa pengecualian atau apa pun.

Pada simulator, penting untuk mengkonfigurasi simulator untuk memancarkan lokasi. Ini dapat dilakukan dengan menggunakan item menu berikut dari aplikasi simulator: Fitur -> Lokasi -> (pilih opsi selain "tidak ada").

Itu memperbaiki masalah bagi saya. Tapi itu adalah bug yang sangat membingungkan karena gagal begitu saja tanpa pengecualian atau apa pun.

Ya, bagi saya juga.
Harap tambahkan batas waktu dalam permintaan lokasi dan berikan pengecualian di simulator yang tidak memiliki lokasi yang ditetapkan.

Terima kasih :)

Saya memiliki masalah yang sama di iOS, saya juga menggunakan plugin google maps.
Saya memiliki aplikasi yang menggunakan getLocationStream tetapi saya tidak mendapatkan dialog izin sampai saya membuka tab tempat saya memiliki peta google.
Saya memiliki aplikasi lain di mana saya tidak menggunakan peta google lagi tetapi lupa menghapus plugin dan saya memiliki masalah yang sama. Saya menghapus plugin google maps dan sekarang berfungsi dengan benar.

Ada pembaruan tentang ini?

Halo semuanya, saya bekerja keras untuk masalah ini. Pada dasarnya kami telah memutuskan untuk membangun geolocator dari awal dan memperbaiki banyak masalah sekaligus.

Poin-poin yang akan dimasukkan adalah:

  • Perbaiki masalah izin;
  • Pastikan getCurrentLocation diambil dalam waktu yang wajar;
  • Tambahkan batas waktu ke metode getCurrentLocation dan getPositionStream , sehingga jika memperoleh lokasi membutuhkan waktu lebih lama maka diharapkan permintaan akan habis dan Anda dapat memulai kembali permintaan;
  • Meningkatkan potensi pesan kesalahan;
  • Pindah ke struktur plugin gabungan sehingga kami siap untuk dukungan web;
  • Perbarui ke plugin Android v2;

Langkah pertama yang harus diambil adalah memindahkan fitur geocoding dan menghostingnya di plugin mereka sendiri (yang sekarang tersedia di pub.dev .

Langkah kedua adalah membuat dan menguji unit semua kode Dart yang diperlukan, yang sekarang sudah siap dan dapat dilihat di cabang federated_plugin .

Langkah selanjutnya adalah menambahkan implementasi iOS dan Android dan memperbaiki aplikasi contoh. Ini yang sedang saya kerjakan sekarang, semoga saya bisa menyelesaikan semuanya dalam dua minggu mendatang (harap diingat bahwa saya juga perlu melakukan ini di waktu luang ;)).

Pokoknya saya ingin berterima kasih kepada semua orang atas kesabaran dan umpan balik di sana, harap bertahan sedikit lebih lama.

@mvanbeusekom
Itu kabar baik. Saya senang Anda meluangkan waktu untuk menyediakan plugin ini kepada kami.

Terima kasih yang sebesar-besarnya ditujukan kepada Anda!

Saya menantikan pembaruan berikut.

Terima kasih dan salam

Bagus! Beri tahu kami saat dirilis agar kami dapat mengujinya.

Untuk solusi sementara Anda dapat memeriksa status di perangkat dengan metode GeolocationStatus checkGeolocationPermissionStatus() . Jika lokasi tidak aktif, metode ini mengembalikan "dinonaktifkan". Maka Anda tidak perlu memanggil metode getCurrentPosition() .

Contoh:

  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;
  }

Sedikit pembaruan di sini, pagi ini saya telah mendorong pembaruan baru ke cabang federated_plugin yang mencakup dukungan penuh di iOS termasuk Aplikasi contoh Flutter.

Kami juga telah mulai bekerja di Android yang mendukung pemeriksaan status izin, kami akan menerapkan meminta izin dan menangani layanan lokasi sekarang.

Jangan ragu untuk memeriksa kodenya atau bahkan mencoba mengintegrasikannya dalam aplikasi uji dan dijalankan di iOS. Perhatikan bahwa itu termasuk cukup banyak perubahan yang melanggar yang semuanya akan didokumentasikan. Untuk saat ini saya hanya ingin memberi tahu semua orang bahwa ada kemajuan meskipun butuh waktu. Sekali lagi terima kasih atas semua kesabaran Anda.

Sedikit pembaruan di sini, pagi ini saya telah mendorong pembaruan baru ke cabang federated_plugin yang mencakup dukungan penuh di iOS termasuk Aplikasi contoh Flutter.

Kami juga telah mulai bekerja di Android yang mendukung pemeriksaan status izin, kami akan menerapkan meminta izin dan menangani layanan lokasi sekarang.

Jangan ragu untuk memeriksa kodenya atau bahkan mencoba mengintegrasikannya dalam aplikasi uji dan dijalankan di iOS. Perhatikan bahwa itu termasuk cukup banyak perubahan yang melanggar yang semuanya akan didokumentasikan. Untuk saat ini saya hanya ingin memberi tahu semua orang bahwa ada kemajuan meskipun butuh waktu. Sekali lagi terima kasih atas semua kesabaran Anda.

Terima kasih telah bekerja keras untuk ini. Apakah Anda akan memperbarui paket geolocator di pub.dev dengan perubahan ini?

Juga apakah ini file untuk contoh yang Anda sebutkan di atas: position_updates_example_widget.dart?

Terima kasih telah bekerja keras untuk ini. Apakah Anda akan memperbarui paket geolocator di pub.dev dengan perubahan ini?

Juga apakah ini file untuk contoh yang Anda sebutkan di atas: position_updates_example_widget.dart?

Tidak, saya belum akan memublikasikan ke pub.dev. Ini adalah keseluruhan pengerjaan ulang plugin geolocator dan belum mendukung Android. Setelah Android dan dokumentasinya selesai, saya akan merilisnya di pub.dev.

Ya, widget ini adalah bagian dari aplikasi contoh dan menunjukkan bagaimana Anda dapat mendengarkan pembaruan posisi.

Hai,

Terima kasih untuk paket ini.

Adakah kesempatan untuk menyelesaikan semua tugas yang disebutkan di atas untuk Android dalam minggu ini?

Ada pembaruan tentang ini?

Hanya menunggu ketertinggalan lokasi saat meminta untuk pertama kalinya.

Adakah pembaruan tentang kapan versi yang dikerjakan ulang akan dirilis? @mvanbeusekom

@dalmia007 , saya belum memiliki tanggal tetapi kemajuan sedang dibuat. Saya telah menambahkan dukungan dasar untuk Android di cabang feature/federated_android . Ini berisi meminta izin, mendapatkan lokasi terakhir yang diketahui, mendapatkan lokasi saat ini dan pembaruan lokasi semua menggunakan klien penyedia lokasi yang menyatu (bagian dari Layanan Google Play).

Saya masih mengerjakan yang berikut:

Khusus Android:

  • Implementasi untuk fitur di atas saat Layanan Google Play tidak tersedia;
  • Secara otomatis menyelesaikan masalah saat layanan lokasi tidak diaktifkan;

Umum:

  • Perbarui dokumentasi

Jangan ragu untuk memeriksanya di sini

@mvanbeusekom terima kasih banyak atas pembaruannya! πŸ‘

Hai semuanya,

Saya dengan senang hati mengumumkan bahwa saya (akhirnya) merilis versi 6.0.0-rc.1 yang akan menghilangkan semua masalah ini.

Saya akan sangat menghargai jika Anda bisa mencobanya dan memberi saya tanggapan Anda.

Saya minta maaf untuk memberi tahu ini tetapi macet dua kali sekarang, cukup untuk kembali ke 4.0.3.

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

Terjadi ketika saya menekan izinkan hibah pada dialog dan juga ketika saya menekan tolak. Beri tahu saya jika saya melewatkan sesuatu.

@Dohmanlechx hanya memastikan, apakah Anda mendapatkan ini di 6.0.0-rc.x atau di versi 5.3.2?

Saya mendapatkan ini pada 6.0.0-rc.1 (IDE meminta saya untuk "memperbarui" ke 5.3.2+2 , FYI)

@Dohmanlechx terima kasih atas umpan balik Anda, saya memang menemukan masalah. Rupanya dalam kasus Anda, geolocator mendapatkan umpan balik dari plugin lain (saya kira Anda menggunakan permission_handler untuk menangani izin karena requestCode == 24 yang sama dengan permission_handler) yang coba diproses yang jelas-jelas gagal. Dalam kasus ini, geolocator harus mengabaikan pesan tersebut karena pesan tersebut bukan milik geolocator. Saya akan memperbaikinya hari ini dan merilis kandidat rilis baru.

Terima kasih atas tanggapan Anda!

Oh, memang, kami menggunakan permission_handler . Temuan yang bagus!

Semua kredit diberikan kepada Anda @Dohmanlechx ;). Berkat umpan balik Anda, saya dapat menemukan bug ini dan akan segera merilis versi baru.

@Dohmanlechx Saya baru saja merilis versi 6.0.0-rc.3 yang seharusnya memperbaiki bug yang Anda alami.

Sangat keren, diuji dengan hati-hati di Android Emulator, memberikan & menolak, memanipulasi lokasi, bekerja dengan sempurna. Bekerja dengan baik di perangkat Android saya yang sebenarnya juga.

Tetapi tidak ada permintaan sistem yang ditampilkan untuk Simulator iOS sama sekali, tebak itu dimaksudkan? Namun, itu tidak akan mogok setidaknya dan aplikasi berfungsi seperti yang diinginkan tanpa lokasi yang tersedia. Sayangnya masih tidak dapat menguji di iPhone saya karena masalah koneksi Xcode dan saya tidak ingin menggunakan build ke TestFlight hanya untuk menguji sekarang. Akan memberi tahu Anda segera setelah saya mengujinya di iPhone.

Tapi sejauh ini baik-baik saja!

Terima kasih banyak atas pengujian ekstensif @Dohmanlechx , ini sangat dihargai!

Plugin memang tidak menampilkan permintaan layanan di iOS, karena tidak ada API (publik) untuk melakukannya. Satu-satunya pilihan yang kami miliki di sini adalah secara manual menampilkan pesan kepada pengguna yang menjelaskan cara memperbarui pengaturan secara manual. Kami memiliki opsi untuk mengarahkan pengguna ke aplikasi Pengaturan (dengan memanggil metode openAppSettings() atau openLocationSettings() ). Saya telah mendokumentasikan ini lebih rinci dalam file README.md .

Saya menyesal untuk menginformasikan hal ini tetapi itu bekerja seperti bencana di iPhone XS Max saya, OS 13.6.1.

Pertama kali mengambil posisi berfungsi seperti versi lama, mengembalikan posisi yang benar tetapi masih membutuhkan waktu 7-8 detik.

Tapi dari kedua kalinya dan selanjutnya itu terus melempar secara instan. Saya harus mengubah dari Exception err menjadi dynamic err karena:
_ Pengecualian Tidak Tertangani: tipe '_TypeError' bukan subtipe dari tipe 'Pengecualian' _.

Saya mendapatkannya ketika gagal (setelah pertama kali mengambil):

26-08-2020 14:01:45.670206+0200 Pelari[4565:206487] flutter: Tidak dapat mengambil lokasi: Status buruk: Tidak ada elemen
26-08-2020 14:01:45.670416+0200 Pelari[4565:206487] flutter: Tidak dapat mengambil lokasi: Contoh 'NoLocationFoundException'

( NoLocationFoundException adalah kelas khusus saya)

_Keadaan buruk: Sayangnya tidak ada elemen_ yang memberi tahu banyak... di bawah ini adalah kode saya:

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));
}

Saya sangat berharap Anda dapat mereproduksi ini di iPhone Anda.

@Dohmanlechx , terima kasih atas umpan balik yang luas, saya pikir saya menemukan masalah di sini. Sekarang saya perlu menemukan cara yang baik untuk memperbaikinya ;)

Singkatnya metode getCurrentPosition memanggil getPositionStream dan mengambil elemen pertama dan kemudian menutup aliran. Masalahnya adalah getPositionStream memiliki kode seperti ini:

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

Yang dapat Anda tebak menyebabkan pengecualian Bad state: No element saat memanggil getCurrentPosition untuk kedua kalinya, karena itu akan memanggil first pada aliran yang sudah ditutup. Saya akan mengerjakan ini dan segera merilis kandidat baru.

@Dohmanlechx , Anda mengeluarkan di mana Anda mendapatkan "Keadaan buruk: Tidak ada elemen" yang seharusnya diperbaiki di 6.0.0-rc.4 yang baru saja saya terbitkan. Saya tidak dapat mereproduksi masalah, tetapi saya dapat memastikan bahwa getCurrentPosition akan menggunakan aliran baru ketika Anda menyebutnya kedua (dan berikutnya) waktu.

Saya akan sangat menghargainya jika Anda dapat mencobanya lagi dan beri tahu saya jika berhasil.

Pada hal yang saya perhatikan adalah Anda langsung menggunakan GeolocatorPlatform.instance.<some_method> , dengan melakukan ini Anda dengan melewatkan logika apa pun yang terletak di paket geolocator dan langsung ke implementasi default yang ada di geolocator_platform_instance paket. Untuk saat ini tidak ada implementasi khusus dalam paket geolocator tetapi masih lebih baik untuk tidak mem-bypassnya.

Jika Anda mengimpor paket geolocator, Anda seharusnya dapat langsung memanggil metode global, misalnya:

import 'package:geolocator/geolocator.dart';

final position = await getCurrentPosition();

Jika Anda mengalami tabrakan atau hanya ingin mengawali metode global, Anda dapat menambahkan alias ke impor, seperti:

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

final position = await geolocator.getCurrentPosition();

Terima kasih, saya juga mengubah kode sesuai dengan saran Anda.

Crash sudah hilang sekarang tapi sayangnya, masih terlalu tidak stabil. 3 dari 10 kali itu sangat cepat (sangat berharap itu 10 dari 10 kali), tetapi 7 dari 10 kali Batas Waktu (10 detik) terlampaui dan fungsi melempar. Apakah Anda menguji pada iPhone Anda, mengirim spam ke getCurrentPosition() ? Saya menguji pada iPhone XS Max, OS 13.6.1.

_4.0.3_ lambat tapi stabil
_6.0.0-rc.4_ cepat tetapi tidak stabil

Tapi jangan khawatir, ini benar-benar oke dan sama sekali tidak ada bencana bagi kami, terutama karena saya menulis sendiri batas waktu untuk versi 4.0.3.

@Dohmanlechx senang mendengar crash terpecahkan, setidaknya itu sesuatu;)

Saya sangat tertarik mengapa Anda masih menerima pembaruan yang lambat karena saya tidak dapat mereproduksinya. Saya membuat Aplikasi demo yang sangat sederhana untuk mencobanya:

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>

Jadi setiap kali saya menekan tombol tindakan mengambang getCurrentPosition dipanggil dan hasilnya ditambahkan ke ListView . Saya telah menguji Aplikasi ini di iPhone 7 pribadi saya, iPhone 6 istri saya dan simulator (semuanya menjalankan versi iOS terbaru) tetapi saya dapat mengirim spam tombol dan lokasi dikembalikan segera. Saya benar-benar bingung mengapa Anda memiliki pengalaman yang berbeda. Mungkin Anda dapat menguji kode sampel ini dan melihat apakah Anda masih memiliki masalah yang sama?

Saya sangat mengagumi kegigihan Anda. Saya membuat proyek baru dan menggunakan kode Anda, hampir merusak layar iPhone dengan mengirim spam tombol, lokasi segera kembali setiap saat. Luar biasa! Besok saya akan mencoba mencari waktu untuk memecahkan masalah dalam kode kami, dimulai dengan menjalankan getCurrentPosition() langsung di Widget dan kemudian memindahkannya lebih jauh dan lebih jauh hingga tempat yang dituju untuk menemukan pelakunya. Saya menduga itu karena plugin izin, tetapi kita akan lihat.

Terima kasih atas umpan balik dan kata-kata baik, sangat menghargainya. Saya berusaha keras dalam membangun kembali geolocator dan masalah ini adalah yang benar-benar membuat saya memutuskan untuk memulainya, jadi saya sangat ingin kali ini bagus ;)

Tolong beri tahu saya bagaimana kelanjutannya dan jika saya dapat membantu.

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

Mencoba ini langsung di Widget dan setiap kali saya mengklik, lokasi dicatat di konsol! Jadi itu pasti kode kami. Jadi ada pada kita sekarang, terima kasih untuk semuanya!

Padahal, _kadang-kadang_ ini terjadi saat mengambil posisi:

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 Saya tidak bisa mendapatkan posisi sama sekali menggunakan versi 6.0.0+1 terbaru. Mencoba pada simulator iOS, Android emulator API 29, fisik OnePlus 6. Timeout dilemparkan setiap saat.

image

image

Saya tidak tahu apa lagi yang bisa saya tambahkan di sini untuk mendukung Anda dalam menemukan masalah, getCurrentPosition mengembalikan batas waktu atau hanya hang jika parameter timeLimit tidak ditentukan. Saya telah mencoba akurasi lokasi yang berbeda. Apakah ada yang punya masalah ini?

Versi 5.3.2+2 berfungsi dengan baik di simulator iOS (dengan lokasi khusus yang ditentukan), perangkat nyata Android, dan emulator Android

@mvanbeusekom , saya telah membaca semua ini, dan saya memutakhirkan ke versi terbaru untuk memperbaiki masalah penundaan 10 detik.

Mungkin saya melewatkan sesuatu, tetapi ada sesuatu yang tidak bisa saya lakukan lagi di versi baru (geocoding).
Saya dulu dapat secara manual mengatur Posisi ke pusat kota (jika pengguna menolak lokasi), dengan melakukan hal berikut:

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

Sekarang, sepertinya _placemarkFromAddress_ telah diubah menjadi _ locationFromAddress _, jadi saya mencoba beradaptasi dengan melakukan perubahan berikut pada rumus saya:

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

Tapi saya mendapatkan kesalahan berikut:

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

Bagaimana saya bisa mengubah lokasi menjadi Posisi, atau pada akhirnya, jika pengguna menolak lokasi, bagaimana saya sekarang dapat mengatur Posisinya ke pusat kota?

Terima kasih.

Saya memperbarui ke versi terbaru, memperbaiki masalah untuk saya πŸ‘πŸ‘πŸ‘

Apakah halaman ini membantu?
0 / 5 - 0 peringkat