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

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

W
wanganxp 已提交
5 6 7 8
::: warning 注意
Web平台本API调用了腾讯地图的gcj02坐标转换接口,该接口从2024年7月18日起开始陆续下线。[详见](https://ask.dcloud.net.cn/question/195113)
:::

D
DCloud_LXH 已提交
9 10
<!-- UTSAPIJSON.getLocation.compatibility -->

D
DCloud_LXH 已提交
11 12 13 14 15 16
<!-- UTSAPIJSON.getLocation.param -->

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

### 注意

W
wanganxp 已提交
17
uni-app x的App标准基座定位仅支持wgs84坐标系、不支持逆地址解析、且某些老型号国产Android机因gms问题不支持系统定位、国产Rom可能不支持高度信息。
D
DCloud_LXH 已提交
18 19 20 21 22 23 24 25 26

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

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

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

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

27
上述腾讯定位插件属于[ext api插件](https://uniapp.dcloud.net.cn/api/extapi.html),引用到工程后,会覆盖uni.getLocation的实现,替换掉系统定位。
D
DCloud_LXH 已提交
28 29 30 31 32 33 34 35 36

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

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

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

<!-- UTSAPIJSON.getLocation.tutorial -->

D
DCloud_LXH 已提交
37
<!-- UTSAPIJSON.getLocation.example -->
D
DCloud_LXH 已提交
38 39 40 41

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

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
43 44 45

## 定位provider对象描述

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
46
### UniLocationSystemProvider(系统定位)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
47

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
54
### UniLocationTencentProvider(腾讯定位)
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
55

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


WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
63
## 自定义定位provider接入到uni API 
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
64

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

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
69
举个例子,用户想实现高德定位,但是内置定位api不支持,那您只需要按照下面的模版自己实现一套即可。
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
70 71

以自定义高德定位为例
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
72 73 74 75

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

```ts
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
76
export interface UniLocationAMapProvider extends UniLocationProvider{}
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
77 78 79 80 81
```

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

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
84
export class UniLocationAMapProviderImpl implements UniLocationAMapProvider{
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
85 86


WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
87
	override id : String = 'amap'
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
88

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
89
	override description : String = "amap"
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

	override isAppExist : boolean | null = null

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

	constructor() {
	}

}
```

第三步,在manifest.json中配置

```ts
  "app": {
    "distribute": {
      /* android打包配置 */
      "modules": {
        "uni-getLocation":{
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
111
          "amap":{}
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
112 113 114 115 116 117 118 119
        }
      }
    }
  }
```

第四步,打自定义基座

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