更新记录
1.0.0(2023-07-13)
插件功能包含新建/更新通知、删除单个/全部通知、设置通知大图、通知级别、通知权限获取等
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 12.0 | armeabi-v7a:支持,arm64-v8a:支持,x86:未测试 | 适用版本区间:9 - 16 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
如遇问题请提供详细信息如系统版本和型号、复现步骤、代码片段等
部分参数和方法因各平台差异,请阅读并了解文档后使用,使用前请勾选manifest.json-App模块配置-Push(消息推送)
安卓端targetSdkVersion为>=33时,需要额外申请权限,否则通知设置的开关按钮是禁用状态或打开无效,解决方法参考:https://ask.dcloud.net.cn/article/40691
导入插件
const syczuanNotice = uni.requireNativePlugin("syczuan-notice");
使用方式
此插件为原生模块,需要先引入模块,使用参考如下
index.nvue
<template>
<view class="notice_content">
<view class="notice_list">
<text class="notice_btn" @click="sendNotice">发送通知</text>
<text class="notice_btn" @click="deleteNotice">删除单个通知</text>
<text class="notice_btn" @click="deleteAllNotice">删除全部通知</text>
<text class="notice_btn" @click="getNoticePermissions">获取通知权限状态</text>
<text class="notice_btn" @click="openSetting">打开通知设置</text>
<text class="notice_btn" @click="setBadge">设置角标数</text>
<text class="notice_btn" @click="getNotice">获取通知栏列表</text>
</view>
</view>
</template>
<script>
const syczuanNotice = uni.requireNativePlugin("syczuan-notice");
export default {
data() {
return {};
},
methods: {
// 发送通知
sendNotice() {
syczuanNotice.send(
{
// 唯一通知id,用于更新、取消通知
noticeId: 1,
// 通知渠道id 需唯一
channalId: "Default_id",
// 通知渠道名称 需唯一
channalName: "Default",
// 通知标题
title: "通知标题",
// 通知内容
content: "通知内容",
// 通知栏附加文本
subText: "通知栏附加文本",
// 大图标
largeIcon: true,
// 小图标背景颜色
smallColor: "#000000",
// 大图(禁止传空字符)
bigPicture: "网络地址、绝对路径、static/image目录下",
// 点击是否自动关闭通知
autoCancel: true,
// 毫秒时间戳 默认显示当前时间
noticeTime: true,
// 通知优先级
import: 0,
// 常驻状态栏
ongoing: false,
// 未读通知数 0不显示
badge: 1,
// 延迟通知时间(单位s)
trigger: 1,
// 通知长文本
bigText: "",
// 自定义按钮
customButton: "Custom",
// 自定义数据
payload: {
pages: "/pages/index/test",
type: "default",
},
},
(e) => {
console.log(e);
}
);
},
// 删除单个通知
deleteNotice() {
syczuanNotice.delete(1);
},
// 删除全部通知
deleteAllNotice() {
syczuanNotice.deleteAll();
},
// 获取通知权限
getNoticePermissions() {
const info = syczuanNotice.determinePermissions();
console.log(info);
},
// 打开通知设置
openSetting() {
syczuanNotice.openSetting();
},
// 设置角标数
setBadge() {
syczuanNotice.setBadge(10);
},
// 获取通知列表
getNotice() {
const info = syczuanNotice.getNoticeList();
console.log(info);
},
}
};
App.vue
<script>
export default {
onLaunch: function () {
this.handlerLaunchMsg();
console.log("应用启动");
},
onShow: function () {
console.log("进入前台");
},
onHide: function () {
console.log("进入后台");
},
methods: {
// 打开app对应页面
openAppPages(data) {
if (data?.payload?.pages) {
const { type, pages } = data.payload;
switch (type) {
case "new":
uni.redirectTo({
url: pages,
});
break;
case "tabBar":
uni.switchTab({
url: pages,
});
break;
default:
console.log(pages);
uni.navigateTo({
url: pages,
});
break;
}
} else {
console.log("页面数据不存在");
}
},
// 获取runtime.arguments信息
getArgumentsMsg() {
const args = plus.runtime.arguments;
if (args) {
try {
const data = JSON.parse(args);
// 在此处理点击通知后的操作
if (data.syczuanNotice) {
const dataJson = JSON.parse(data.syczuanNotice);
this.openAppPages(dataJson);
}
// 在此处理点击自定义按钮后的操作,如清除通知
else if (data.syczuanNoticeButton){
const dataButtonJson = JSON.parse(data.syczuanNoticeButton);
}
} catch (error) {}
}
},
// 处理Launch信息
handlerLaunchMsg() {
const platform = uni.getSystemInfoSync().platform;
switch (platform) {
case "ios":
uni.onPushMessage((res) => {
if (res?.data?.payload?.syczuanNotice) {
const dataJson = res.data.payload.syczuanNotice;
this.openAppPages(dataJson);
}
});
break;
case "android":
// app未在后台时
this.getArgumentsMsg();
// app在后台时
plus.globalEvent.addEventListener("newintent", (e) => {
this.getArgumentsMsg();
});
break;
default:
break;
}
},
},
};
</script>
获取通知权限状态
syczuanNotice.determinePermissions()
返回参数Object:
对象属性 | 类型 | 说明 |
---|---|---|
type |
Boolean |
权限是否开启 |
msg |
String |
authorized : 允许接收通知 denied : 不允许接收通知[仅iOS] undetermined : 用户未对打开通知提示做回应[仅iOS] provisional : 临时授权发布通知[仅iOS,>=14.0] ephemeral : 被授权在有限的时间内接收通知 |
打开通知设置
syczuanNotice.openSetting()
发送/更新通知
安卓端通知小图标自定义: 将自定义通知小图标命名为pushicon.png
,然后放置在项目根目录的nativeplugins/syczuan-notice/android/res/mipmap-xxhdpi
文件夹下,文件夹不存在时则一级一级新建。完成后需要重新制作自定义基座才能生效。
通知小图标制作: 建议使用512x512
透明底,纯白内容,否则会导致显示白色方块,纯白内容颜色会随系统自动变换(系统控制),配合smallColor
设置背景颜色,顶部状态栏中不显示smallColor
syczuanNotice.send(Object,Callback)
Object 参数说明:
参数 | 参数类型 | 是否必填 | 默认值 | 说明 |
---|---|---|---|---|
noticeId |
[Number] |
否 | - | 通知id 传入:当前通知列表中存在此id则更新,否则新建 不传:每次调用新建通知 如果需要传入id自己控制新建通知,建议最大不超过9位正整数 |
title |
[String] |
是 | - | 通知标题 |
content |
[String] |
是 | - | 通知内容 |
subText |
[String] |
否 | - | 通知栏附加文本 |
channalId |
[String] |
否 | Default_id |
[仅Android] 通知通道id,与channalName 参数保持对应 |
channalName |
[String] |
否 | Default |
[仅Android] 通知通道名称,与channalId 参数保持对应,用于用户对通知分类管理,具体查看app通知设置页 |
largeIcon |
[String,Boolean] |
否 | false |
[仅Android] 通知大图标true : app图标false : 不显示String支持: :通过 plus.io.convertLocalFileSystemURL(filePath) 转换后的绝对路径放置在根目录 static/images 下的相对路径,如: static/images/xxx.png |
bigPicture |
[String] |
否 | - | 通知内容下方显示大图 支持: 通过 plus.io.convertLocalFileSystemURL(filePath) 转换后的绝对路径放置在根目录 static/images 下的相对路径,如: static/images/xxx.png |
smallColor |
[String] | 否 | #000000 |
[仅Android] 通知小图标背景颜色,下拉状态栏中通知小图标背景色 自定义通知小图标 |
autoCancel |
[Boolean] |
否 | true |
[仅Android] 点击通知后是否允许自动清除此条通知 |
noticeTime |
[Boolean,Number] |
否 | true |
[仅Android] 通知中显示的时间true : 以当前时间为准 false : 不显示时间 Number : 以13位毫秒时间戳为准 |
import |
[Number] |
否 | 0 |
[iOS>=15.0] 通知优先级,由于安卓和iOS两端规则并不统一,只有0、1下的行为勉强相同,正常情况下建议直接使用默认值0,详情请查看文档及对照表 点击查看 |
ongoing |
[Boolean] |
否 | false |
[仅Android] 是否允许手动删除通知 |
mute |
[Boolean] |
否 | false |
[仅iOS,<10.0] 通知静音 |
customButton |
[String] |
否 | - | [仅Android] 自定义通知底部按钮文本,默认不显示(点击按钮不会自动清除通知,如需清除则在App.vue 中通过plus.runtime.arguments 接收参数,调用delete 方法手动清除,具体用法查看示例) |
badge |
[Number] |
否 | 0 |
app图标角标通知数,安卓端由于厂商定制较多,可能没有效果 |
bigText |
[String] |
否 | - | [仅Android] 通知长文本,与bigPicture 只能同时设置一种,两个同时设置时仅显示bigText |
trigger |
[Number] |
否 | - | [仅iOS] 延迟通知时间整数(单位s) |
payload |
[Object] |
否 | - | 点击通知和自定义通知底部按钮后app接收参数,通过plus.runtime.arguments 接收,具体用法查看示例 |
Callback返回参数Object:
对象属性 | 类型 | 说明 |
---|---|---|
status |
[Number] |
发送状态码200 : 发送成功400 : 发送失败 |
data |
[Object,String] |
data.noticeId : 通知iddata.payload : 发送时的payload 数据 |
msg |
[String] |
发送状态提示 |
根据noticeId删除单个通知
iOS>=10.0
syczuanNotice.delete(noticeId)
删除全部通知
iOS中包括等待中的通知
syczuanNotice.deleteAll()
仅删除全部等待中的通知
[仅iOS iOS>=10.0]
syczuanNotice.deletePendingAll()
设置角标数
[仅iOS]
syczuanNotice.setBadge(1)
获取通知列表
iOS>=10.0
syczuanNotice.getNoticeList ()
返回参数Array<Object>
:
对象属性 | 类型 | 说明 |
---|---|---|
noticeId |
Number |
通知id |
title |
String |
通知标题 |
content |
String |
通知内容 |
subText |
String |
通知附加文本 |
date |
String |
通知创建时间,格式yyyy-MM-dd HH:mm:ss |
send方法import参数对照表
安卓参考文档:https://developer.android.google.cn/reference/kotlin/android/app/NotificationManager#importance_default
iOS参考文档:https://developer.apple.com/documentation/usernotifications/unnotificationinterruptionlevel?language=objc
import | 安卓端 | iOS端 |
---|---|---|
0 | IMPORTANCE_HIGH |
UNNotificationInterruptionLevelActive |
1 | IMPORTANCE_MIN |
UNNotificationInterruptionLevelPassive |
2 | IMPORTANCE_LOW |
UNNotificationInterruptionLevelTimeSensitive |
3 | IMPORTANCE_DEFAULT |
UNNotificationInterruptionLevelCritical |