Flutter-geolocator: Добавить поддержку отслеживания местоположения в фоновом режиме

Созданный на 31 июл. 2018  ·  82Комментарии  ·  Источник: Baseflow/flutter-geolocator

Самый полезный комментарий

Я также столкнулся с этой проблемой и разработал свой собственный плагин для фоновых обновлений местоположения, вот он, flutter_background_location ,

Все 82 Комментарий

Это одна из основных причин, по которой я не переключил одно из своих приложений на Flutter, отслеживание местоположения в фоновом режиме является обязательным. Спасибо, что держите это в курсе!

Я также изучаю это. Желание создать приложение в корпоративной среде с требованием фонового отслеживания GPS. flutter/plugins#656 (упомянутый выше) еще не доступен в Pub и поддерживает только iOS.
Я подпишусь на эту тему для любых обновлений.

В итоге я написал свою собственную реализацию (по крайней мере, на Android), основанную на этом примере Google , который запускается, когда приложение закрывается.

Я отправляю данные о местоположении в firebase, поэтому мне не нужно ничего отправлять в резервную копию канала метода. Я просто загружаю прямо в Firebase, используя собственный код, когда приходит результат местоположения. Это означает, что я не могу обобщить его, чтобы помочь этому плагину, но этот образец репозитория может быть полезен.

Я нашел решение для обобщения вашего метода @aidandavis .
В этом пакете все местоположения хранятся в sqlite.
Если ваша служба переднего плана может принимать поставщика хранилища sqlite/firebase/... .
С помощью MethodChannel мы можем получить местоположение файла базы данных, и приложение флаттера может его прочитать.

Обновление: пример Google не препятствует режиму Doze. Если устройство использует дремлет, сеть и GPS могут быть убиты вашим сервисом.

Обновление 2: этот поток stackoverflow помогает предотвратить экономию заряда батареи китайских ромов и добавляет приложение в защищенный список.
Это против Дозе

Это определенно способ сделать это. Проблема все еще остается: что-то делать с данными, пока приложение находится в фоновом режиме или система решает его закрыть.

Что касается Doze, он должен применяться только тогда, когда телефон неподвижен (например, на столе). В любом случае, в этот момент нет обновлений местоположения для отслеживания точек — последнее местоположение, отправленное до Doze, все равно будет точным.

Кроме того, код Dart можно встроить так же, как это реализовано в alarm_manager_android. Обратный вызов Android вызывает код Dart без запуска приложения.

Я вижу, что эта функция была удалена из вехи 2.1.0. Его отодвинули на второй план? Мой проект также сильно выиграет от этого.

Ребята, есть новости по этому поводу? Эта функция может добавить крылья этому плагину. Это необходимо.

Возможно, также стоит отметить, что некоторые устройства не могут определять местоположение GPS с выключенным экраном. Я застрял на этом некоторое время и, наконец, обнаружил, что все дело в чипсете устройства. Так что, возможно, стоит дважды проверить это, особенно если это устройство с низким зарядом батареи, такое как часы.

@ibrierley Я не уверен насчет носимых устройств, но все устройства (мобильные / планшеты) с API> = 16 могут получать обновления местоположения, даже когда экран выключен. Я тоже это испытал на себе.

Да, я в основном тестировал на часах Huawei 2 и читал ветку, где был пост с, кажется, инженером Huawei (может ошибаться), говоря, что это заложено в чипсете, поэтому они не могли это исправить. (Я напишу здесь, если смогу найти тему, но не нашел ее при быстром поиске).

В итоге я сделал экран черным, но я ненавижу это решение :) (но оно работает, просто не совсем уверен, экономит ли оно столько заряда батареи, поэтому может привести к принудительному включению экрана с чем-то отображаемым).

@ martijn00 Интересно, не улучшит ли плагин Geofence эту функцию? Я считаю, что фоновое выполнение будет иметь решающее значение, и многие из нас ожидают этого. Дайте мне знать, что вы думаете...

Надеюсь, вы скоро добавите сервис BG :)

Привет!
Каково текущее состояние этого вопроса? кто-то работает над этим? или отложили?

Привет, ребята, что вы думаете о https://pub.dartlang.org/packages/flutter_background_geolocation?
Разве этот плагин не обеспечивает то, что здесь спрашивают?

Привет, ребята, что вы думаете о https://pub.dartlang.org/packages/flutter_background_geolocation?
Разве этот плагин не обеспечивает то, что здесь спрашивают?

Есть, но стоит $300+

@christocracy , я думаю, что твоя посылка стоит каждого цента, но я слишком бедный банкомат :) Смотрю это пространство

привет, можно ли бесплатно отслеживать местоположение @christocracy в реальном времени?

С нетерпением жду этого!

Как вы думаете, можно будет начать работу над ним в этом году?

Как вы думаете, можно будет начать работу над ним в этом году?

Приступить к работе может любой желающий. Вклад приветствуется.

Мейнтейнеры этого проекта неплохо справляются с принятием входящих изменений от сообщества.

Хорошо, дайте ресурсы и место в коде, с чего начать, и я стараюсь изо всех сил: я мог бы потратить несколько недель, чтобы решить эту проблему, но во-первых, мне нужно глубже проникнуть в Android :(, мне просто любопытно, если кто-то работает в теме ;)

Я ценю ваш энтузиазм :1st_place_medal:

gimmie ресурсы и место в коде, с чего начать

Я считаю, что вам придется потрогать и понять весь этот плагин.


Однако... Прежде чем приступить к кодированию, следует рассмотреть несколько проблем проектирования высокого уровня.

  1. На Android более новой версии Android (API 26) единственным способом получения высокоточных обновлений местоположения является использование службы переднего плана. Последняя версия (Android Q) также будет иметь дополнительное разрешение (для получения местоположения в фоновом режиме). Поэтому необходимо решить 3 различных поведения, чтобы обеспечить совместимость: Android до 26, Android 26 и Android Q.
  2. Чтобы использовать службу переднего плана, вам необходимо показать системное уведомление. Вероятно, каждое приложение захочет иметь настраиваемое уведомление.
  3. Совместимость с iOS. Geolocator API должен максимально скрывать различия между платформами.
  4. Службу переднего плана можно остановить и перезапустить так же, как и активность. Нужна логика, чтобы справиться с этим. У Flutter нет простого способа сделать это. Единственный пример, который я знаю, это плагин alarm_manager . Но он также глючит и не обрабатывает все случаи. Я не знаю ни одной библиотеки Flutter с открытым исходным кодом, которая делает это правильно.

В нашем случае нам нужно отслеживать больше данных в течение длительных периодов времени (местоположение, bluetooth, датчики). Таким образом, если каждый плагин обрабатывает долго работающую логику отдельно, это не подходит для использования, потому что каждый плагин будет иметь отдельную службу переднего плана, и пользователь увидит три разных уведомления.

Я надеюсь, что Google добавит эту функцию во флаттер из коробки: p

Здравствуйте, тема закрыта? Мне тоже нужна фоновая геолокация для андроида и ios для флаттера! Какая лучшая библиотека для этого?

Просто чтобы добавить мой +1 к этому запросу функции. Для некоторых приложений это шоу-стоппер.
Было бы удивительно иметь его.

+1 Было бы очень полезно для стольких приложений

Это крайне необходимо в моем проекте... Я был впечатлен тем, что нашел в пабе, но 300 долларов?

Я также столкнулся с этой проблемой и разработал свой собственный плагин для фоновых обновлений местоположения, вот он, flutter_background_location ,

+1 Тоже жду.

+1 Это очень нужно!

  • Эта функция нужна. Пожалуйста, добавьте это!
  • 1

@milesgranger @zeissus @shishirraven и другие

Если у вас есть эта проблема, вместо того, чтобы писать +1 в комментарии, поставьте лайк этой проблеме, это имеет больше смысла.

@ AlexCampos95 Почему бы тебе не спросить меня в моем репозитории?

Любое решение еще?

любое решение?

любой?

Не знаю, полезно ли это, работал над этим несколько месяцев назад.
https://github.com/akinsete/Flutter-Background-Location-Service

Попробуйте.

В четверг, 12 декабря 2019 г., в 12:05 Феликс Хамборг уведомления[email protected]
написал:

любой?


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/Baseflow/flutter-geolocator/issues/53?email_source=notifications&email_token=AFKOFXJ2RA2FV2Q6LBZBUXTQYKDNZA5CNFSM4FM72VCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEGXV2AQ##
или отписаться
https://github.com/notifications/unsubscribe-auth/AFKOFXLSVIXG74CNIBXLPQDQYKDNZANCNFSM4FM72VCA
.

Единственное, что у меня реально работает, это workmanager + геолокатор . Если экономия заряда батареи будет отключена для вашего приложения, это будет работать постоянно, даже после перезагрузки телефона.

Привет, Егор Вялов.

Это кажется хорошей идеей. У вас есть пример проекта, который реализует
оба для фонового мониторинга местоположения? Если вы можете, пожалуйста, поделитесь.

Спасибо

В пт, 13 декабря 2019 г., в 01:52 Егор Вялов уведомление[email protected]
написал:

Единственное, что действительно работает для меня, это workmanager
https://pub.dev/packages/workmanager + геолокатор
https://pub.dev/packages/геолокатор . Если экономия заряда батареи будет отключена
для вашего приложения это будет работать постоянно даже после перезагрузки телефона.


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/Baseflow/flutter-geolocator/issues/53?email_source=notifications&email_token=AFKOFXJ3L4B6SVPCWOUYBLLQYNENLA5CNFSM4FM72VCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEGZKOXY#issuecom#issuecom
или отписаться
https://github.com/notifications/unsubscribe-auth/AFKOFXOP3K36MV6LCE3E7HTQYNENLANCNFSM4FM72VCA
.

@akinsete , клиент высокой доступности: https://github.com/estevez-dev/ha_client

Workmanager непоследовательен в iOS, у вас нет никакого контроля над тем, когда задача будет запускаться, поэтому он не будет работать для целей обновления местоположения в реальном времени. На Android минимальная частота составляет 15 минут, так что это тоже не работает.

Нам действительно нужно, чтобы это было реализовано во флаттере из коробки.

У меня нет большого опыта работы с Android, но похоже, что есть отдельный вызов для фоновых обновлений местоположения по сравнению с передним планом (который в настоящее время используется в этом плагине). Не уверен, как это будет работать, но я думаю, что мы хотели бы каким-то образом использовать оптимальную функцию в зависимости от того, в каком состоянии находится приложение.

Есть ли другие обновления по этому поводу? Это довольно важная функция для пакета отслеживания местоположения, и было бы очень приятно иметь его, если он должен стать пакетом определения местоположения номер 1 для флаттера.

Плагин @christocracy стоит своих денег, и он отвечает очень, очень быстро. Если фоновое местоположение важно для вашего приложения, это номинальная стоимость.

@jamesdixon , эта библиотека великолепна. Но у меня есть приложение диспетчера задач, в котором задачи имеют уведомление о местоположении. Используя geolocator + flutter_local_notifications, я могу запускать push-уведомления, когда приложение находится на переднем плане, но не работает, когда приложение переходит в фоновый режим. flutter_background_geolocation слишком много для моих требований.

Возможно, эта библиотека может вам помочь:
https://github.com/rekab-app/background_locator

Мааааан, вы найдете здесь жемчужину, это ИМЕННО то, что мне нужно, единственная проблема в том, что у нее нет документации.

Возможно, эта библиотека может вам помочь:
https://github.com/rekab-app/background_locator

Мааааан, вы найдете здесь жемчужину, это ИМЕННО то, что мне нужно, единственная проблема в том, что у нее нет документации.

Мне удалось выполнить их пример ... Он работает нормально, иногда кажется, что он перестает записывать координаты, когда я закрываю основное приложение, и выполняет службу в фоновом режиме ... Но я должен проверить это снова ...

Дайте мне знать, если вам нужна помощь, чтобы выполнить его :)

У меня это работает хорошо, единственная проблема заключается в сохранении на диске в функции обратного вызова, служба не регистрирует собственный код плагинов, и поэтому я не могу совершать собственные вызовы, например, с помощью path_provider, даже если приложение убито Изолировать отправит в ReceivePort из убитого FlutterActivity, поэтому ничего не прослушивается. При перезапуске мне нужно убить изолят, а затем воссоздать его, используя новый порт, но я не думаю, что это лучшее решение, лол.
Я также нашел этот пример , который очень похож на то, что делает библиотека (есть служба, которая выполняет код дротика с уведомлением), но они регистрируют запись плагинов в файле Kotlin, чтобы они могли хранить вещи на диске
Если бы вы знали, как я могу получить LatLng из функции обратного вызова, это было бы здорово🙏

@christocracy был бы признателен, если бы вы могли отправить ключ таким образом, потому что я пробовал все вышеперечисленные решения, и ни одно из них, похоже, не работает последовательно (либо они прекращают работу после закрытия приложения, либо прекращают запись). В настоящее время я создаю коронный трекер по просьбе директора моей местной больницы. Если вы можете помочь мне, это будет оценено.

В настоящее время я создаю коронный трекер по просьбе директора моей местной больницы. Если вы можете помочь мне, это будет оценено.

Вы, вероятно, захотите разветвить какой-нибудь существующий проект на Github, а не начинать с нуля.

@RomanJos @Ashar2shahid https://corona-trace.github.io/

@christocracy Это именно то, что я пытался создать - поиск плагинов background-location-plugins для флаттера привел меня сюда. Однако ссылка на этом сайте: https://corona-trace.github.io/
для Slack канал не работает. У вас есть другая ссылка на slack?

Я прошел через репозиторий - это сэкономит мне много работы, когда я найду 300 долларов плюс. Apple пытается создать что-то подобное с помощью Bluetooth — они больше заботятся о конфиденциальности — но я думаю, что конфиденциальность местоположения — это небольшая цена, которую нужно заплатить в наше время, создание этого, использование Google Takeout и т. д. — это именно то, что я имел в виду.

@tatiblockchain , пожалуйста, зайдите в мой репозиторий, чтобы обсудить, пожалуйста.

Почему это так важно иметь из коробки?

@MazEbeid , что именно ты имеешь в виду?

Я хотел бы иметь возможность поддерживать его, у меня просто нет знаний, необходимых для его создания. Тоже не нашел времени научиться. Пожалуйста, не стесняйтесь создавать запрос на вытягивание или, может быть, вы можете предоставить какой-нибудь хороший ресурс о том, как это сделать, чтобы я мог его создать (помимо учебника с сайта Flutter , я читал это много раз, но мне трудно получить твердое понимание)?

Я имел в виду, почему команда Flutter не добавляет хороший и удобный плагин для фоновой выборки местоположения.

Я использовал этот плагин background_locator , который работает хорошо, но на данный момент он не поддерживает обновления местоположения на iOS, когда приложение закрывается.

Вступил в клуб без всякой надежды =(

В настоящее время я использую пакет background_locator . Это не идеально, но работает

background_locator хорош... но у него есть свои проблемы.

Я очень заинтересован в том, чтобы найти что-то более надежное (надеюсь, это здесь), и я был бы не против иметь некоторые лучшие практики для хранения этих значений, когда, например, приложение находится в фоновом режиме или экран выключен.

Я обнаружил, что многие варианты не являются безопасными для изоляции и вызывают такие проблемы, как повреждение данных или даже просто ошибки доступа, что не идеально при работе с фоновым решением.

@Flavsditz В настоящее время я планирую разработать собственный плагин для отслеживания bg. Я, вероятно, собираюсь отслеживать местоположение, отображая пузырь чата (могу ошибаться, но я думаю, что Android требует службы переднего плана, чтобы поддерживать работу службы) на Android. Но я понятия не имею об отслеживании на iOS.

Я бы с удовольствием использовал этот плагин, но из-за недоступности фоновых обновлений местоположения я вынужден выбрать что-то другое, что может обеспечить эту функцию, даже если мне придется заплатить 300 долларов +. Эта функция очень важна для любого приложения с геолокацией.

Я бы с удовольствием использовал этот плагин, но из-за недоступности фоновых обновлений местоположения я вынужден выбрать что-то другое, что может обеспечить эту функцию, даже если мне придется заплатить 300 долларов +. Эта функция очень важна для любого приложения с геолокацией.

Вы пробовали этот плагин? Он был недавно обновлен, и он должен поддерживать фоновое местоположение.
https://github.com/rekab-app/background_locator

@mvanbeusekom У вас есть намерения включить это? Было бы невероятно круто. Многим это нужно.

@ndhbr да, я намерен поддерживать получение обновлений позиции в фоновом режиме. Однако я пока не нахожу для этого времени. Каждый раз, когда я начинаю, появляется что-то еще (более важное). Теперь, например, выпущена iOS 14, в которой представлен новый API для разрешений на определение местоположения, который необходимо поддерживать, чтобы пользователи могли использовать геолокатор в iOS 14.

Так что, если вы чувствуете себя комфортно, было бы здорово, если бы вы могли начать, может быть, острые углы. Моя идея состоит в том, чтобы предоставить разработчикам возможность зарегистрировать метод обратного вызова Dart, который будет выполняться (только), когда приложение находится в фоновом режиме каждый раз, когда поступает обновление позиции (как описано в этой статье ). Если бы мы могли составить план, это уже очень помогло бы. Разбейте работу, которую нужно сделать, на более мелкие части.

@mvanbeusekom
А, хорошо, спасибо за обновление. Я могу понять, что. Спасибо за старания.

Статью уже знаю почти наизусть, но все равно не просто.

Я уже неделю пытаюсь заставить background_locator работать стабильно (часто не работает на Android), и они работают с изолятами. Изолировать запускается и получает местоположение в фоновом режиме. Моя текущая процедура состоит в том, чтобы заполнить файл байт за байтом в обратном вызове и прочитать файл из последнего байта в пользовательском интерфейсе. К сожалению, Android записывает местоположение в callback только каждые несколько минут, и поэтому я теряю почти все местоположения. Под iOS процедура работает хорошо.

Может быть, это тоже какое-то вдохновение.

Есть ли какой-либо СТАБИЛЬНЫЙ альтернативный способ обработки фонового местоположения?

И вы, ребята, решили добавить эту функцию в будущем?

Есть ли какой-либо СТАБИЛЬНЫЙ альтернативный способ обработки фонового местоположения?

И вы, ребята, решили добавить эту функцию в будущем?

https://github.com/rekab-app/background_locator работает хорошо.

@TheMisir Спасибо. Вы уверены, что он работает хорошо и подходит для рабочего приложения? Здесь также есть отчеты о сбоях https://github.com/rekab-app/background_locator/issues.

@TheMisir Спасибо. Вы уверены, что он работает хорошо и подходит для рабочего приложения? Здесь также есть отчеты о сбоях https://github.com/rekab-app/background_locator/issues.

У меня не было выбора. Поэтому мы используем его в производстве. Да, это не работает идеально, но работает, если правильно настроить. (Иногда проблемы в наших проектах были вызваны неправильной конфигурацией).

Есть ли какой-либо СТАБИЛЬНЫЙ альтернативный способ обработки фонового местоположения?

И вы, ребята, решили добавить эту функцию в будущем?

Да, так как мне срочно нужна была функция в продакшене, я купил лицензию на https://www.transistorsoft.com/shop/products/flutter-background-geolocation. Я использую его в течение 1 месяца в производстве, и пока он работает нормально.

Как только я добавлю:
<uses-permission android:name="android.permission.INTERNET" /> <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" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
к моему манифесту (нашел их в примере background_locator), я мог бы использовать:
var userPosition = await Geolocator().getCurrentPosition();
в фоновом режиме с помощью background_fetch: ^0.6.0.

Так что это только каждые 15 минут, но работало довольно хорошо.
Сейчас попробую background_locator

Как только я добавлю:
<uses-permission android:name="android.permission.INTERNET" /> <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" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
к моему манифесту (нашел их в примере background_locator), я мог бы использовать:
var userPosition = await Geolocator().getCurrentPosition();
в фоновом режиме с помощью background_fetch: ^0.6.0.

Так что это только каждые 15 минут, но работало довольно хорошо.
Сейчас попробую background_locator

Я столкнулся с этой проблемой на background_locator https://github.com/rekab-app/background_locator/issues/167.

А потом я перешел на этот пакет https://github.com/transistorsoft/flutter_background_geolocation , этот пакет отличный

@ Dereumaux-Adrien, спасибо за обновление! Действительно ценю это. 15 минут мне достаточно. Попробую..

@ bhanuka96 Действительно, он работает безупречно, но, поскольку я еще не знаю, имеет ли мой проект какую-либо коммерческую ценность, я не собираюсь тратить деньги на плагины.
Я уже ценю транзисторсофт, так как background_fetch тоже от них.
Если проект даст хороший результат, думаю, позже я перейду на flutter_background_geolocation.

TLDR для новичков в этой теме

Геолокатор еще не полностью поддерживает фоновую геолокацию.

Решения следующие

Если вы можете заплатить, https://pub.dev/packages/flutter_background_geolocation работает легко и хорошо.
Если вы можете потратить на это время, вы должны заставить работать https://pub.dev/packages/background_locator (сам пока не смог).
Если вы хотите начать быстро, пока не можете тратить деньги и у вас все в порядке с проверкой биографических данных каждые 15 минут: https://pub.dev/packages/background_fetch с https://pub.dev/packages/geolocator с изменения манифеста написаны здесь

Вы также можете использовать WorkManager, как описано здесь: https://medium.com/@pierre.sabot/how-to-fetch-user-location-in-background-with-flutter-e3494021bdf5

Он по-прежнему ограничен 15 минутами для Android, но это другой подход, простой API.

Я использовал https://pub.dev/packages/background_location , чтобы отслеживать местоположение пользователя в фоновом режиме и сохранять в firestore.

Также мне интересно, действительно ли вы не хотите, чтобы обратный вызов вызывался, когда местоположение прибывает в фоновом режиме (чтобы вы могли обработать местоположение или сохранить его где-нибудь, чтобы его можно было обработать, когда приложение вернется на передний план) .

Не уверен, как это обрабатывается в данный момент в плагине location . Но именно так я и думал сделать это для geolocator .

Кстати, не очень уважительно относиться к другим плагинам.

Вы также можете использовать WorkManager, как описано здесь: https://medium.com/@pierre.sabot/how-to-fetch-user-location-in-background-with-flutter-e3494021bdf5

Он по-прежнему ограничен 15 минутами для Android, но это другой подход, простой API.

Пробовал получать позицию периодически каждые 15 минут и все работает.
Но, устанавливая периодическое событие каждый час, я не могу получить позицию. Workmanager работает (появляется уведомление), но я не могу получить местоположение.
Вы пытались установить периодическое событие? Если да, то как долго?

@mvanbeusekom , должен ли я открыть отдельную проблему для поддержки обновлений местоположения, когда приложение находится на переднем плане?
Под передним планом я подразумеваю, что приложение запущено, но пользователь нажал кнопку «Домой», переключился на другое приложение или экран был выключен. Для Android нам нужно добавить службу переднего плана, которая отображает постоянное уведомление, предупреждающее пользователя о том, что приложение использует его местоположение. Для iOS в строке состояния отображается зеленый значок (это разрешено разрешением NSLocationWhenInUsage).
Я думаю, что поддержка этого будет намного проще и решит многие случаи использования, когда фактические фоновые обновления местоположения не требуются. (Фоновый доступ к местоположению означает, что приложение запускается, если оно завершается при получении обновлений местоположения, и фоновая служба может работать независимо от приложения).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги