uni-app 手机端定位问题

uni-app定位链接

主要遇到的问题,app上android无法获取定位信息,ios可以,模拟器上都可以获取定位,H5浏览器中获取定位同样失败

做法:

uni.getLocation({
    type: 'wgs84',
    geocode: true,
    success: function (res) {
        console.log('当前位置的经度:' + res.longitude);
        console.log('当前位置的纬度:' + res.latitude);
        console.log('位置信息: ' +res.address );
    }
});

注意:

H5:在较新的浏览器上,H5 端获取定位信息,要求部署在 https 服务上,本地预览(localhost)仍然可以使用 http 协议。

H5:国产安卓手机上,H5若无法定位,检查手机是否开通位置服务、GPS,ROM是否给该浏览器位置权限、浏览器是否对网页弹出请求给予定位的询问框。
H5:安卓手机在原生App内嵌H5时,无法定位需要原生App处理Webview。
H5:移动端浏览器普遍仅支持GPS定位,在GPS信号弱的地方可能定位失败。
H5:PC 设备使用 Chrome 浏览器的时候,位置信息是连接谷歌服务器获取的,国内用户可能获取位置信息失败。
H5:使用地图和定位相关需要在腾讯地图开放平台申请密钥,填写在 manifest.json 中。
H5:微信公众号可使用微信js sdk,详见
H5:2.9.9 alpha升级,优化 uni.getLocation 支持通过 IP 定位。默认通过getLocation获取,如果获取失败,备选方案是通过 IP 定位获取,用的是内置公共的key,如果你想正确使用,就填写正常的key。如果你不想使用,就填写错误的key即可。key配置:manifest.json —> H5配置 —> 定位和地图 —> key。
App:Android由于谷歌服务被墙,或者手机上没有GMS,想正常定位就需要向高德等三方服务商申请SDK资质,获取AppKey。否则打包后定位就会不准。云打包时需要在manifest的SDK配置中填写Appkey。在manifest可视化界面有详细申请指南,详见:https://ask.dcloud.net.cn/article/29。离线打包自行在原生工程中配置。注意包名、appkey、证书信息必须匹配。真机运行可以正常定位,是因为真机运行基座使用了DCloud向高德申请的sdk配置,打包后必须由开发者自己申请。如果手机自带GMS且网络环境可以正常访问google定位服务器,此时无需在manifest填写高德定位的sdk配置。
App: 组件默认为国测局坐标gcj02,调用 uni.getLocation 返回结果传递给 组件时,需指定 type 为 gcj02。
App:定位和map是2个东西。通过getLocation得到位置坐标后,可以在任意map地图上展示,比如定位使用高德,地图使用google的webview版地图。如果坐标系不同时,注意转换坐标系。
App:如果使用web-view加载地图,无需在manifest里配地图的sdk配置。
App:持续定位方案:iOS端可以申请持续定位权限,参考。Android如果进程被杀,代码无法执行。可以使用unipush,通过服务器激活App,执行透传消息,让App启动然后采集位置。Android上,即使自己写原生插件做后台进程,也很容易被杀,unipush是更合适的方案
小程序:api默认不返回详细地址中文描述。需要中文地址有2种方式:1、使用高德地图小程序sdk,在app和微信上都可以获得中文地址,参考。2、只考虑app,使用plus.geolocation也可以获取中文地址。manifest里的App SDK配置仅用于app,小程序无需在这里配置。
可以通过用户授权API来判断用户是否给应用授予定位权限https://uniapp.dcloud.io/api/other/authorize
不同端,使用地图选择时基于的底层地图引擎不一样,如微信小程序和H5是腾讯地图,App和阿里小程序是高德地图,百度小程序是百度地图,详见地图map组件的使用注意事项。app中也可以使用百度定位,在manifest中配置,打包后生效。但app-nvue里只能用百度定位,不能用百度地图。另外选择地图、查看地图位置的API也仅支持高德地图。所以App端如无特殊必要,建议使用高德地图。

以上注意事项意思是:

1.H5必须https协议
2.app打包后,需要引用高德地图(百度不推荐,百度定位偏差较大),否则无法获取地址信息
3.模拟可以定位,是因为模拟器中集成了高德地图

另外H5端获取地址信息,发现通过getLocation获取的地址信息也没那么准确,故通过getLocation获取到经纬度后,去调用高德的反地理坐标的接口,获取到位置信息

结果:

export function getLocation() {
    const that = this
    // #ifdef APP-PLUS
    plus.geolocation.getCurrentPosition(res => {
      uni.setStorageSync('longitude',res.coords.longitude)
      uni.setStorageSync('latitude',res.coords.latitude)
      uni.setStorageSync('locationCity',res.address.city)
      uni.setStorageSync('locationInfo',res)
    })
    // #endif
    // #ifdef H5
    uni.getLocation({
      type: 'gcj02',
      success: function (res) {
         uni.setStorageSync('longitude',res.longitude)
         uni.setStorageSync('latitude',res.latitude)
         let location = res.longitude + ',' + res.latitude
         that.$u.api.getPositionCity({location}).then(res => {
            if(res.data.status === '1'){
              uni.setStorageSync('locationCity',res.data.regeocode.addressComponent.city)
              let locationInfo = {
                address: {
                	city: res.data.regeocode.addressComponent.city,
                	district: res.data.regeocode.addressComponent.district,
                	poiName: "",
                	province: res.data.regeocode.addressComponent.province,
                	street: res.data.regeocode.addressComponent.streetNumber.street,
                	streetNum: res.data.regeocode.addressComponent.streetNumber.number
                },
                addresses: res.data.regeocode.formatted_address,
              }
              uni.setStorageSync('locationInfo',locationInfo)
            }
         });
      }
    });
    // #endif

  }

另外:

andorid高德秘钥参考文章:
查看证书信息
可以使用以下命令查看:

cd到证书目录地址下

keytool -list -v -keystore test.keystore  
Enter keystore password: //输入密码,回车

会输出以下格式信息:

Keystore type: PKCS12    
Keystore provider: SUN    

Your keystore contains 1 entry    

Alias name: test    
Creation date: 2019-10-28    
Entry type: PrivateKeyEntry    
Certificate chain length: 1    
Certificate[1]:    
Owner: CN=Tester, OU=Test, O=Test, L=HD, ST=BJ, C=CN    
Issuer: CN=Tester, OU=Test, O=Test, L=HD, ST=BJ, C=CN    
Serial number: 7dd12840    
Valid from: Fri Jul 26 20:52:56 CST 2019 until: Sun Jul 02 20:52:56 CST 2119    
Certificate fingerprints:    
         MD5:  F9:F6:C8:1F:DB:AB:50:14:7D:6F:2C:4F:CE:E6:0A:A5    
         SHA1: BB:AC:E2:2F:97:3B:18:02:E7:D6:69:A3:7A:28:EF:D2:3F:A3:68:E7    
         SHA256: 24:11:7D:E7:36:12:BC:FE:AF:2A:6A:24:BD:04:4F:2E:33:E5:2D:41:96:5F:50:4D:74:17:7F:4F:E2:55:EB:26    
Signature algorithm name: SHA256withRSA    
Subject Public Key Algorithm: 2048-bit RSA key    
Version: 3

https://ask.dcloud.net.cn/article/29

ios: bundleID

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值