注意:应工信部要求,自本原生插件1.2.0版本起首次调用本原生插件前必须先弹出隐私协议,详情参考SDK合规使用方案。之后需先调用 updateLocationPrivacy,否则定位接口都无效。
随着移动互联网飞速发展,人与手机成为了形影不离的好伙伴,围绕位置提供服务成为可能。LBS(location based service)应运而生,成为了各类APP的标配。
而定位则是实现一切LBS的基础——因为只有获取到用户的位置,才能围绕位置,为用户提供各类服务。
大家应该都有类似的经历,第一次打开一个APP,会弹出对话框,寻问是否可以使用您当前的位置。这就是我们通常说的定位功能。
定位能做什么?
1、获取用户实时位置信息,以便为其提供“附近”优质服务;
2、获取用户实时位置信息,设置地理围栏,实现信息的精准推送;
3、获得用户分布情况,通过位置大数据分析,实现高效的资源配置。
4、实时监测工作人员(专车、货运、快递、外卖等)的位置及运动轨迹,实现运力及人力的高效调度。
什么场景会用到定位?
移动互联时代,定位无处不在,任何一个应用,只要想知晓用户位置,就一定会用到定位(不管是为用户提供服务,还是用于用户分析)。 高德定位深植于各类APP中,出行、社交、O2O、P2P、旅游、新闻、天气……
1、定位可以配合地图一起使用
适用于需要定位用户当前位置,及周边人车、商户位置,并将其展示在地图上的应用,典型案例:美团、神州专车
2、定位也可以独立使用
适用于只需定位用户位置,或计算两个或多个位置间距离,无需在地图上展示的应用,典型案例:陌陌、58到家
定位的实现原理
据专家透露:同时打开手机自身的GPS定位,并开启WiFi开关(无需连接到WiFi),可以很好的提高定位精度。
小课堂:科普定位原理
为什么这样就可以提高定位精度?来,我们先来弄明白定位的原理吧!
目前,主流的手机定位方式大致分为三类:
1、GPS定位:通过手机中的GPS原生插件获取位置
2、基站定位:通过运营商的电信基站(2g、3g、4g等)进行定位
3、混合定位(也有叫wifi定位):GPS+基站+wifi的混合定位方式
混合定位最为精确,高德采用的就是混合定位的方式。
我的APP如何实现定位功能呢?
定位对于APP,既然这么厉害且必须,那怎么才能在自己的APP中实现定位功能呢?
我们的 Yonbuilder移动开发平台已经将高德定位的 SDK 封装成了原生插件,开发者只需按照下述文档中所说的操作,简单几行代码即可实现负责的定位功能。
aMapLBS 封装了高德定位的 SDK。高德定位 SDK 是为移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供最好的综合定位服务,通过使用高德定位 SDK,开发者可以轻松为应用程序实现智能、精准、高效的定位功能。
使用插件前,请先注册高德开放平台账号。
申请 API Key
用户在使用本原生插件之前需要获取高德地图API Key,Key 申请的具体流程请参照 申请Key。本原生插件需要的 key 可以和 aMap、aMapLocation 、aMapNavigation 、aMapReportLocation 原生插件的 key 共用。
配置 config 文件
申请到 高德地图 API Key 后,需要配置在 config.xml 文件内。配置方法如下:
<feature name="aMapLBS">
<param name="android_api_key" value="f7Is0dWLom2q6rV3ZfFPZ1aa" />
<param name="ios_api_key" value="dd5343be258aa304698e42cd0fc761cd" />
</feature>
字段描述:
android_api_key:在高德地图开放平台申请的 android 版 ak
ios_api_key:在高德地图开放平台申请的 iOS 版 ak
注意:
在 iOS 平台上,若要支持后台定位需配置 config.xml 文件的 location 字段。
从1.1.4版本起,iOS 端 SDK 更新为高德最新版本SDK,最新版本的SDK包含 IDFA 相关功能。所以 iOS 端提交 AppStore 时必须认真阅读 提交AppStore必读,以及如何解决因获取 IDFA 被 AppStore 拒绝的问题?
设置定位类隐私权限
updateLocationPrivacy({params})
privacyAgree:
privacyShow:
containStatus:
var aMap = api.require('aMapLBS');
aMap.updateLocationPrivacy({
privacyAgree:'didAgree',
privacyShow:'didShow',
containStatus:'didContain'
});
iOS系统,Android系统
可提供的1.2.0及更高版本
配置定位信息
configManager({params}, callback(ret))
accuracy:
filter:
ret:
{
status:true //布尔类型;操作成功状态值
}
var aMapLBS = api.require('aMapLBS');
aMapLBS.configManager({
accuracy: 'hundredMeters',
filter: 1
}, function(ret, err) {
if (ret.status) {
alert('定位管理器初始化成功!');
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
单次地理定位,可以通过 stopUpdatingLocation 方法去取消正在进行的单次定位请求。如果当前正在连续定位,调用此方法将会失败
singleLocation({params}, callback(ret, err))
timeout:
ret:
{
status:true, //布尔类型;操作成功状态值
lon:116.213, //数字类型;定位到的经度
lat:39.213, //数字类型;定位到的纬度
accuracy: 65, //数字类型;本次定位的精度,仅支持 iOS 平台
time:'', //字符串类型;本次定位时间,格式为:yyyy-MM-dd HH:mm:ss
speed:'',
bearing:'',
altitude: 200 //数字类型;当前设备所处的海拔信息
}
var aMapLBS = api.require('aMapLBS');
aMapLBS.singleLocation({
timeout: 10
}, function(ret, err) {
if (ret.status) {
api.alert({
msg: JSON.stringify(ret)
})
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
单次逆地理定位,可以通过 stopUpdatingLocation 方法去取消正在进行的单次定位请求。如果当前正在连续定位,调用此方法将会失败
singleAddress({params}, callback(ret))
timeout:
ret:
{
status:true, //布尔类型;操作成功状态值
address: {
formattedAddress: '', //字符串类型;格式化地址
country: '', //字符串类型;国家
province: '', //字符串类型;省/直辖市
city: '', //字符串类型;市
district: '', //字符串类型;区
township: '', //字符串类型;乡镇(android不支持),已废弃,建议用aMap原生插件的getNameFromCoords接口获取
neighborhood: '', //字符串类型;社区(android不支持),已废弃,建议用aMap原生插件的getNameFromCoords接口获取
building: '', //字符串类型;建筑(android不支持),已废弃,建议用aMap原生插件的getNameFromCoords接口获取
citycode: '', //字符串类型;城市编码
adcode: '', //字符串类型;区域编码
street: '', //字符串类型;街道名称
number: '', //字符串类型;门牌号
POIName: '', //字符串类型;兴趣点名称
AOIName: '', //字符串类型;所属兴趣点名称
speed:'',
bearing:''
}
}
var aMapLBS = api.require('aMapLBS');
aMapLBS.singleAddress({
timeout: 10
}, function(ret, err) {
if (ret.status) {
api.alert({
msg: JSON.stringify(ret)
})
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
开始连续定位,可以通过 stopUpdatingLocation 方法去取消。调用此方法会cancel掉所有的单次定位请求
startLocation(callback(ret))
ret:
{
status:true, //布尔类型;操作成功状态值
lon:116.213, //数字类型;经度
lat:39.213, //数字类型;纬度
accuracy: 65, //数字类型;本次定位的精度,仅支持 iOS 平台
time:'', //字符串类型;本次定位时间,格式为:yyyy-MM-dd HH:mm:ss
speed:'',
bearing:''
altitude: 200 //数字类型;当前设备所处的海拔信息
}
var aMapLBS = api.require('aMapLBS');
aMapLBS.startLocation(function(ret, err) {
if (ret.status) {
api.alert({
msg: JSON.stringify(ret)
})
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
停止连续定位,调用此方法会cancel掉所有的单次定位请求,可以用来取消单次定位
stopUpdatingLocation()
var aMapLBS = api.require('aMapLBS');
aMapLBS.stopUpdatingLocation();
iOS系统,Android系统
可提供的1.0.0及更高版本
当前后台定位权限是否开启
hasPermission(callback(ret))
ret:
{
status:true, //布尔类型;后台定位权限是否已经开启
}
var aMapLBS = api.require('aMapLBS');
aMapLBS.hasPermission(function(ret){
alert(JSON.stringify(ret));
});
Android系统
可提供的1.2.5及更高版本
Android10及以上设备调用此接口申请后台定位权限。注意:调用该接口前应用必须已经开启访问位置信息的权限,否则调用没有反应。
requestPermission()
var aMapLBS = api.require('aMapLBS');
aMapLBS.requestPermission();
Android系统
可提供的1.2.5及更高版本