import { registerPush, getRegistrationID, setRegistrationID, EVENT, addPushListener } from '@/uni_modules/TencentCloud-Push'; import request from '@/utils/request' /** * 当前通知权限开启查询 * @returns {Boolean} true:已开启 false:未开启 */ export const isNotificationsEnabled = () => { // #ifdef APP-PLUS if (plus.os.name == 'Android') { // 判断是Android var main = plus.android.runtimeMainActivity() var NotificationManagerCompat = plus.android.importClass( 'android.support.v4.app.NotificationManagerCompat' ) if (NotificationManagerCompat == null) { NotificationManagerCompat = plus.android.importClass( 'androidx.core.app.NotificationManagerCompat' ) } // 返回是否有权限 return NotificationManagerCompat.from(main).areNotificationsEnabled() } else if (plus.os.name == 'iOS') { // 判断是iOS var isOn = undefined var types = 0 var app = plus.ios.invoke('UIApplication', 'sharedApplication') var settings = plus.ios.invoke(app, 'currentUserNotificationSettings') if (settings) { types = settings.plusGetAttribute('types') plus.ios.deleteObject(settings) } else { types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes') } plus.ios.deleteObject(app) isOn = 0 != types // 返回是否有权限 return isOn } // #endif } /** * 前往系统设置的功能 * @param {Boolean} type true:开启 false:关闭 * @returns */ export const permissions = (type) => { // #ifdef APP-PLUS if (plus.os.name == 'Android') { // 判断是Android var main = plus.android.runtimeMainActivity() var pkName = main.getPackageName() var uid = main.getApplicationInfo().plusGetAttribute('uid') uni.showModal({ title: `通知权限${type ? '开启' : '关闭'}提醒`, content: `是否前往设置${type ? '开启' : '关闭'}通知权限?`, success: res => { if (res.confirm) { var Intent = plus.android.importClass('android.content.Intent') var Build = plus.android.importClass('android.os.Build') //android 8.0引导 if (Build.VERSION.SDK_INT >= 26) { var intent = new Intent( 'android.settings.APP_NOTIFICATION_SETTINGS' ) intent.putExtra('android.provider.extra.APP_PACKAGE', pkName) } else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0 var intent = new Intent( 'android.settings.APP_NOTIFICATION_SETTINGS' ) intent.putExtra('app_package', pkName) intent.putExtra('app_uid', uid) } else { //(<21)其他--跳转到该应用管理的详情页 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) var uri = Uri.fromParts( 'package', mainActivity.getPackageName(), null ) intent.setData(uri) } // 跳转到该应用的系统通知设置页 main.startActivity(intent) } else if (res.cancel) { console.log('点击了取消') } } }) } else if (plus.os.name == 'iOS') { // 判断是iOS var app = plus.ios.invoke('UIApplication', 'sharedApplication') plus.ios.deleteObject(app) uni.showModal({ title: `通知权限${type ? '开启' : '关闭'}提醒`, content: `是否前往设置${type ? '开启' : '关闭'}通知权限?`, success: res => { if (res.confirm) { var app = plus.ios.invoke('UIApplication', 'sharedApplication') var setting = plus.ios.invoke( 'NSURL', 'URLWithString:', 'app-settings:' ) plus.ios.invoke(app, 'openURL:', setting) plus.ios.deleteObject(setting) plus.ios.deleteObject(app) } else if (res.cancel) { console.log('点击了取消') } } }) } // #endif } export const formatParams=(params)=> { let paramStr = ''; for (let key in params) { if (params.hasOwnProperty(key)) { // 对参数值进行编码,避免特殊字符导致的问题 paramStr += `${key}=${encodeURIComponent(params[key])}&`; } } // 去除最后一个&符号 return paramStr.slice(0, -1); } /** * 注册推送 */ export const registPush = () => { // #ifdef APP-PLUS request.post('/user/push/getPushUserId').then(result => { if (result.code == 200) { let isNotifications = isNotificationsEnabled() const SDKAppID = 1600130322; // 您的 SDKAppID const appKey = '5IrByLsKWJhbbNKIKEy2sZRIcQX6omnhMEUoA6zexuLCOsJ33mprqKs9T36Eg8ZZ'; // 客户端密钥 const registrationID = result.data.push_user_id; // 客户端密钥 setRegistrationID(registrationID, (id) => { console.log('setRegistrationID ok', id); }); registerPush(SDKAppID, appKey, (data) => { console.log('registerPush ok', data); getRegistrationID((id) => { console.log('getRegistrationID ok', id); if (!uni.getStorageSync("isPushUserId")) { request.post('/user/push/setPushUserId', { push_user_id: id }).then(result2 => { if (result2.code == 200) { uni.setStorageSync("isPushUserId", true) } }) } }); }, (errCode, errMsg) => { console.error('registerPush failed', errCode, errMsg); }); // 监听通知栏点击事件,获取推送扩展信息 addPushListener(EVENT.NOTIFICATION_CLICKED, (res) => { // res 为推送扩展信息 console.log('notification clicked', res); try { // 核心步骤:解析嵌套的JSON字符串 // 第一步:取出res.data中的转义JSON字符串 const innerJsonStr = res.data; // 第二步:将转义字符串解析为JavaScript对象 const parsedData = JSON.parse(innerJsonStr); // 解析后的结构化数据,可直接使用各个字段 console.log('解析后的订单数据:', parsedData); if (parsedData.path) { uni.navigateTo({ // 拼接路径和参数(uniapp中参数需要通过url拼接传递) url: `${parsedData.path}?${formatParams(parsedData.data)}`, // 跳转成功的回调 success: (res) => { console.log('页面跳转成功', res); }, // 跳转失败的回调 fail: (err) => { console.error('页面跳转失败', err); } }); } } catch (error) { // 异常处理:防止JSON格式错误导致程序崩溃 console.error('JSON解析失败:', error); } }); // 监听在线推送 addPushListener(EVENT.MESSAGE_RECEIVED, (res) => { // res 为消息内容 request.post("/user/push/messageUnreadNum").then(res => { if (res.code == 200) { this.$store.commit("setMessageNum", res.data.count) } }) console.log('message received', res); }); // 监听在线推送被撤回 addPushListener(EVENT.MESSAGE_REVOKED, (res) => { // res 为被撤回的消息 ID console.log('message revoked', res); }); //当前系统通知状态 let isSatae = isNotifications ? 1 : 2 request.post('/user/push/getReceiveState', { message_type_id: -1 }).then(result2 => { //如果系统通知状态和后台通知状态不一致 console.log("state", result2.data.list[0].state, isSatae) if (result2.data.list[0].state != isSatae) { request.post('/user/push/setReceiveState', { message_type_id: -1, message_kind_id: 0, state: isSatae }).then(result3 => { console.log("setReceiveState", result3) }) } }) } }).catch(err => { }) // #endif }