当前位置: 首页 > news >正文

UniApp 全局通知功能实现

UniApp 全局通知功能实现:从 Vue 3 兼容性问题到完整解决方案

本文记录了一个 UniApp 项目中全局通知功能的完整实现过程,重点解决了 Vue 3 API 在旧版本 HBuilderX 中的兼容性问题,并提供了完整的代码示例和实现思路。

问题背景

在开发 UniApp 应用时,我尝试实现一个全局通知功能,但在运行时遇到了白屏问题。经过排查,发现这是因为项目使用了 Vue 3 的 API,而当前使用的 HBuilderX 版本对 Vue 3 支持不完善导致的兼容性问题。

解决方案

1. 降级到 Vue 2 写法

首先需要将项目从 Vue 3 的写法改为 Vue 2 的兼容性写法。

main.js - 修复版

// 使用Vue 2的写法
import App from './App.vue'
import Vue from 'vue'
import './common/uni.promisify.adaptor'Vue.config.productionTip = false
App.mpType = 'app'const app = new Vue({...App
})
app.$mount()

2. 应用入口文件调整

App.vue - 修复版

<script>
export default {onLaunch() {console.log('App启动')// 设置一个简单的token模拟登录uni.setStorageSync('token', 'test_token')},onShow() {console.log('App Show')},onHide() {console.log('App Hide')}
}
</script><style>
/* 全局样式 */
page {background-color: #f8f8f8;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica, sans-serif;
}.container {padding: 20rpx;
}
</style>

核心功能实现

通知功能页面

创建一个功能完善的测试页面,包含多种通知类型和操作日志功能。

pages/index/index.vue - 核心代码结构

<template><view class="container"><!-- 页面头部 --><view class="header"><text class="title">推送通知测试</text><text class="subtitle">点击按钮测试通知功能</text></view><!-- 功能按钮组 --><view class="button-group"><button class="btn btn-primary" @tap="sendSimpleNotification">发送简单通知</button><button class="btn btn-success" @tap="sendDelayedNotification">发送5秒延迟通知</button><button class="btn btn-warning" @tap="sendCustomNotification">发送自定义通知</button><button class="btn btn-error" @tap="clearNotifications">清空所有通知</button></view><!-- 操作日志显示 --><view class="log-card"><text class="log-title">操作日志:</text><scroll-view class="log-content" scroll-y><text class="log-item" v-for="(log, index) in logs" :key="index">{{ log }}</text></scroll-view></view></view>
</template>

通知功能方法实现

<script>
export default {data() {return {messageCount: 1,logs: []}},methods: {// 初始化推送功能initPush() {if (typeof plus === 'undefined') {this.addLog('错误: plus对象未定义,请在真机上运行')return}// 监听通知点击事件plus.push.addEventListener('click', (msg) => {this.addLog('通知被点击: ' + msg.content)uni.showToast({title: '点击了通知',icon: 'success'})})},// 发送简单通知sendSimpleNotification() {const content = `这是第${this.messageCount}条测试消息`plus.push.createMessage(content,JSON.stringify({ type: 'test', id: this.messageCount }),{title: '测试通知',cover: false,sound: 'system'})this.addLog('发送通知: ' + content)this.messageCount++},// 发送延迟通知sendDelayedNotification() {plus.push.createMessage('这是5秒后显示的延迟通知',JSON.stringify({ type: 'delayed', time: new Date() }),{title: '延迟通知',delay: 5, // 5秒延迟cover: false})},// 清空所有通知clearNotifications() {plus.push.clear()this.messageCount = 1this.addLog('清空所有通知')}}
}
</script>

兼容性处理

Promise 兼容性适配

创建 common/uni.promisify.adaptor.js 文件处理 Promise 兼容性问题:

// common/uni.promisify.adaptor.js
if (!Promise.prototype.finally) {Promise.prototype.finally = function(callback) {let P = this.constructor;return this.then(value => P.resolve(callback()).then(() => value),reason => P.resolve(callback()).then(() => { throw reason }));};
}

配置文件

manifest.json - 配置 Android 通知权限:

{"app-plus": {"distribute": {"android": {"permissions": ["<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>"]}}}
}

样式设计

采用渐变背景和卡片式设计,提供良好的用户体验:

.container {padding: 40rpx;min-height: 100vh;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}.btn {width: 100%;padding: 28rpx;border-radius: 16rpx;font-size: 32rpx;text-align: center;border: none;color: white;font-weight: bold;
}

技术要点总结

  1. 环境检测:通过检查 plus 对象是否存在来判断运行环境
  2. 错误处理:完整的 try-catch 机制确保应用稳定性
  3. 用户体验:实时操作日志和 Toast 提示
  4. 功能完善:支持多种通知类型(即时、延迟、自定义)
  5. 权限配置:正确配置 Android 通知权限

运行效果

实现后的应用具备以下功能:

  • 发送即时系统通知
  • 发送延迟通知(5秒后显示)
  • 发送随机内容的自定义通知
  • 一键清空所有通知
  • 实时操作日志记录
  • 通知点击事件处理

注意事项

  1. 此功能需要在真机环境中测试,模拟器可能无法正常使用推送功能
  2. 不同 Android 版本对通知权限的要求可能不同
  3. iOS 设备的通知机制与 Android 有所不同,需要额外配置

通过以上实现,我们成功解决了 Vue 3 兼容性问题,并实现了一个功能完整的 UniApp 全局通知系统。这个方案既保证了兼容性,又提供了良好的用户体验和可扩展性。

http://www.dtcms.com/a/572704.html

相关文章:

  • uni-app开发安卓app时控制屏幕常亮不息屏
  • uniapp 小程序引入 uview plus 框架,获得精美的UI框架
  • 在被窝里使用笔记本电脑,容易损坏键盘?
  • Unix Domain Socket:构建高效本地进程间通信的完整指南
  • 如何创建“国学助手”GPT?
  • AWS Elastic Beanstalk中安装tesseract5.3.4版本
  • 实战:用Elasticsearch构建爬虫数据搜索引擎
  • 微网站建设及微信公众号长春自助建站软件
  • 修改图片网站卖房app十大排行榜
  • python-爬虫之beautifulsoup
  • Ubuntu 24.04 安装 FreeSWITCH 完整教程
  • LeetCode(python)——49.字母异位词分组
  • Redis 性能优化与故障排查指南
  • 24.java openCV4.x 入门-Imgproc之轮廓凸包与凹陷检测(形状识别)
  • IDEA 插件推荐
  • 虚拟 DOM(Virtual DOM)的工作原理及其性能优化机制
  • git详细使用教程
  • 北京工程工程建设交易信息网站和城乡建设部网站
  • soular零基础学习,如何通过工作台聚合TikLab所有工具链
  • 建立企业网站电商网站建设开题报告
  • css font-size 的妙用
  • Jenkins安装部署
  • 阿里云 CDN + 静态资源(图片 / JS/CSS)缓存优化
  • 荣耀前端开发面试题及参考答案
  • shtml怎么做网站建设学校网站多钱
  • Navicat 连接 SQL Server 报错 [08001] 超时错误(258)的排查与解决方案
  • Linux 使用 `wait` 函数回收子进程
  • 八股训练营第 8 天 | TCP连接三次握手的过程?TCP连接四次挥手的过程?HTTP的Keep-Alive是什么?
  • 【计算网络学习笔记】网络基础之网络协议栈
  • CyberSecEval 2