mrr.sj.front/utils/AS-NotifyTheAuthority.js

258 lines
7.2 KiB
JavaScript
Raw Normal View History

2026-03-25 13:34:16 +08:00
import {
registerPush,
getRegistrationID,
setRegistrationID,
EVENT,
addPushListener
} from '@/uni_modules/TencentCloud-Push';
import request from '@/utils/request'
import store from '@/store/index.js'
/**
* 当前通知权限开启查询
* @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('/sj/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);
request.post('/sj/push/setPushUserId', {
push_user_id: id || registrationID
}).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("/sj/push/messageUnreadNum").then(res => {
console.log('111111111', res);
if (res.code == 200) {
store.commit("setMessageNum", res.data.count)
}
})
console.log('message received111111111', res);
});
// 监听在线推送被撤回
addPushListener(EVENT.MESSAGE_REVOKED, (res) => {
// res 为被撤回的消息 ID
console.log('message revoked', res);
});
//当前系统通知状态
let isSatae = isNotifications ? 1 : 2
request.post('/sj/push/getReceiveState', {
message_type_id: -1
}).then(result2 => {
//如果系统通知状态和后台通知状态不一致
console.log("state", result2.data.list[0].state, isSatae)
if (result2.data.list[0].state != isSatae && isSatae == 1) {
request.post('/sj/push/setReceiveState', {
message_type_id: -1,
message_kind_id: 0,
state: isSatae
}).then(result3 => {
console.log("setReceiveState", result3)
})
}
})
}
}).catch(err => {
})
// #endif
}