更新记录

1.0.0(2023-06-15)

新版首发


平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 12.0 armeabi-v7a:支持,arm64-v8a:支持,x86:支持 适用版本区间:11 - 16

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
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>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

ios权限:"NSLocationWhenInUseUsageDescription": "运行期访问位置","NSLocationAlwaysUsageDescription": "后台运行访问位置","NSLocationAlwaysAndWhenInUseUsageDescription": "访问位置" andorid权限:<!-- 通过GPS得到精确位置 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 通过网络得到粗略位置 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 访问网络,某些位置信息需要从网络服务器获取 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 访问WiFi状态,需要WiFi信息用于网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 修改WiFi状态,发起WiFi扫描, 需要WiFi信息用于网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 访问网络状态, 检测网络的可用性,需要网络运营商相关信息用于网络定位 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 访问网络的变化, 需要某些信息用于网络定位 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <!-- 蓝牙扫描权限 --> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <!-- 前台service权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <!-- 后台定位权限 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/> <!-- A-GPS辅助定位权限,方便GPS快速准确定位 --> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件使用的 腾讯定位 SDK会采集数据,详情可参考:https://lbs.qq.com/location/

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问