我想知道用户何时到达或离开某个位置。我试图使用无线网络(检查移动设备)来做到这一点,但由于几个原因我做不到。
1) 我需要实时更新或每 1 - 5 分钟更新一次有关哪些设备已连接以及哪些设备刚刚断开连接的信息。
2)我在同一网络上从我的 PC 到我的 iPhone 的 ping 非常高(仍然不知道为什么)。
现在,我想使用在 iOS 上暂停或在 Android 中在后台运行的 Phonegap 应用程序(在后台运行)中的地理位置来执行此操作。
任何帮助,将不胜感激。
我想知道用户何时到达或离开某个位置。我试图使用无线网络(检查移动设备)来做到这一点,但由于几个原因我做不到。
1) 我需要实时更新或每 1 - 5 分钟更新一次有关哪些设备已连接以及哪些设备刚刚断开连接的信息。
2)我在同一网络上从我的 PC 到我的 iPhone 的 ping 非常高(仍然不知道为什么)。
现在,我想使用在 iOS 上暂停或在 Android 中在后台运行的 Phonegap 应用程序(在后台运行)中的地理位置来执行此操作。
任何帮助,将不胜感激。
2019 年 5 月 25 日更新
我在下面的原始答案是 6 岁,并且相对于当前的移动操作系统版本已经过时。例如,部分唤醒锁不再适用于现代 Android 版本。
今天我的建议是(如果你有一个严肃的商业应用程序而不是一个爱好项目)使用Transistorsoftcordova-background-geolocation
插件的付费版本。免费版适用于 iOS,但对于 Android 则需要许可证,费用约为数百美元。但是我认为这个价格是值得的:在我 10 多年创建位置感知移动应用程序的经验中,这是我遇到的最复杂和最可靠的解决方案。只需支付许可证费用,您就可以访问不断更新和维护的私有存储库,以与新版本的 Android 和 iOS 兼容。
如果您正在寻找免费/开源解决方案,我会选择cordova-plugin-background-geolocation,它是 Transistorsoft 原始插件的开源分支。然而,我对这个插件的体验好坏参半;由于是免费/开源的,它没有像付费的 Transistorsoft 插件那样频繁更新。由于最近版本的 Android 中对后台位置的新的更严格的限制,我遇到了问题,这需要很长时间才能解决或根本没有得到修复(请参阅插件的问题列表)。
原始答案(2013 年 6 月 11 日)
首先要说的是,创建一个在后台运行时接收位置更新的 Phonegap 应用程序是完全可能的,但并非易事。我自己完成并在 Android 和 iOS 平台上发布了应用程序。
如果您需要准确且定期的位置更新,我建议您在目标设备上使用 GPS 接收器。在 Phonegap 中,您可以在请求位置更新时设置“highAccuracy”标志。当设备从 GPS 接收器接收更新时,watchPosition() 函数将提供新的位置信息,因此您可以像这样使用它:
navigator.geolocation.watchPosition(successCallback, errorCallback, {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0
});
有关更多详细信息,请参阅Phonegap 地理定位 API 文档(请注意在 Android 和 iOS 上进行此项工作所需的权限)。
为了让您的应用程序在 Android 或 iOS 的后台运行,您需要设置它们各自的原生开发环境:适用于 Android 的 Eclipse,适用于 iOS 的 XCode。您将无法使用Phonegap Build,因为在这两种情况下都需要自定义设置才能使其正常工作。请参阅Phonegap 平台指南以了解如何执行此操作。
为了让您的应用程序在 Android 的后台运行,您需要编写一个自定义的 Android 服务,或者您可以像我所做的那样使用 Phonegap 插件来获取“部分唤醒锁”(请参见此处)以保持您的应用程序在背景并在屏幕关闭时接收位置更新。请注意,此插件的原始版本已过时,不适用于更新版本的 Phonegap,也不支持部分唤醒锁。但是,我已经更新并扩展了它以供我自己使用:您可以在我对这个问题的回答中找到它的源代码。
为了让你的应用程序在 iOS 上运行在后台,你需要做一些不同的事情;您不需要插件,只需一个项目设置。
您可以手动编辑项目 .plist 并添加值为“location”的键“UIBackgroundModes”键,或者在 XCode 中打开项目后,添加值为“App registers for location”的“Required Background Modes”键更新”。这将导致 iOS 在每次收到位置更新时触发您使用 watchPosition() 注册的 JS 回调函数。有关 iOS 项目键和背景模式的更多信息,请参见此处。
希望这可以帮助!