uniapp收不到离线推送

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在未打开的情况下接收到服务器推送的消息。然而,由于各种原因,可能会出现无法接收到离线推送的情况,需要开发者仔细检查每个可能的问题并进行有效的解决。只有确保每一步都正确,才能保证离线推送功能的正常使用。