更新记录

1.0.1(2023-03-25)

1、解决同一个手机无法安装两个使用本插件的应用。 2、添加定位回调信息

1.0.0(2021-12-13)

1、超强保活功能,电源和自启动配置好的话可以永久保活。 2、给前端提供定时任务。 3、提供通知栏消息监听功能。 4、提供通知栏消息上传到业务后台。 5、提供根据通知内容配置通知声音 6、提供相关配置调用接口。 7、提供位置获取功能,能够后台获取当前高德定位信息。 8、提供定时上传定位信息到业务后台。 9、提供定位权限查询和获取接口


平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 11.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 ×

原生插件通用使用流程:

  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原生插件配置”->”云端插件“列表中删除该插件重新选择


插件主要功能

  • 该Android保活组件集成了无声音乐(已优化功耗),前台服务、双进程守护、像素保活,jobs五种保活方式,只要用户不主动杀死程序基本可以保证不会死。
  • 如果配置了自启动、电池管理等,即使用户主动关闭前端应用,后台进程也能够保持持续运行。
  • 插件集成了位置监听功能,定位信息可以自动上报后台。
  • 插件集成了通知监听功能,通知可以自动上报后台,也可以反馈前端,也可配置语音播报。

插件应用场景

  • 应用需要尽量保持不被系统杀死。
  • 需要持续在后台上传定位信息。
  • 应用需要随时监听推送消息。
  • 关闭应用插件服务可以自动起来,达到插件服务不死。

插件应用行业

  • 服务行业,服务端需要持续监听新订单。
  • 电商行业,商家需要持续监听订单信息。
  • 外卖行业,商家需要监听新订单等信息,骑手需要随时监听新订单以及上报当前位置。
  • 其他行业,比如需要实现个人免签支付用于监听微信支付宝通知等。 等等。。。

保活配置核心

由于Androiid手机型号和品牌多样,保活配置难度也是较大,不同型号不同品牌配置参数有较大差异,不过关键的几个点理解了基本上就并不会有啥问题。如下:

  • 配置自启动,应用被杀掉以后要能够自动起来,这个配置是关键。
  • 配置允许后台运行,不同手机操作不一致,如设置白名单、修改省电策略等等。目的是让应用能够尽量长久的在后台运行。 以上两个如果配置正确了,基本上能保证不被杀死,甚至关闭应用以后服务还能自动起来继续运行!

插件使用说明

  • 需要先引入原生插件到uniapp项目 详细步骤访问链接地址
  • https://ask.dcloud.net.cn/article/36106

特别说明

  • 目前高德地图key的配置放在导入插件包时进行配置,如果不需要使用定位功能,则任意输入参数即可
  • App模块配置中,Geolocation或者Map至少需要开启配置一项,否则插件无法进行定位的。

1. 引入组件

首先参考上面的方法引入在线原生插件到项目中,然后再进行以下操作:

var KeepAliveModule = uni.requireNativePlugin("yh-nl")//保活组件
const modal = uni.requireNativePlugin('modal');//弹toast需要
var globalEvent = uni.requireNativePlugin('globalEvent');//监听回调需要

2. 监听事件

监听定时任务回调。

 globalEvent.addEventListener('myEvent', function(e) {
        console.log('myEvent' + JSON.stringify(e));
        modal.toast({
        message: "myEvent收到:" + JSON.stringify(e),
        duration: 1.5
       });
   });

监听通知回调。

 globalEvent.addEventListener('notify', function(e) {
        console.log('notify' + JSON.stringify(e));
        modal.toast({
        message: "notify:" + JSON.stringify(e),
        duration: 1.5
       });
   });

3. 开始保活

参数说明

参数 默认值 说明
showNotification false 是否显示状态栏通知
notificationTitle 应用名称 通知标题
notificationText 通知内容
runModel 0 0-省点模式,省电一些,但保活效果会差一点;1-流氓模式,相对耗电,但可造就不死之身
intervalTime 5000 定时任务时间间隔,单位:毫秒

使用示例

startKeepAlive() {
    KeepAliveModule.startKeepAlive({
        showNotification:true,
        notificationTitle:"保活应用",
        notificationText:"后台运行中",
        runModel:1,//0-省电模式,1-流氓模式
        intervalTime:5000,
    },res=>{
        modal.toast({
            message: ret,
            duration: 1.5
        });
    })
}

4. 停止保活

stopKeepAlive() {
    var ret = KeepAliveModule.stopKeepAlive({})
    modal.toast({
        message: ret,
        duration: 1.5
    });
},

5. 开始位置监听

参数说明

参数 默认 说明
intervalTime 2000 定时间隔时间
gaodeApiKey 高德地图Key
locationMode 1 定位模式 1:高精度 2:仅网络(低功耗)3:仅设备
purpose 0 定位场景 0:无、1:签到、2:出行、3:运动
ifUpload false 是否上报服务器
uploadUrl 上报接口,post上传接口,默认上传主要定位数据,如http://xx/api/xxx
params 其他参数,如"{'lat':'1','lng':'3'}"
headers Http的header参数

定位信息默认上传参数

参数 类型 说明
longitude double 经度
latitude double 纬度
accuracy float 精度
address String 地址
speed float 速度
county String 国家
province String 省
city String 城市
district String 城区
street String 街道
streetNum String 街道门牌号
cityCode String 城市编码
adCode String 区域编码

使用示例

 startLocation() {
    KeepAliveModule.startLocation({
        intervalTime: 5000,//定位间隔时间
        gaodeApiKey: "0eef1axxxxxx7964",//高德地图Key,已停用,引入插件配置
        locationMode: 1,//定位模式
        purpose: 0,//定位场景
        ifUpload: true,//是否上报服务器
        uploadUrl: "http://xx:8080/api/reportLocation",//上报接口
        params: "{'lat':'1','lng':'3'}",//其他参数
        headers: "{'authorization1':'Bearer xOHeJhg'}",
    }, function(res) {
        console.log("启用结果:", res);
    });
}

6. 停止监听

stopLocation() {
    let ret = KeepAliveModule.stopLocation();
    modal.toast({
        message: "停止定位服务",
        duration: 1.5
    });
}

7. 获取当前位置

getCurrentLocation() {
    let ret = KeepAliveModule.getCurrentLocation();
    modal.toast({
        message: ret,
        duration: 1.5
    });
}

8. 电池白名单

inBatteryWhiteList() {
    KeepAliveModule.inBatteryWhiteList((ret) => {
        modal.toast({
            message: ret,
            duration: 1.5
        });
    })
}

9. 跳转电池设置

jumpBatterySetting() {
    var ret = KeepAliveModule.jumpBatterySetting({})
    modal.toast({
        message: ret,
        duration: 1.5
    });
}

10. 跳转自启动设置

jumpAutoStart() {
    var ret = KeepAliveModule.jumpAutoStart({})
    modal.toast({
        message: ret,
        duration: 1.5
    });
}

11. 检查定位服务/权限

返回参数说明

参数 类型 说明
service boolean 定位服务是否开启,true-已开启,其他-未开启
location boolean 定位权限是否已授权,true-已授权,其他-未授权

使用示例

 checkLocationPermission() {
        KeepAliveModule.checkLocationPermission(res => {
            modal.toast({
                message: "定位服务:" + res.service + ",定位权限:" + res.location,
                duration: 1.5
            });
        });
    }

12. 跳转定位服务开启页面

toOpenGps(){
    let ret = KeepAliveModule.toOpenGps();
    modal.toast({
        message: "跳转定位服务",
        duration: 1.5
    });
}

13. 获取定位权限

requireLocationPermission(){
    let ret = KeepAliveModule.requireLocationPermission();
}

14. 判断通知是否打开

isNotificationEnabled() {
    let ret=KeepAliveModule.isNotificationEnabled();
    modal.toast({
        message: ret,
        duration: 1.5
    });
}

15. 跳转通知设置页

 openNotifySetting() {
    KeepAliveModule.openNotifySetting();
}

16. 判断通知是否打开(该通知未打开,系统无法接收应用该通知)

isNotificationEnabled() {
    let ret=KeepAliveModule.isNotificationEnabled();
    modal.toast({
        message: ret,
        duration: 1.5
    });
}

17. 跳转通知设置页

   openNotifySetting() {
    KeepAliveModule.openNotifySetting();
}

18. 应用通知授权判断(通知未授权,无法获取到应用通知内容)

checkNotifySetting(){
    let ret=KeepAliveModule.checkNotifySetting();
    modal.toast({
        message: ret,
        duration: 1.5
    });
},

19. 应用通知授权配置

goNotifySetting(){
    KeepAliveModule.goNotifySetting();
},

20. 开始监听通知信息

参数说明

参数 默认 说明
listenPkgs 监听包名,格式如:"com.tencent.mm,com.xyz.abc",如果多个应用中间用逗号分隔,如果不填,则默认监听当前应用的通知
ifPlayAudio false 是否播放音频,如果选择是,audioJsons必填,否则会报错
audioJsons 音频内容,格式如下:"[{'title':'微信','audioUrl':'https://bjee0d8.mp3'}]",其中title表示通知标题信息,audioUrl表示播放的音频文件,达到不同通知播放播放不同音频,注意:音频文件务必使用网络音频文件
ifUpload false 是否上报服务器
uploadUrl 上报接口,post上传接口,如http://xx/api/xxx,上传参数具体如下表
params 其他参数,如"{'lat':'1','lng':'3'}"
headers Http的header参数

通知信息默认上传参数

参数 类型 说明
title String 通知标题
content String 通知内容
data String 通知数据内容,如果以上两个参数不满足可自行解析

使用示例

openNotifyListener(){
    let ret=KeepAliveModule.openNotifyListener({
        ifUpload: true,//是否上报服务器
        ifPlayAudio:true,//是否播放音频
        listenPkgs:"com.tencent.mm",//监听包名
        audioJsons:"[{'title':'微信','audioUrl':'https://xxx0d8.mp3'}]",//音频文件
        uploadUrl: "http://192.168.0.104/api/uploadXXX",//上报接口
        params: "{'lat':'1','lng':'3'}",//其他参数
        headers: "{'authorization':'Bearer eyJhbGciOiJBzpIm8A'}",
    });
    modal.toast({
        message: ret,
        duration: 1.5
    });
},

21. 清空通知栏信息

clearNotify(){
    KeepAliveModule.clearNotify();
},

隐私、权限声明

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

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

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

1、插件不采集任何数据。 2、插件定位功能使用高德定位SDK,参考其官方网站 https://lbs.amap.com/ 3、插件定位功能使用高德定位SDK,启动时需要获取网络状态、访问Wi-Fi状态、位置信息、访问粗略位置、访问精准定位、读取手机状态和身份,其隐私协议参考 https://lbs.amap.com/agreement/compliance

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

无