<!--Created by BoQin-->

# RN高德定位SDK介绍
- 1.本库封装高德地图原生定位功能。RN-Js Android IOS中均可调用相关功能
- 2.定位可能存在失败，建议失败时，业务层优先检查是否由于权限不足导致的。
- 3.建议各位同学都能把常用的高德原生功能，很好的扩充并封装到本SDK提供给RN或原生使用。
# 安装说明

- 1.yarn add xgrn-location
- 2.react-native link xgrn-location
- 3.原生配置IOS和安卓的相关key
- 4.IOS中Info.plist添加Privacy - Location When In Use Usage Description 用于描述提示用户使用地位功能的原因
- 5.IOS工程Podfile文件，添加高德地图依赖
- 6.cd ios 然后 pod install
````angular2html
pod "AMapLocation-NO-IDFA"
pod "AMapNavi-NO-IDFA"
````

# Android部分

## 使用说明

项目依赖该库后，需要做如下额外操作：

- 注册高德开发者，配置应用信息获取对应的key
- 在manifest中添加mate和service

```xml
        <meta-data android:name="com.amap.api.v2.apikey" android:value="your key" />

        <service android:name="com.amap.api.location.APSService" />
```

### 相关接口

RN调用XGLocation.js文件，通过Promise返回。

原生直接调用XGLocation类，返回一个Observable对象，通过Subscribe获取MapLocationBean。

```java

    /**
     * 由于Android碎片化，我们无法准确获取权限，该方法暂只适应判断GPS是否打开
     * gpsPermission true：打开； false：关闭
     * appPermission true
     */
    @ReactMethod
    public void checkPermissions(final Promise promise)

    /**
     * 获取当前位置，只定位一次
     */
    @ReactMethod
    public void searchCurrentLocation(final Promise promise)

    /**
     * 跳转应用设置页，设置权限
     */
    @ReactMethod
    public void goApplicationLocationSetting()

    /**
     * 跳转系统Gps设置页
     */
    @ReactMethod
    public void goSystemLocationSetting(Promise promise)
```

### 数据格式
获取到的结果统一封装为如下格式
```json
{
    resultCode: 0, number
    resultDesc: '',string
    resultData: {  object
    errorCode: 0,                   number 错误码
    errorMsg: ''，                  string 错误描述（提示友好）
    systemErrorMsg: ''，            string 错误描述-系统自带的提示（不要暴露给用户，开发自己使用或用于异常上传使用）
    appPermission: true,            bool  应用定位权限是否开启
    gpsPermission: true,            bool  系统定位权限是否开启
    latitude: '12312312.213123',    string   经纬度
    longitude: '12312312.213123',   string
    country: '中国',                 string  国家
    province: '浙江省',              string  省份
    city: '杭州市',                  string  城市
    district: '上城区',              string 区
    number: '123号',                string 门牌号
    street: '望潮路',                string  街道名称
    POIName: 'xx',                  string 兴趣点名称
    AOIName: 'xx',                  string 所属兴趣点名称
    citycode: '12',                 string 城市编号
    adcode: '123',                  string  区号
    formattedAddress: 'xxxxxxxx',   string 格式化地址
}
```

### 结果码
resultCode与errorCode一致，大部分errorCode与高德的错误码相同，参考[错误码对照表](http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode)

部分自定义的错误码：

- -999 未知错误
- -899 GPS未开启


# IOS部分说明

[【IOS-高德地图】](http://lbs.amap.com/api/ios-sdk/guide/map-data/poi)
[【IOS-高德错误码表】](http://lbs.amap.com/api/ios-sdk/guide/map-tool/errorcode)

### 初始化，仅支持native端配置SDK-Key

- 1.初始化配置高德地图SDK-Key。
- 2.调用定位。
- 3.处理定位结果。如果出错，首先检测是否由于定位权限不足导致。

````angular2html
#import <XGLocationManager.h>

#pragma mark - 配置高德地图
+ (void)configurationMap {
  [[XGLocationManager shareManager] setAmapApiKey:@"f853ff869a0376aa8e61b39d1e36888f"];
}

````

````angular2html

//调用GPS定位
[[XGLocationManager shareManager] queryLocation:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error, PermissionStatus *permissionStatus) {
    if (error) {//定位失败。判断是否由于权限不足导致。
        BOOL gpsPermission = permissionStatus.gpsPermission;
        BOOL appPermission = permissionStatus.appPermission;
        //
        NSLog(@"%@",error);
    } else {
        //CLLocation 为标准高德定位结果Model
        NSLog(@"%@",location);
    }
  }];

````


# JavaScript使用说明

```angular2html
import XGLocation from 'xgrn-location';
```
- 1.查询权限是否开启
```angular2html
/**
 * 查询权限是否开启
 * @return {*}<Promise> {
 *  gpsPermission bool GPS权限是否开启
 *  appPermission bool app权限是否开启
 * }
 */
const {gpsPermission,appPermissio} = await XGLocation.checkPermissions();

```
- 2.查询用户当前位置信息
```angular2html
/**
 * 查询用户当前位置信息
 * @return {*}<Promise> {
 *      resultCode: 0, number
 *      resultDesc: '',string
 *      resultData: {  object
 *          errorCode: 0,                   number 错误码
 *          errorMsg: ''，                  string 错误描述（提示友好）
 *          systemErrorMsg: ''，            string 错误描述-系统自带的提示（建议不要暴露给用户、可用于开发阶段定位失败原因或用于线上异常上传使用）
 *          appPermission: true,            bool  应用定位权限是否开启
 *          gpsPermission: true,            bool  系统定位权限是否开启
 *          latitude: '12312312.213123',    string   经纬度
 *          longitude: '12312312.213123',   string
 *          country: '中国',                 string  国家
 *          province: '浙江省',              string  省份
 *          city: '杭州市',                  string  城市
 *          district: '上城区',              string 区
 *          number: '123号',                string 门牌号
 *          street: '望潮路',                string  街道名称
 *          POIName: 'xx',                  string 兴趣点名称
 *          AOIName: 'xx',                  string 所属兴趣点名称
 *          citycode: '12',                 string 城市编号
 *          adcode: '123',                  string  区号
 *          formattedAddress: 'xxxxxxxx',   string 格式化地址
 *      }
 * 
 */
const result = await XGLocation.searchCurrentLocation();

```

- 3.跳转定位权限设置页面
```angular2html
/**
 * 跳转定位权限设置页面
 * @param type String 设置类型
 * Enum-String 枚举字符串
 *  'GPS' GPS系统权限开关设置 ios暂不支持此跳转
 *  'APP' APP应用权限开关设
 */
XGLocation.goToPermissionsSetting(type);

```