更新记录
1.0.0(2023-06-15)
新版首发
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 12.0 | armeabi-v7a:支持,arm64-v8a:支持,x86:支持 | 适用版本区间:11 - 16 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
KJ-TencentLocation
腾讯定位、定位反作弊伪定位、后台定位、单次或持续定位、场景定位
注意
1..andorid 自定义通知的图标和小图标,不设置的话,默认是插件里的默认图标
需要在 主目录->nativeplugins->KJ-Audio->android->res->drawable 下配置添加 kj_tencent_location_push_small.png(小图标) 和 kj_tencent_location_push.png(图标)
详情下载参考示例项目
小图标设计要求是特殊的, 特别需要注意以下两点:
a.必须是透明的底;
b.内部形状颜色为白色最佳; (是其他颜色也可以, 但好像最终也会转成,通知栏显示白色, 通知左上角图标灰色)
2.andorid 后台定位 不保证所有手机有效,是腾讯定位SDK提供的方法,相关方法:enableForegroundLocation()
3. ios 后台定位 需要配置 manifest.json->App常用其它设置->后台运行能力 填入“location” 然后运打包
相关方法:setLocationManagerInfo() 设置参数 allowsBackgroundLocationUpdates 为 true
4.定位反作弊伪定位
ios:setLocationManagerInfo() 设置参数 enableAntiMockLocation 为 true,然后根据定位返回的结果 fakeCode 字段判断
andorid:根据定位返回的结果 sourceProvider、fakeReason、fakeProbability 字段判断
andorid push_small小图标注意事项: https://ask.dcloud.net.cn/article/39429
使用
<template>
<view class="content">
<button type="primary" @click="setUserAgreePrivacy">设置是否同意隐私政策</button>
<button type="primary" @click="getLocationAuthorizationStatus">获取定位权限状态(ios)</button>
<button type="primary" @click="requestLocationAuthorization">请求定位权限(ios)</button>
<button type="primary" @click="init">初始化</button>
<button type="primary" @click="setLocationManagerInfo">设置定位管理信息</button>
<button type="primary" @click="getLocationManagerInfo">获取定位管理信息</button>
<view class="json">{{getLocationManagerInfo_json}}</view>
<button type="primary" @click="startDrEngine">启动DR引擎</button>
<button type="primary" @click="terminateDrEngine">停止DR引擎</button>
<button type="primary" @click="getDrPosition">传出DR计算出的实时位置</button>
<view class="json">{{getDrPosition_json}}</view>
<button type="primary" @click="requestSingleFreshLocation">单次定位</button>
<view class="json">{{requestSingleFreshLocation_json}}</view>
<button type="primary" @click="removeSingleFreshLocation">取消单次定位</button>
<button type="primary" @click="requestLocationUpdates">持续定位</button>
<view class="json">{{requestLocationUpdates_json}}</view>
<button type="primary" @click="removeUpdates">停止持续定位</button>
<button type="primary" @click="getLastKnownLocation">获取最近一次的位置(android)</button>
<view class="json">{{getLastKnownLocation_json}}</view>
<button type="primary" @click="requestLocationWithScene">场景定位(android)</button>
<view class="json">{{requestLocationWithScene_json}}</view>
<button type="primary" @click="stopLocationWithScene">停止场景定位(android)</button>
<button type="primary" @click="enableForegroundLocation">开启后台定位(android)</button>
<button type="primary" @click="disableForegroundLocation">关闭后台定位(android)</button>
<button type="primary" @click="isSupportGps">是否支持GPS定位(android)</button>
</view>
</template>
<script>
var KJTencentLocation = uni.requireNativePlugin("KJ-TencentLocation");
/**
* location json字段说明:
* location - 定位到的相关信息
* ios:
* fakeCode - 当前位置的作弊码 OK(正常) Coordinate(坐标是否被hook校验) Speed(速度合法性校验) Crc(循环冗余校验) Motion(运动状态和定位点校验)
* MotionData(传感器数据校验) MotionType(系统的运动状态和传感器识别的运动状态校验) FirstCallbackSpeed(系统首次定位回调速度校验)
* Simulation(模拟位置校验) LocationAge(系统当前时间与Location的时间校验) LocationSame(系统一直回调同一个点校验)
* drProvider - 定位结果来源 -2(错误,可能未开启dr) -1(定位结果来源未知) 0(定位结果来源融合的结果) 1(定位结果来源GPS) 2(定位结果来源网络)
* indoorLocationType - 室内定位类型,0表示普通定位结果,1表示蓝牙室内定位结果
* areaStat - 当前位置的行政区划, 0-表示中国大陆、港、澳, 1-表示其他
* horizontalAccuracy - 水平的准确度(负数无效)
* verticalAccuracy - 垂直的准确度(负数无效)
* course - 航向 、路径 取值为:0.0 ~ 359.9 真北方向表示:0.0
* speed - 移动速度, 单位为m/s (米/秒), 仅当位置来自GPS时可能有效.
*
* andorid: 过多信息:https://mapapi.qq.com/sdk/locationSDK/Android/doc/index.html
* sourceProvider - 当前位置的细分来源. fake - 作弊 wifi cell-Cell基站 network gps
* fakeReason - 获取作弊码,可以官网工单进行咨询,sourceProvider返回fake,该方法返回判断其作弊的原因
* fakeProbability - 获取作弊可能性,范围0~1
* provider - 来源
* isMockGps - 使用GPS定位时,判断该GPS位置点是否为Mock数据, 1为是,0为否,-1为无法判断,当且仅当Provider来源是GPS时有效!
* areaStat - 0-表示国内(中国大陆), 1-表示国外
* bearing - 当前位置方向, 单位为度, 仅当位置来自GPS时可能有效. 0, 如果无法得到方向
* GPSRssi - GPS信号强度,仅当provider为gps时可用
* poiList - 当前位置周围的 POI
* altitude - 海拔高度 单位为m(米), 仅当位置来自GPS时可能有效.
* speed - 移动速度, 单位为m/s (米/秒), 仅当位置来自GPS时可能有效.
* accuracy - 当前位置的精度. 通常精度为, GPS:<20米,WiFi:30-180米,基站:150-800米.
* */
export default {
data() {
return {
getLocationManagerInfo_json: null,
getDrPosition_json: null,
getLastKnownLocation_json: null,
requestSingleFreshLocation_json: null,
requestLocationUpdates_json: null,
requestLocationWithScene_json: null
}
},
onLoad() {
if (plus.os.name == 'Android') {
plus.android.requestPermissions(
['android.permission.ACCESS_COARSE_LOCATION',
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_BACKGROUND_LOCATION",
"android.permission.READ_PHONE_STATE",
"android.permission.WRITE_EXTERNAL_STORAGE",
],
function(resultObj) {
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
console.log('已获取的权限:' + grantedPermission);
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
console.log('拒绝本次申请的权限:' + deniedPresentPermission);
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
result = -1
}
},
function(error) {
console.log('申请权限错误:' + error.code + " = " + error.message);
}
);
} else {
this.requestLocationAuthorization()
}
},
methods: {
setUserAgreePrivacy() {
var dic = {
"isAgree": true
}
KJTencentLocation.setUserAgreePrivacy(dic);
},
getLocationAuthorizationStatus() {
KJTencentLocation.getLocationAuthorizationStatus((res) => {
console.log("getLocationAuthorizationStatus:" + JSON.stringify(res));
/**
* status - 权限状态 0-还没决定 1-受限制 2-拒绝 3、4、5-已授权
* */
});
},
requestLocationAuthorization() {
KJTencentLocation.requestLocationAuthorization((res) => {
console.log("requestLocationAuthorization:" + JSON.stringify(res));
/**
* status - 权限状态 0-还没决定 1-受限制 2-拒绝 3、4、5-已授权
* */
});
},
init() {
var dic = {
"apiKey": "xxx" //ios才有效,andorid的在App原生插件配置里设置
//"deviceID": "xxx", //andorid必须设置,默认使用oaid,ios无需设置
}
KJTencentLocation.init(dic);
},
setLocationManagerInfo() {
var dic = {
"coordinateType": "GCJ02", //设置坐标系 GCJ02(火星坐标,即国测局坐标) WGS84(地球坐标,注:如果是海外,无论设置的是火星坐标还是地球坐标,返回的都是地球坐标)
"requestLevel": 4, //请求等级 0(包含经纬度) 1(包含经纬度, 位置名称, 位置地址) 3(包含经纬度,位置所处的中国大陆行政区划) 4(包含经纬度,位置所处的中国大陆行政区划及周边POI列表)
/**以下andorid有效**/
"mockEnable": false, //是否允许mockGps数据 设置为true后将不对mockGps进行过滤,是否允许应用对GPS进行模拟
"systemCacheEnable": false, //是否允许在定位失败情况下返回系统缓存位置
//"deviceID":"xxx", //设备id
//"userAgreePrivacy": true, //设置用户是否同意隐私协议政策
"allowCache": true, //是否允许使用缓存
"allowDirection": true, //是否允许使用设备传感器获取方向
"allowGPS": true, //是否允许使用GPS进行定位
"gnssSource": 20, //设置优先卫星定位信号来源 改设置仅对连续定位生效,20(GPS) 21(北斗)
"gpsFirst": false, //首次定位是否等待卫星定位结果,默认为false 当设置为true时,首次定位会等待卫星定位结果,默认等待时间为30s,超时将返回网络定位结果
"gpsFirstTimeOut": 10000, //卫星定位优先时,等待卫星定位结果对的超时时间,单位: ms, 最多等待60s.
"indoorLocationMode": true, //启动室内定位
"interval": 5000, //定位周期(位置监听器回调周期), 单位为 ms (毫秒).
"locMode": 10, //定位模式 10(高精度定位模式,将同时使用网络定位和卫星定位,优先返回精度高的定位) 11(仅网络定位模式,将不启动gps定位,只使用网络定位,可以减少耗电量,但定位精度有所降低) 12(仅GPS定位模式)
// "phoneNumber": "111",
// "qq": "xxx",
// "smallAppKey": "xxx", //设置分渠道的key编码号,例如小程序里面区分业务.
/**以下ios有效**/
"distanceFilter": 0, //设置定位的最小更新距离
"desiredAccuracy": "best", //设置定位精度 bestForNavigation best nearestTenMeters hundredMeters kilometer threeKilometers
"pausesLocationUpdatesAutomatically": false, //定设置位是否会被系统自动暂停
"allowsBackgroundLocationUpdates": true, //设置是否允许后台定位 为true 需要配置manifest.json->App常用其它设置->后台运行能力 location
"activityType": 1, //设置用户的活动类型 1(未知的出行活动类型) 2(位置管理器专门为出行活动为汽车的时候导航) 3(位置管理器专门为步行、跑步、骑自行车等健身时,提供导航) 4(位置管理器专门为其他类型的大型交通工具导航,而不是汽车导航)
//"headingFilter": 10, //设置当朝向改变时,每隔多少度调用一次
"headingOrientation": 0, //设置设备当前的朝向 0(未知) 1(竖屏) 2(竖屏正方向,颠倒) 3(屏左方向,主按钮在右侧) 4(横屏右方向,主按钮在左侧) 5(设备正面朝上) 6(设备正面朝下)
"poiUpdateInterval": 10, //指定POI的更新间隔 单位秒
"enableAntiMockLocation": true //是否允许开启反作弊检查
}
KJTencentLocation.setLocationManagerInfo(dic);
},
getLocationManagerInfo() {
KJTencentLocation.getLocationManagerInfo((res) => {
console.log("getLocationManagerInfo:" + JSON.stringify(res));
this.getLocationManagerInfo_json = JSON.stringify(res);
/**
* 返回json字段说明:
* andorid:{"oaid":"df08a06a100674e3","userAgreePrivacy":true,"version":"7.5.2.official_1",
* "isDrSupport":true,"coordinateType":"GCJ02","build":"230511"}
*
* ios:{"coordinateType":"GCJ02","isDrSupport":false,"userAgreePrivacy":false,"accuracyAuthorization":0,"version":"4.1.1"}
*
* */
});
},
startDrEngine() {
var dic = {
"type": "Bike" //Bike(骑行) Walk(步行)
}
KJTencentLocation.startDrEngine(dic, (res) => {
console.log("startDrEngine:" + JSON.stringify(res));
/**
* code - 0(成功) -1(传感器有缺失或没有GPS芯片) -2(已经启动) -3(传感器启动失败) -4(GPS启动失败) -5(没有位置权限) -6(未设置用或未同意隐私) -7(lib加载失败)
* */
});
},
getDrPosition() {
KJTencentLocation.getDrPosition((res) => {
console.log("getDrPosition:" + JSON.stringify(res));
this.getDrPosition_json = JSON.stringify(res);
});
},
terminateDrEngine() {
KJTencentLocation.terminateDrEngine();
},
getLastKnownLocation() {
KJTencentLocation.getLastKnownLocation((res) => {
console.log("getLastKnownLocation:" + JSON.stringify(res));
this.getLastKnownLocation_json = JSON.stringify(res);
});
},
requestSingleFreshLocation() {
KJTencentLocation.requestSingleFreshLocation((res) => {
this.requestSingleFreshLocation_json = JSON.stringify(res);
console.log("requestSingleFreshLocation:" + JSON.stringify(res));
});
},
removeSingleFreshLocation() {
KJTencentLocation.removeSingleFreshLocation();
},
requestLocationUpdates() {
KJTencentLocation.requestLocationUpdates((res) => {
console.log("requestLocationUpdates:" + JSON.stringify(res));
this.requestLocationUpdates_json = JSON.stringify(res);
});
},
removeUpdates() {
KJTencentLocation.removeUpdates();
},
requestLocationWithScene() {
/**
* Scenario - 目标场景 10(签到场景,单次定位,第一次会优先返回精度较高的结果,定位速度可能会延迟1~3S)
* 11(运动场景,高精度连续定位,适用于步行或骑行定位,第一次会优先返回精度较高的结果,定位可能会延迟3~5s)
* 12(出行场景,高精度连续定位,适用于室外出行场景,优先使用卫星定位结果,卫星定位成功之后网络定位不再返回,卫星信号断开之后一段时间才会返回网络结果,超时时间为8s)
* */
var dic = {
"Scenario": 11
}
KJTencentLocation.requestLocationWithScene(dic, (res) => {
console.log("requestLocationWithScene:" + JSON.stringify(res));
this.requestLocationWithScene_json = JSON.stringify(res);
});
},
stopLocationWithScene() {
var dic = {
"Scenario": 11
}
KJTencentLocation.stopLocationWithScene(dic);
},
enableForegroundLocation() {
var dic = {
"notificationID": 1,
"contentTitle": "KJ-TencentLocation",
"contentText": "正在后台运行"
}
KJTencentLocation.enableForegroundLocation(dic);
},
disableForegroundLocation() {
var dic = {
"isRemoveNotification": true
}
KJTencentLocation.disableForegroundLocation(dic);
},
isSupportGps() {
KJTencentLocation.isSupportGps(dic, (res) => {
console.log("isSupportGps:" + JSON.stringify(res));
});
}
}
}
</script>
<style>
.json {
word-wrap: break-word;
}
</style>