更新记录

1.0.1(2025-10-25)

  • 更新文档

1.0.0(2025-10-25)

  • 新版发布

平台兼容性

uni-app(4.71)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × 5.0 12
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × ×

uni-app x(4.71)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 12 ×

yt-native-location

开发文档

插件是对原生(iOS、Android、HarmonyOS)定位的封装,主要功能单次定位、连续定位、保活定位。App退到后台可持续定位不被系统挂起和回收,达到保活效果。插件默认返回WGS_84坐标,支持坐标转换功能。

特别提醒

  • 购买本插件前,请先试用、请先试用、请先试用,并充分自测确认满足需求之后再行购买。购买之后无法退款;
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 结合文档和示例代码集成使用;
  • 遇到使用问题进交流群询问;
  • 试用必须先打基座、试用必须先打基座、试用必须先打基座重要事情说三遍(ios/android);

插件功能介绍 (支持uni-app/uni-app-x)

  1. 定位、连续定位、后台定位、保活定位
  2. 保活定位
  3. 坐标转换

Android后台采集或保活设置

  1. 通知管理允许通知,允许自启动;

  2. 耗电保护允许后台运行;

  3. 电池设置中关闭智能耗电保护、省电模式、应用速冻等。

注意事项:

  1. 本插件使用需要打自定义基座调试、试用。
  2. Android手机型号太多,各品牌对手机的限制不尽相同,需要保活而进行的设置也不一样。随着Android系统的更新迭代,保活的难度也在不断加大。最有效的保活方式还是联系厂家添加白名单以实现进程保活。
  3. 定位返回WGS84坐标,如需要其他坐标系,可使用插件内置的坐标转换方法。
  4. android修改通知栏的图标只需替换uni_modules/yt-native-location/utssdk/app-android/res/drawable/logo.png图标,替换的图标名称不能修改必须是logo.png,替换完需要重新打基座/包才能生效

特别注意HarmonyOS后台定位需配置后台功能。配置步骤如下:

  1. 点击运行->运行到手机/模拟器->运行到鸿蒙
  2. 运行成功会在项目根目录下生成unpackage文件夹,找到unpackage/dist/dev/app-harmony/entry,将该文件夹复制到项目根目录下的harmony-configs文件夹下
  3. 在harmony-configs/entry/src/main/module.json5文件中增加设置如一下代码
  4. 不明白可以进交流群询问作者。

更多好用插件

集成文档

import * as Location from "@/uni_modules/yt-native-location"

接口说明

  • 基础配置 configureBasicConfiguration 在定位前调用
Location.configureBasicConfiguration({
  onceLocationTimeout: 5000, //单次定位超时时间
  locationInterval: 4000, //连续定位、保活定位间隔
  notificationTitle: "App后台定位中",//Android 通知标题
  notificationContentText: "后台定位" //Android通知内容
})
参数 参数类型 参数说明 是否必传
onceLocationTimeout number 单次定位超时时间,默认5000单位毫秒
locationInterval number 连续定位、保活定位间隔默认10000单位毫秒
notificationTitle string Android 通知标题,默认“适配android 8限制后台定位功能“
notificationContentText string Android通知内容,默认“正在后台定位”

特别注意: HarmonyOS连续定位间隔Gnss与网络定位不同,默认值在GNSS定位时为1秒,网络定位时为20秒。 当设置值小于最小间隔时,以最小时间间隔生效。例:在室内由于GPS信号弱或没有,这时会使用网络定位,网络定位的时间间隔最小为20秒,当设置的locationInterval小于20时,连接定位的间隔会去最小值20.

  • 单次定位
Location.onceLocation({
        locationResultBackcall: (res) => {
            if (res.code == 200) {
                uni.showToast({
                    icon: 'none',
                    title: `定位成功--精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                })
            } else {
                uni.showToast({
                    icon: "none",
                    title: `${res.mes}`
                })
            }
        }
});

单次定位OnceLocationOptions参数说明:

参数 参数类型 参数说明 是否必传
locationResultBackcall function 单次定位回调(回调信息LocationInfoResult)

LocationInfoResult 说明:

数据 数据类型 数据说明
code number 定位状态码,200成功
mes string 定位描述
location LocationInfo 定位成功信息,定位成功才有此值,详情见下表

LocationInfo 说明:

数据 数据类型 数据说明
latitude number 纬度
longitude number 经度
latitude number 纬度
altitude number 高度
sourceType number 定位类型 1:gnss 2:NETWORK 3:INDOOR 4:RTK 仅HarmonyOS有效
  • 连续定位
Location.startUpdatingLocation({
                    enableBackgroundLocation: false,//是否后台定位,iOS端enableBackgroundLocation=true表示保活定位,Android保活定位需调用保活接口(keepLiveLocation)
                    locationResultBackcall: (res) => {
                        if (res.code == 200) {
                            uni.showToast({
                                icon: 'none',
                                title: `定位次数:${this.locationCount}精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        } else {
                            uni.showToast({
                                icon: "none",
                                title: `${res.mes}`
                            })
                        }
                    }
                })

UpdatingLocationOptions 参数说明:

参数 参数类型 参数说明 是否必传
enableBackgroundLocation bool 是否后台定位,iOS/HarmonyOS设置为true就相当于保活定位
locationResultBackcall function 连续定位回调(回调信息LocationInfoResult数据结构同单次定位回调结构详情见上表)
  • 停止连续定位
Location.stopUpdatingLocation()
  • 保活定位 保活定位参数同连续定位(保活定位的enableBackgroundLocation默认是true且不可修改)
Location.keepLiveLocation({
                    locationResultBackcall: (res) => {
                        if (res.code == 200) {
                            uni.showToast({
                                icon: 'none',
                                title: `定位次数:${this.locationCount}精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        } else {
                            uni.showToast({
                                icon: "none",
                                title: `${res.mes}`
                            })
                        }
                    }
                })
  • 关闭保活
Location.offKeepLiveLocation()

坐标系转换

插件返回的是WGS_84坐标,需要转换其他坐标,可使用插件内的转换函数。

    gcj02ToWgs84() {
        let result = Location.gcj02ToWgs84(30.34524, 120.154624);
        console.log(result)
    },
    bd09ToWgs84() {
        let result = Location.bd09ToWgs84(30.34524, 120.154624);
        console.log(result)
    },
    bd09ToGcj02() {
        let result = Location.bd09ToGcj02(30.34524, 120.154624);
        console.log(result)
    },
    gcj02ToBd09() {
        let result = Location.gcj02ToBd09(30.34524, 120.154624);
        console.log(result)
    },
    wgs84_gcj02() {
        let result = Location.wgs84_gcj02(30.34524, 120.154624);
        console.log(result)
    },
    wgs84ToBd09() {
        let result = Location.wgs84ToBd09(30.34524, 120.154624);
        console.log(result)
    }

uniapp 示例代码

<template>
    <view class="content">
        <view class="header">
            <view class="btn" @click="onceLocationAction()">单次定位</view>
            <view class="btn" @click="startUpdatingLocationAction()">连续定位</view>
            <view class="btn" @click="keepAliveAction()">保活定位</view>
        </view>
        <view class="header">
            <view class="btn" @click="stopUpdatingLocationAction()">停止连续定位</view>
            <view class="btn" @click="nonKeepAliveAction()">停止保活</view>
        </view>
    </view>
</template>

<script>
    import * as Location from "@/uni_modules/yt-native-location"
    export default {
        data() {
            return {
                locationCount: 0
            }
        },
        onLoad() {
            Location.configureBasicConfiguration({
                onceLocationTimeout: 5000,//单次定位超时时间,可选参数仅Android有效
                locationInterval: 4000,//连续定位、保活定位间隔 可选参数默认10秒
                notificationTitle: "App后台定位中",//保活前台通知栏 标题、仅Android有效
                notificationContentText: "正在后台定位"//保活前台通知栏 内容、仅Android有效
            })
        },
        methods: {
            onceLocationAction() {
                Location.onceLocation({
                    locationResultBackcall: (res) => {
                        if (res.code == 200) {
                            this.locationCount++;
                            uni.showToast({
                                icon: 'none',
                                title: `定位成功--精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        } else {
                            uni.showToast({
                                icon: "none",
                                title: res.mes
                            })
                        }
                    }
                });
            },
            //连续定位
            startUpdatingLocationAction() {
                Location.startUpdatingLocation({
                    enableBackgroundLocation: false,
                    locationResultBackcall: (res) => {
                        if (res.code == 200) {
                            this.locationCount++;
                            uni.showToast({
                                icon: 'none',
                                title: `定位次数:${this.locationCount}精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        } else {
                            uni.showToast({
                                icon: "none",
                                title: res.mes
                            })
                        }
                    }
                })
            },
            //停止连续定位
            stopUpdatingLocationAction() {
                this.locationCount = 0
                Location.stopUpdatingLocation()
            },
            //保活
            keepAliveAction() {
                Location.keepLiveLocation({
                    locationResultBackcall: (res) => {
                        console.log('1111111111111')
                        if (res.code == 200) {
                            this.locationCount++;
                            uni.showToast({
                                icon: 'none',
                                title: `定位次数:${this.locationCount}精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        } else {
                            uni.showToast({
                                icon: "none",
                                title: res.mes
                            })
                        }
                    }
                })
            },
            //停止保活
            nonKeepAliveAction() {
                this.locationCount = 0
                Location.offKeepLiveLocation()
            }

        }

    }
</script>

<style>
    .content {
        width: 750rpx;
        display: flex;
        height: 100%;
        flex-direction: column;
    }

    .header {
        width: 750rpx;
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        padding: 0 10rpx;
        margin-top: 40rpx;
        box-sizing: border-box;
    }

    .btn {
        display: flex;
        height: 80rpx;
        flex: 1;
        align-items: center;
        justify-content: center;
        background-color: cadetblue;
        color: white;
        margin-right: 10rpx;
        font-size: 28rpx;
    }
</style>    

uni-app-x示例代码

<template>
    <view class="content">
        <view class="header">
            <view class="btn" @click="onceLocationAction()">单次定位</view>
            <view class="btn" @click="startUpdatingLocationAction()">连续定位</view>
            <view class="btn" @click="keepAliveAction()">保活定位</view>
        </view>
        <view class="header">
            <view class="btn" @click="stopUpdatingLocationAction()">停止连续定位</view>
            <view class="btn" @click="nonKeepAliveAction()">停止保活</view>
        </view>
    </view>
</template>

<script>
    import * as Location from "@/uni_modules/yt-native-location"
    export default {
        data() {
            return {
                locationCount: 0
            }
        },
        onLoad() {
            Location.configureBasicConfiguration({
                onceLocationTimeout: 5000,//单次定位超时时间,
                locationInterval: 4000,//连续定位、保活定位间隔 可选参数默认10秒
                notificationTitle: "App后台定位中",//保活前台通知栏 标题、仅Android有效
                notificationContentText: "正在后台定位"//保活前台通知栏 内容、仅Android有效
            })
        },
        methods: {
            onceLocationAction() {
                Location.onceLocation({
                    locationResultBackcall: (res) => {
                        if (res.code == 200) {
                            this.locationCount++;
                            uni.showToast({
                                icon: 'none',
                                title: `定位成功:${this.locationCount}---精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        } else {
                            uni.showToast({
                                icon: "none",
                                title: `${res.mes}`
                            })
                        }
                    }
                });
            },
            //连续定位
            startUpdatingLocationAction() {
                Location.startUpdatingLocation({
                    enableBackgroundLocation: false,
                    locationResultBackcall: (res) => {
                        if (res.code == 200) {
                            this.locationCount++;
                            uni.showToast({
                                icon: 'none',
                                title: `定位次数:${this.locationCount}---精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        }
                    }
                } as Location.UpdatingLocationOptions)
            },
            //停止连续定位
            stopUpdatingLocationAction() {
                this.locationCount = 0
                Location.stopUpdatingLocation()
            },
            //保活
            keepAliveAction() {
                Location.keepLiveLocation({
                    locationResultBackcall: (res) => {
                        console.log('1111111111111')
                        if (res.code == 200) {
                            this.locationCount++;
                            uni.showToast({
                                icon: 'none',
                                title: `定位次数:${this.locationCount}---精度:${res.location?.longitude}----纬度:${res.location?.latitude}`
                            })
                        }
                    }
                })
            },
            //停止保活
            nonKeepAliveAction() {
                this.locationCount = 0
                Location.offKeepLiveLocation()
            }

        }

    }
</script>

<style>
    .content {
        width: 750rpx;
        display: flex;
        height: 100%;
        flex-direction: column;
    }

    .header {
        width: 750rpx;
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        padding: 0 10rpx;
        margin-top: 40rpx;
        box-sizing: border-box;
    }

    .btn {
        display: flex;
        height: 80rpx;
        flex: 1;
        align-items: center;
        justify-content: center;
        background-color: cadetblue;
        color: white;
        margin-right: 10rpx;
        font-size: 28rpx;
    }
</style>

隐私、权限声明

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

iOS:NSLocationAlwaysAndWhenInUseUsageDescription 、NSLocationWhenInUseUsageDescription、NSLocationAlwaysUsageDescription Android: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />

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

插件不采集任何数据

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