前言
从开发 UniApp
项目开始一直用 Vue-Cli
方式,虽然期间遇到小坑,都基本很好解决,最近在结合推送模块的时候,遇到天大的坑,如果在 HbuilderX
开发情况下不会出现这个问题,但项目开发到尾期总不可能迁移环境到 HbuilderX
环境下吧?
UniPush 2.0
在后续开发期间,客户要求集成推送支持,由于对应的运营商还没有配置,就先配置在线推送,本以为在 manifest.json
勾选 在线推送
功能应该可以的,然后后面在 Debug
的时候死活获取不了 clientId
,控制台一直打印 {errMsg: 'getPushClientId:fail uniPush is not enabled'}
的错误,然后没办法在 HbuilderX
环境下创建项目可以获取到 cid
这下意识到还是 Vue-Cli
的坑,后面在 @dcloudio/vue-cli-plugin-uni/packages/uni-push
包找到推送的业务,就尝试修复在 App.vue
:
// 修复推送问题
// #ifdef APP-PLUS
require('@dcloudio/vue-cli-plugin-uni/packages/uni-push/dist/uni-push.plus.es.js')
// #endif
require('@dcloudio/vue-cli-plugin-uni/packages/uni-push/dist/uni-push.es.js')
重新运行后的确可以拿到 cid
了,本来这件事到此为止。
无法离线推送
后续客户将运营商信息全部配置好了,App
在在线情况下是可以接受到消息,离线情况下一直不行,然后在 UniApp
推送管理系统 Debug
的时候发现推送类型机型一直不对,无奈有回到最初查看相关代码,发现要手动启用推送业务回调:
// #ifndef APP-PLUS
uni.invokePushCallback({
type: 'enabled'
})
// #endif
// #ifdef APP-PLUS
uni.invokePushCallback({
type: 'enabled',
offline: true
})
// #endif
这时候重新打包或者自定义基座可以离线推送了。
在点击通知栏消息业务如下:
//离线推送点击
// #ifdef APP-PLUS
plus.push.addEventListener('click', event => {
uni.navigateTo({
url: '/apps/me/message/messageList'
})
// 角标设置
plus.runtime.setBadgeNumber(0)
})
// #endif
// 在线推送点击
uni.onPushMessage(event => {
if (event.type === 'click') {
uni.navigateTo({
url: '/apps/me/message/messageList'
})
// #ifdef APP-PLUS
plus.runtime.setBadgeNumber(0)
// #endif
}
})
结语
只能说 UniApp
天大的坑啊,在社区看到类似的问题也没相关官方人解答。