我正在使用Ionic / Angular / Firebase构建应用程序。
该应用程序需要用户的地理位置。我正在使用Ionic native的地理位置插件,并且在Android速度方面遇到了一些问题。
在PC上花费不到500毫秒即可获得电流 地理位置。
在iOS上大约需要1秒钟。
在Android上需要6秒钟以上的时间,有时甚至会完全失败。
这是Ionic Native的问题吗?有专门针对Android的插件吗?
这是我的代码:
ga('set', 'anonymizeIp', true);
我无法想象这段代码是错误的。。正如我所说,它在PC和iOS上都可以很好地工作。如果用户使用的是android,我应该做些什么吗?我可以使用其他插件吗?任何帮助都将是惊人的!
答案 0 :(得分:3)
您正在使用的代码有效。
@Maheshvirus所说的是'cordova-plugin-request-location-accuracy'插件,它实际上允许您提示用户打开GPS的高精度位置信息(并检查并确认它是否首先打开),该信息将“使用GPS,WiFi,蓝牙或蜂窝网络确定位置”。我在我的应用程序中使用了相同的插件,效果很好。
通过快速谷歌搜索,似乎IOS没有高精度模式,因为默认情况下,IOS使用gps,wifi,蓝牙等来获取您的位置...您无法像Android一样将其打开和关闭,这说明为什么IOS总是如此迅速地知道您的位置。因此,在Android设备上,您需要使用@Maheshvirus提到的插件来提示用户将其打开。除非用户将其模式更改为省电模式或仅设备定位模式,否则它应该始终保持打开状态。
PC应该具有更快的互联网连接速度,并且不应该有数据上限或严重的节流(除非网络中立性现在已经完全消失或您处于其他可怕的地方),因此您的浏览器应该能够轻松,快速地找到您通过您所连接的调制解调器/路由器-有关更多详细信息,请参见this post answer。
解决方案
我现在太累了,无法为您提供所需的工作代码示例,但利用Geolocation.watchPosition()而不是getCurrentPosition()可以让您更快地获取位置使用它的经验-和this user seems to have tested it。 watchPosition“用于注册一个处理程序函数,该函数将在每次设备位置更改时自动调用”。 watchPosition函数的用法几乎与getCurrentPosition完全相同,除了调用它时,您必须为其分配一个ID并在完成后使用Geolocation.clearwatch(idname)。 Here is the docs for watchPosition()。因此,很酷的事情是,如果用户移动了,或者电话定位服务认为他们已经移动了,则不必启动对设备GPS的另一个呼叫(这花费了很长时间),因为GPS已经听。
对不起,我没有提供实际的代码修复,但希望这些详细信息对您有所帮助。当我在不同设备上使用getCurrentPosition时,我也遇到了这个问题。 实现watchPosition()应该没有问题,并且应该立即看到android位置延迟的改善-特别是如果您让用户使用该插件打开“高精度位置”模式'cordova-plugin-request-location-accuracy'< / p>
答案 1 :(得分:1)
代码没有错。我在Android手机中也面临同样的问题。 我尝试过的解决方案。
手动解决方案
关闭然后再打开您的位置设置选项,进入设置->位置选项。重新启动手机,然后尝试
检查Google地图是否正在获取您的当前位置。尝试在Google地图上获取您当前的位置。无论如何,如果google map找不到您的当前位置,那么您将无法在应用中访问位置。
一旦您在Google地图上找到了当前位置,您就有可能将该位置输入到您的应用中。
使用插件的解决方案
<plugin name="cordova-plugin-request-location-accuracy" spec="*" />
答案 2 :(得分:0)
我与Geolocation
的情况相似。至关重要的是,只有在Platform
准备好后才能调用本机方法。虽然您应该这样调用它,但忽略它会导致从插件获得响应之前的大量延迟,在Android中更是如此。
import { Platform } from 'ionic-angular'
...
constructor( private platform: Platform) {
this.platform.ready().then(() => {
//request location here
})
}
...