get-location.md 5.3 KB
Newer Older
D
DCloud_LXH 已提交
1 2 3 4
## uni.getLocation(options) @getlocation

<!-- UTSAPIJSON.getLocation.description -->

W
wanganxp 已提交
5
::: warning 注意
W
wanganxp 已提交
6 7 8 9 10 11 12 13 14 15 16
Web平台本API调用了腾讯地图的免费gcj02坐标转换接口,该接口从2024年7月18日起被腾讯逐步下线,导致老版本中本API无法使用。请立即升级到 `uni-app 4.24版`

升级后注意:
1. manifest中配置好自己的地图厂商key
2. 确保在地图厂商那里配额足够
3. 确保在地图厂商那里有周边服务的权限。否则无法获取周围地址
4. 确保自己的域名在地图厂商那里正确配置了域名白名单

如果运行在微信浏览器中,可以使用微信的jssdk的定位能力。这个是微信向腾讯地图申请的key,开发者无需配置自己的key。

地图厂商的商业授权较贵,如需购买,请点击[获取优惠](https://ask.dcloud.net.cn/explore/map/)
W
wanganxp 已提交
17 18
:::

D
DCloud_LXH 已提交
19 20
<!-- UTSAPIJSON.getLocation.compatibility -->

D
DCloud_LXH 已提交
21 22 23 24 25 26
<!-- UTSAPIJSON.getLocation.param -->

<!-- UTSAPIJSON.getLocation.returnValue -->

### 注意

W
wanganxp 已提交
27
uni-app x的App标准基座定位仅支持wgs84坐标系、不支持逆地址解析、且某些老型号国产Android机因gms问题不支持系统定位、国产Rom可能不支持高度信息。
D
DCloud_LXH 已提交
28 29 30 31 32 33 34

如需更强的定位能力,需加载专业定位sdk。

真机运行基座不包含三方定位sdk。

三方定位sdk方面,暂不支持高德、百度,但支持腾讯定位。

zhaofengliang920817's avatar
zhaofengliang920817 已提交
35 36
::: warning 4.25及以下低版本使用注意:

D
DCloud_LXH 已提交
37 38
可下载[腾讯定位插件](https://ext.dcloud.net.cn/plugin?id=14569),在插件中配置key打包后生效。

39
上述腾讯定位插件属于[ext api插件](https://uniapp.dcloud.net.cn/api/extapi.html),引用到工程后,会覆盖uni.getLocation的实现,替换掉系统定位。
D
DCloud_LXH 已提交
40 41 42 43 44 45

如需其他定位,请在插件市场搜索定位相关的uts插件。

获取手机端app是否拥有定位权限,请使用API [uni.getAppAuthorizeSetting](get-app-authorize-setting.md)

不管系统定位、还是三方sdk定位,都有很多注意事项,包括gms、坐标系、隐私和权限等,请仔细阅读下面的参考链接。
zhaofengliang920817's avatar
zhaofengliang920817 已提交
46 47 48
:::

::: warning 4.25及以上版本 uni.getLocation 支持provider机制,使用需注意:
D
DCloud_LXH 已提交
49

zhaofengliang920817's avatar
zhaofengliang920817 已提交
50
- app需要在根目录manifest.json文件中配置`uni-getLocation`节点,详见 [https://doc.dcloud.net.cn/uni-app-x/collocation/manifest-modules.html#uni-getLocation模块配置](https://doc.dcloud.net.cn/uni-app-x/collocation/manifest-modules.html#uni-getLocation)
zhaofengliang920817's avatar
zhaofengliang920817 已提交
51 52 53
:::


D
DCloud_LXH 已提交
54 55
<!-- UTSAPIJSON.getLocation.tutorial -->

D
DCloud_LXH 已提交
56
<!-- UTSAPIJSON.getLocation.example -->
D
DCloud_LXH 已提交
57 58 59 60

<!-- UTSAPIJSON.general_type.name -->

<!-- UTSAPIJSON.general_type.param -->
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
61

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
62 63 64

## 定位provider对象描述

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
65
### UniLocationSystemProvider(系统定位)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
66

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
67 68 69 70 71
| 名称           | 类型      | 必备 | 默认值 | 描述                                  |
| -------------- | --------- | ---- | ------ | ------------------------------------- |
| id             | string    | 是   | -      | 服务供应商标识                        |
| description    | string    | 是   | -      | 服务供应商描述                        |
| ~~isAppExist~~      | boolean   | 是   | -      | 已废弃,判断服务供应商依赖的App是否安装(仅支持微信支付) |
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
72

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
73
### UniLocationTencentProvider(腾讯定位)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
74

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
75 76 77 78 79
| 名称           | 类型      | 必备 | 默认值 | 描述                                  |
| -------------- | --------- | ---- | ------ | ------------------------------------- |
| id             | string    | 是   | -      | 服务供应商标识                        |
| description    | string    | 是   | -      | 服务供应商描述                        |
| ~~isAppExist~~      | boolean   | 是   | -      | 已废弃,判断服务供应商依赖的App是否安装(仅支持微信支付) |
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
80 81


WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
82
## 自定义定位provider接入到uni API @customprovider
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
83

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
84 85
背景:目前基座已经内置了系统定位,腾讯定位,基于开放的原则,在以上定位不满足用户需求的情况下,

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
86
用户可以基于我们规范化的接口,错误信息描述等实现自己的定位需求,而在最终使用方式上与内置API无任何差别。
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
87

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
88
举个例子,用户想使用uni.getLocation()的方式调用高德定位,但是内置定位api不支持,
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
89

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
90
那只需要按照下面四个步骤实现即可:
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
91 92 93 94

第一步,在interface.uts 中定义接口,继承UniLocationProvider,代码如下

```ts
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
95
export interface UniLocationAMapProvider extends UniLocationProvider{}
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
96 97 98 99 100
```

第二步,在app-android或者app-ios的index.uts中实现接口,代码如下

```ts
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
101
import { UniLocationAMapProvider } from '../interface';
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
102

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
103
export class UniLocationAMapProviderImpl implements UniLocationAMapProvider{
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
104 105


WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
106
	override id : String = 'amap'
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
107

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
108
	override description : String = "amap"
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

	override isAppExist : boolean | null = null

	override getLocation(options : GetLocationOptions) {
		//todo 具体逻辑
	}

	constructor() {
	}

}
```

第三步,在manifest.json中配置

```ts
  "app": {
    "distribute": {
      /* android打包配置 */
      "modules": {
        "uni-getLocation":{
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
130
          "amap":{}
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
131 132 133 134 135 136 137 138
        }
      }
    }
  }
```

第四步,打自定义基座

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
139 140
通过以上步骤就可以实现自定义定位provider接入到uni API 

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
141
[完整示例可参考腾讯定位插件的实现源码](https://gitcode.net/dcloud/uni-api/-/tree/alpha/uni_modules/uni-getLocation-tencent)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
142 143