get-location.md 3.0 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
## 自定义定位provider接入到uni API 
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
44

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

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

举个例子,用户想实现高德定位,但是内置定位api不支持,那您只需要按照下面的模版自己实现一套即可

以自定义高德定位为例
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
52 53 54 55

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

```ts
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
56
export interface UniLocationAMapProvider extends UniLocationProvider{}
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
57 58 59 60 61
```

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

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

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
64
export class UniLocationAMapProviderImpl implements UniLocationAMapProvider{
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
65 66


WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
67
	override id : String = 'amap'
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
68

WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
69
	override description : String = "amap"
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

	override isAppExist : boolean | null = null

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

	constructor() {
	}

}
```

第三步,在manifest.json中配置

```ts
  "app": {
    "distribute": {
      /* android打包配置 */
      "modules": {
        "uni-getLocation":{
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
91
          "amap":{}
WOSHIMAHAIFENG's avatar
WOSHIMAHAIFENG 已提交
92 93 94 95 96 97 98 99
        }
      }
    }
  }
```

第四步,打自定义基座

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