【问题标题】:How to track the device location (iOS and Android) device using Phonegap如何使用 Phonegap 跟踪设备位置(iOS 和 Android)设备
【发布时间】:2013-07-09 03:55:24
【问题描述】:

我想知道用户何时到达或离开某个位置。我曾尝试使用无线网络(检查移动设备)来执行此操作,但由于多种原因我无法做到。

1) 我需要实时更新或每 1 到 5 分钟更新一次有关哪些设备已连接以及哪些设备刚刚断开连接的信息。

2) 我在同一网络上从我的 PC 到我的 iPhone 的 ping 非常高(仍然不知道为什么)。

现在我想使用在 iOS 上暂停或在 Android 中在后台运行的 Phonegap 应用程序(在后台运行)中使用地理定位。

任何帮助将不胜感激。

【问题讨论】:

    标签: android ios geolocation cordova


    【解决方案1】:

    2019 年 5 月 25 日更新

    我下面的原始答案是 6 岁,相对于当前的移动操作系统版本已经过时。 例如,部分唤醒锁不再适用于现代 Android 版本。

    今天我的建议是(如果你有一个严肃的商业应用程序而不是一个爱好项目)使用cordova-background-geolocation plugin 的付费版本Transistorsoft。 免费版适用于 iOS,但对于 Android 则需要许可证,费用约为数百美元。 但是我认为这个价格是值得的:在我 10 多年创建位置感知移动应用程序的经验中,这是我遇到的最复杂和最可靠的解决方案。 只需支付许可费用,您就可以访问不断更新和维护的私有存储库,以与新版本的 Android 和 iOS 兼容。

    如果您正在寻找免费/开源解决方案,我会选择cordova-plugin-background-geolocation,它是 Transistorsoft 原始插件的开源分支。 然而,我对这个插件的体验好坏参半;由于是免费/开源的,它没有像付费的 Transistorsoft 插件那样频繁更新。 由于最近版本的 Android 中对后台位置的新的更严格的限制,我遇到了问题,这需要很长时间才能解决或根本没有修复(请参阅插件的 issue list)。

    原始答案(2013 年 6 月 11 日)

    首先要说的是,创建一个在后台运行时接收位置更新的 Phonegap 应用程序是完全可能的,但并非易事。我自己完成了,并在 Android 和 iOS 平台上发布了应用程序。

    如果您需要准确且定期的位置更新,我建议您在目标设备上使用 GPS 接收器。在 Phonegap 中,您可以在请求位置更新时设置“highAccuracy”标志。 watchPosition() 函数将在设备接收到来自 GPS 接收器的更新时提供新的位置信息,因此您可以像这样使用它:

    navigator.geolocation.watchPosition(successCallback, errorCallback, {
      enableHighAccuracy: true,
      timeout: 10000,
      maximumAge: 0
    });
    

    有关更多详细信息,请参阅Phonegap geolocation API documentation(请注意在 Android 和 iOS 上运行所需的权限)。

    要让您的应用在 Android 或 iOS 上的后台运行,您需要设置各自的原生开发环境:适用于 Android 的 Eclipse,适用于 iOS 的 XCode。您将无法使用Phonegap Build,因为在这两种情况下都需要自定义设置才能使其正常工作。请参阅Phonegap platform guides 了解如何执行此操作。

    要让您的应用在 Android 后台运行,您需要编写自定义 Android 服务,或者您可以像我一样使用 Phonegap 插件获取“部分唤醒锁”(see here) 以保持您的应用程序在后台运行并在屏幕关闭时接收位置更新。请注意,此插件的original version 已过时,不适用于更新版本的Phonegap,也不支持部分唤醒锁。不过,我已经对其进行了更新和扩展以供我自己使用:您可以在我对this question 的回答中找到它的源代码。

    为了让您的应用在 iOS 上保持在后台运行,您需要做些不同的事情;您不需要插件,只需一个项目设置。

    您可以手动编辑项目 .plist 并添加值为“location”的键“UIBackgroundModes”键,或者在 XCode 中打开您的项目后,添加值为“App”的“Required Background Modes”键注册位置更新”。这将导致 iOS 在每次收到位置更新时触发您使用 watchPosition() 注册的 JS 回调函数。 See here 了解有关 iOS 项目密钥的更多信息,background modes

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答,我需要设备每 5 分钟更新一次位置,我可以控制,对吗?只要设备有互联网连接,它就应该可以工作。
    • 如果你想以固定的时间间隔更新位置,你可以使用超时来调用 getCurrentPosition(),例如setTimeout(function(){navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{enableHighAccuracy:true})}, 5*60*1000) 如果设备有 GPS 接收器,则无需连接互联网即可接收位置更新。
    • 会发生什么我需要通过 Web 服务将位置插入到数据库中,这会在后台工作吗?我在某处读到不会调用 Web 服务,对此有什么想法吗?感谢您的帮助。
    • iOS 会在收到位置时执行successCallback 函数。如果您使此功能将数据推送到远程 Web 服务,我不明白为什么它不应该工作。不过有一件事;我不确定 setTimeout 是否会继续在后台执行,因此在后台运行时 watchPosition() 可能是更好的选择。
    • 如果您使用的是 PhoneGap Build,您可以在 config.xml 中使用此未记录的 xml 设置 UIBackgroundModes 键。 <gap:config-file platform="ios" parent="UIBackgroundModes" overwrite="true"> <array> <string>location</string> </array> </gap:config-file>
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2021-07-17
    • 2012-04-17
    相关资源
    最近更新 更多