Flutter-geolocator: 添加对后台位置跟踪的支持

创建于 2018-07-31  ·  82评论  ·  资料来源: Baseflow/flutter-geolocator

另见: https ://github.com/flutter/plugins/pull/656

enhancement

最有用的评论

我也遇到了这个问题,我开发了自己的后台位置更新插件,这里是flutter_background_location

所有82条评论

这是我没有将我的一个应用程序切换到 Flutter 的主要原因之一,后台位置跟踪是必须的。 感谢您保持正轨!

我也在研究这个。 希望在具有背景 GPS 跟踪要求的企业环境中构建应用程序。 flutter/plugins#656(上面提到的)还没有在 Pub 上,只支持 iOS。
我将订阅此线程以获取任何更新。

我最终编写了自己的实现(至少在 Android 上),基于这个在应用关闭时运行的 Google 示例

我正在将位置数据推送到 firebase,因此我不需要将任何内容发送回方法通道。 当位置结果到达时,我只是使用本机代码直接上传到 Firebase。 这意味着我不能概括它来帮助这个插件,但是那个示例 repo 可能很有用。

我找到了一个概括您的@aidandavis方法的解决方案。
在这个包中,所有位置都存储在sqlite中。
如果您的前台服务可以接受商店提供商 sqlite/firebase/... 。
使用 MethodChannel 我们可以获得 db 文件位置,flutter 应用程序可以读取它。

更新:Google 示例不会阻止打盹模式。 如果设备使用打盹网络,gps 也可以被您的服务杀死。

更新 2:这个stackoverflow 线程有助于对抗中国 roms 电池节省的东西,并将应用程序添加到受保护的列表中。
对打瞌睡

这绝对是一种方法。 仍然存在的问题是在应用程序处于后台或系统选择关闭它时对数据进行处理。

至于打瞌睡,它应该只适用于手机静止时(比如在桌子上)。 无论如何,此时没有点跟踪位置更新 - 在打瞌睡之前发送的最后一个位置仍然是准确的。

最重要的是,Dart 代码可以像在 alarm_manager_android 中实现的一样嵌入。 Android 回调调用 Dart 代码而不运行应用程序。

我看到此功能已从 2.1.0 里程碑中删除。 它是否被推到了后面? 我的项目也将从中受益匪浅。

各位大佬,有这个更新吗? 此功能可以为该插件添加翅膀。 它是必须的。

可能还值得注意的是,某些设备在关闭屏幕的情况下无法获取 gps 位置。 我一直在这个问题上停留了一段时间,最后发现它归结为设备芯片组。 因此,可能也值得仔细检查一下,特别是如果它是像手表这样的低电量设备。

@ibrierley我不确定可穿戴设备,但所有运行 API >= 16 的设备(手机/平板电脑)即使在屏幕关闭时也能够获取位置更新。 我自己也测试过。

是的,我主要是在华为手表2上进行测试,并阅读了一个帖子,其中有一个帖子我认为是华为工程师(可能是错误的),说它是在芯片组中设置的,所以他们无法修复它(如果我能找到线程,我会在这里发布,但在快速搜索中没有看到它)。

我最终把屏幕变黑了,但我讨厌那个解决方案:)(但它可以工作,只是不太确定它是否能节省那么多电池,所以最终可能会强制屏幕显示某些东西)。

@martijn00我想知道地理围栏插件是否不会增强此功能。 我相信后台执行将是一个关键,我们中的许多人都在期待它。 让我知道你的想法...

希望你们能尽快添加BG服务:)

你好!
这个问题的现状如何? 有人在研究它吗? 还是被推迟了?

嘿伙计们,你对https://pub.dartlang.org/packages/flutter_background_geolocation有什么看法
这个插件不提供这里要求的内容吗?

嘿伙计们,你对https://pub.dartlang.org/packages/flutter_background_geolocation有什么看法
这个插件不提供这里要求的内容吗?

可以,但要300多美元

@christocracy ,我认为你的包裹物有所值,但是我的 atm 太差了 :) 看着这个空间

嗨,可以免费跟踪@christocracy的实时位置吗?

期待这个!

你认为今年有可能开始工作吗?

你认为今年有可能开始工作吗?

任何人都可以立即开始工作。 欢迎投稿。

这个项目的维护者在接受来自社区的更改方面做得很好。

好的,gimmie 资源,并在代码中从哪里开始,我会尽力做到最好:DI 可能会花几个星期来解决它,但首先我需要更深入地了解 android :(,如果有人在工作,我只是好奇在上面 ;)

感谢您的热情:1st_place_medal:

gimmie 资源,并在代码中从哪里开始

我相信您将不得不触摸并理解整个插件。


但是...在开始编码之前应该考虑一些高级设计问题。

  1. 在 android 较新的 Android (API 26) 上,获取高精度位置更新的唯一方法是使用 Foreground 服务。 最新的(Android Q)也将有额外的权限(在后台获取位置)。 因此需要解决 3 种不同的行为以兼容:android pre 26、android 26 和 android Q
  2. 要使用前台服务,您需要显示系统通知。 可能每个应用程序都希望有自定义的通知。
  3. 与 iOS 的兼容性。 Geolocator API 应尽可能隐藏平台之间的差异。
  4. 前台服务可以像活动一样停止和重新启动。 需要逻辑来处理这个。 Flutter 没有简单的方法来做到这一点。 我知道的唯一例子是alarm_manager插件。 但它也有问题,不能处理所有情况。 我不知道有任何开源 Flutter 库可以正确执行此操作。

对于我们的案例,我们需要长时间跟踪更多数据(位置、蓝牙、传感器)。 所以让每个插件单独处理长时间运行的逻辑是不适合使用的,因为每个插件都有单独的前台服务,用户会看到三个不同的通知。

我希望谷歌会在开箱即用的情况下添加这个功能:p

您好,请问这个问题已经解决了吗? 我也需要 android 和 ios 的背景地理位置来颤动! 哪个是最好的库?

只是将我的 +1 添加到此功能请求中。 对于某些应用程序,这是一个引人注目的。
拥有它会很棒。

+1 对这么多应用程序很有帮助

这在我的项目中是非常需要的……我在 pub 上找到的那个给我留下了深刻的印象,但是 300 美元?

我也遇到了这个问题,我开发了自己的后台位置更新插件,这里是flutter_background_location

+1 也期待这个。

+1 这是非常需要的!

  • 需要此功能。 请添加这个!
  • 1

@milesgranger @Zeissus @shishirraven和其他人

如果你有这个问题,不要在评论中写+1 ,而是给这个问题点个赞,这样更有意义。

@AlexCampos95你为什么不在我的仓库问

有什么解决办法吗?

任何解决方案?

任何?

唯一对我有用的是workmanager + geolocator 。 如果您的应用程序禁用了省电功能,即使在手机重启后也将持续工作。

嗨,叶戈尔维亚洛夫

这似乎是个好主意。 你有一个实施的示例项目
都用于后台位置监控? 如果可以,请分享。

谢谢

2019 年 12 月 13 日星期五凌晨 1:52 Yegor Vialov [email protected]
写道:

唯一对我有用的是 workmanager
https://pub.dev/packages/workmanager + 地理定位器
https://pub.dev/packages/geolocator 。 如果电池节省将被禁用
对于您的应用程序,即使在手机重启后,它也会持续工作。


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/Baseflow/flutter-geolocator/issues/53?email_source=notifications&email_token=AFKOFXJ3L4B6SVPCWOUYBLLQYNENLA5CNFSM4FM72VCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEGZKOXY#issuecomment-5653563
或退订
https://github.com/notifications/unsubscribe-auth/AFKOFXOP3K36MV6LCE3E7HTQYNENLANCNFSM4FM72VCA
.

@akinsete ,HA 客户端: https ://github.com/estevez-dev/ha_client

Workmanager 在 iOS 中不一致,您无法控制任务何时运行,因此它无法用于实时位置更新。 在 Android 上,最低频率是 15 分钟,所以这也不起作用。

我们确实需要在开箱即用的情况下实现这一点。

我对 Android 没有太多经验,但与前台位置更新相比,似乎有一个单独的后台位置更新调用(这是该插件中当前使用的)。 不确定它是如何工作的,但我想我们会想根据应用程序所处的状态以某种方式使用最佳功能。

还有其他更新吗? 这是位置跟踪包的一个非常关键的功能,如果这是 Flutter 的排名第一的位置包,那将是非常好的

@christocracy的插件物有所值,而且他的反应非常非常快。 如果后台位置对您的应用程序很重要,那么这是一个象征性的成本。

@jamesdixon那个图书馆很棒。 但我有一个任务管理器应用程序,其中任务有位置通知。 使用 geolocator + flutter_local_notifications 我可以在应用程序处于前台时触发推送通知,但在应用程序进入后台时不起作用。 flutter_background_geolocation 对我的要求来说太多了。

也许这个库可以帮助你:
https://github.com/rekab-app/background_locator

Maaaaan,您在这里找到了一颗宝石,这正是我需要的唯一问题是它缺少文档

也许这个库可以帮助你:
https://github.com/rekab-app/background_locator

Maaaaan,您在这里找到了一颗宝石,这正是我需要的唯一问题是它缺少文档

我设法执行了他们的示例......它工作正常,有时它似乎在我关闭主应用程序并在后台执行服务时停止记录坐标......但我必须再次测试它......

如果您需要帮助来执行它,请告诉我:)

它对我来说很好用,唯一的问题是在回调函数中保存在磁盘上,服务不注册插件本机代码,因此我不能使用 path_provider 进行本机调用,例如,如果应用程序被杀死 Isolate将从被杀死的 FlutterActivity 发送到 ReceivePort,因此没有任何东西在监听。 重新启动时,我需要杀死隔离,然后使用新端口重新创建它,但我认为这不是最好的解决方案,哈哈。
我还发现这个示例与库所做的非常相似(有一个执行带有通知的 dart 代码的服务),但是它们在 Kotlin 文件中注册了插件条目,因此它们能够将内容存储在磁盘上
如果你知道我如何从回调函数中检索 LatLng 那就太棒了🙏

如果您可以通过这种方式发送密钥, @christocracy将不胜感激,因为我已经尝试了上述所有解决方案,但似乎没有一个能始终如一地工作(它们在应用程序关闭或停止录制后终止)。 应当地医院院长的要求,我目前正在构建一个电晕追踪器。 如果您能帮助我,将不胜感激。

应当地医院院长的要求,我目前正在构建一个电晕追踪器。 如果您能帮助我,将不胜感激。

你可能想在 Github 上 fork 一些现有项目,而不是从头开始

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

@christocracy这正是我想要构建的——为颤振搜索背景位置插件将我带到了这里。 但是本网站上的链接: https ://corona-trace.github.io/
对于 Slack 频道不起作用。 你有另一个松弛的链接吗?

我已经完成了回购 - 当我找到 300 美元以上时,这将为我节省很多工作。 苹果正在尝试使用蓝牙构建类似的东西——他们更关心隐私——但我认为——在这些时代,位置隐私是一个很小的代价,像这样构建它,使用谷歌外卖等正是我的想法。

@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,用户需要支持该 API 才能在 iOS 14 上使用地理定位器。

因此,如果您感觉舒适,那么如果您可以开始,那将是很棒的,也许是粗糙的边缘。 我的想法是为开发人员提供一个注册 Dart 回调方法的选项,该方法将(仅)在每次位置更新到达时应用程序在后台时执行(如本文所述)。 如果我们能制定一个计划,那已经很有帮助了。 将需要完成的工作分解成更小的部分。

@mvanbeusekom
哦好的,谢谢更新。 我可以理解。 感谢你付出的努力。

我已经几乎熟记这篇文章,但这仍然不容易。

我已经尝试了一个星期来让 background_locator 稳定运行(通常在 Android 上不起作用)并且它们与隔离器一起工作。 隔离启动并在后台获取位置。 我当前的过程是在回调中逐字节填充文件,并从 UI 中的最后一个字节读取文件。 不幸的是,Android 每隔几分钟就会在回调中写入位置,所以我几乎丢失了所有位置。 在 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的许可证

一旦我添加:
<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 适用于该线程的新手

Geolocator 还不完全支持后台地理定位。

解决方案如下

如果您可以付款, 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

对于 Android,它仍然限制为 15 分钟,但它是另一种方法,简单的 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

对于 Android,它仍然限制为 15 分钟,但它是另一种方法,简单的 API。

我尝试每 15 分钟定期获得该职位,并且一切正常。
但是通过每小时设置一个定期事件,我无法获得该职位。 工作经理工作(出现通知),但我无法获得位置。
您是否尝试过设置周期性事件? 如果是这样,多长时间?

@mvanbeusekom我应该在应用程序处于前台时打开一个单独的问题来支持位置更新吗?
前台是指应用程序正在运行,但用户点击了主页按钮、切换到其他应用程序或屏幕已关闭。 对于 Android,我们需要添加一个前台服务,该服务显示一个持久通知,提醒用户该应用正在使用他们的位置。 对于 iOS,状态栏中会显示一个绿色图标(在 NSLocationWhenInUsage 权限下允许这样做)。
我认为支持这一点会容易得多,并且可以解决许多不需要实际后台位置更新的用例。 (后台位置访问意味着如果在获取位置更新时终止应用程序,并且后台服务可以独立于应用程序运行)。

此页面是否有帮助?
0 / 5 - 0 等级