1. 什么是uniapp离线推送?
Uniapp是一套基于Vue.js框架的开源框架,它可以让开发者使用一套代码实现多端运行,包括但不限于微信小程序、H5、Android、iOS等平台。离线推送是指APP在未打开的情况下,接收到服务器推送的消息。在uniapp中,可以通过uni-push模块实现离线推送的功能。
2. uniapp离线推送的实现方式
2.1. 配置应用信息
在使用uni-push之前,需要在manifest.json文件中配置应用的推送信息,如下所示:
{
"manifest_version": "2.0",
"name": "demo",
"version": "1.0.0",
"description": "",
"app": {
"theme": "auto",
"background_color": "#FFFFFF",
"ios": {
"bundleName": "uni-app",
"bundleUrl": "http://localhost:8080/",
"versionName": "1.0.0",
"versionCode": "1",
"allowEnterBackground": true,
"info": {
"CFBundleDisplayName": "uni-app",
"CFBundleShortVersionString": "1.0.0",
"CFBundleVersion": "1"
}
}
},
"mp-weixin": {
"appid": "your appid"
},
"mp-alipay": {
"appid": "your appid"
},
"mp-baidu": {
"appid": "your appid"
},
"mp-toutiao": {
"appid": "your appid"
},
"push": {
"hw": {
"appId": "your appid",
"appSecret": "your appSecret"
},
"mi": {
"appId": "your appid",
"appKey": "your appKey"
},
"vivo": {
"appId": "your appId",
"appKey": "your appKey",
"appSecret": "your appSecret"
},
"oppo": {
"appKey": "your appKey",
"appSecret": "your appSecret"
}
}
}
其中,push字段下面的hw、mi、vivo、oppo等属性是推送厂商的配置信息,需要根据实际情况填写。
2.2. 集成uni-push模块
在uniapp项目中,集成uni-push模块非常简单,只需要在App.vue文件中引入uni-push模块即可。
<template>
<view>
<!--其他组件-->
</view>
</template>
<script>
import uniPush from '@/uni_modules/uni-push/uni-push.vue'
export default {
components: {
uniPush
}
}
</script>
2.3. 注册设备信息
当用户安装APP并打开时,需要向推送服务器注册设备信息。在uni-push中,使用uniPush.register()方法完成注册。
this.uniPush.register({
provider: 'huawei', // 多个推送平台时可选择具体的厂商,不指定时默认使用类似小米、华为、oppo、vivo等厂商
success(res) {
console.log('注册成功', res)
},
fail(err) {
console.log('注册失败', err)
}
})
2.4. 接收离线推送
当服务器推送消息时,APP会接收到通知,可以在App.vue文件中的onLaunch生命周期中监听到相应的事件,并进行处理。
<script>
export default {
onLaunch: function (options) {
// 本地打开时
if (options.scene !== 1007 && options.scene !== 1008 && options.scene !== 1011 && options.scene !== 1012) {
// 判断客户端是否已经退出
const app = getApp()
const now = +new Date()
// 间隔时间内无页面切换,仍是上一次执行的uniPush.showNotification
const delta = now - app.globalData.exitTime
if (delta > 10 * 1000) {
uniPush.showNotification({
title: 'This is a notification',
content: 'This is a content',
data: {
// 自定义字段
},
success(res) {
console.log('显示通知成功', res)
},
fail(err) {
console.log('显示通知失败', err)
}
})
}
}
},
created() {
// 注册APP消息推送
this.registerAppNotification()
},
methods: {
async registerAppNotification() {
try {
await uniPush.register({
//配置具体的推送平台厂商
provider: 'huawei',
success(res) {
console.log('注册成功', res)
},
fail(err) {
console.log('注册失败', err)
}
});
const self = this
// 监听
uniPush.onNotification(function (res) {
console.log(res)
if (res.hasOwnProperty('messageId')) {
// 添加房间将消息列表加一
// self.addUnreadMessageCount()
// 跳转到聊天界面
// uni.navigateTo({
// url: '/pages/chat-detail/chat-detail?' + res
// })
}
});
} catch (e) {
console.log(e)
}
}
}
}
</script>
3.uniapp离线推送无法接收到的原因及解决方法
3.1. 厂商通道是否开通
首先需要检查厂商通道是否开通,如果厂商通道没有开通,则无法正常接收到离线推送。例如,在华为手机上,需要在华为开发者中心申请APP信息并获取客户端的APP ID和APP Secret,然后在云服务控制台的消息推送中添加相应的APP。只有在APP被添加到消息推送中并审核通过后,才能使用华为推送服务,才能接收到推送消息。
3.2. 应用是否有后台运行权限
当应用被退出或者处于后台运行时,需要确保应用有后台运行权限。例如,在Android平台上,需要在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
并在AndroidManifest.xml文件中添加以下代码:
<receiver android:name="io.dcloud.PandoraEntryBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="io.dcloud.feature.notification.PushService"
android:process=":pushservice"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.hms.support.api.push.service.HmsMsgService" />
<action android:name="com.huawei.hms.support.api.push.service.HmsPushMessageService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
3.3. 通知栏是否被锁定
如果通知栏被锁定,则无法正常接收到推送消息。在Android平台上,可以通过设置允许锁屏通知的方式来解决此问题。
3.4. 网络问题
当手机没有联网或者网络问题时,无法接收到推送消息。需要确保手机联网正常,并且与推送服务器的连接正常。
3.5. 程序问题
当程序存在运行问题时,就会影响到离线推送功能的正常使用。如果在检查以上问题后仍无法解决离线推送无法接收的问题,可以尝试对程序进行修复或重构。
4.结论
Uniapp离线推送是一种非常方便和实用的功能,它可以让APP在未打开的情况下接收到服务器推送的消息。然而,由于各种原因,可能会出现无法接收到离线推送的情况,需要开发者仔细检查每个可能的问题并进行有效的解决。只有确保每一步都正确,才能保证离线推送功能的正常使用。