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

261 lines
7.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}