普通视图
想给App加个日程提醒?试试鸿蒙 Calendar Kit,超好用!
在做应用开发的时候,你是不是经常遇到这种需求:
"用户买了票,得自动把行程加到日历里提醒他。" "这个直播课很重要,能不能在日历里占个坑,到时候发个通知?" "还款日快到了,得有个强提醒,不然用户又要逾期了..."
以前做这些功能,可能得自己写定时器、搞后台服务,不仅麻烦,还容易被系统杀后台导致提醒不准。现在好了,鸿蒙给我们提供了 Calendar Kit(日历服务),直接把这些事儿交给系统日历去管,既省心又稳定,还能蹭一波系统日历的流量,多香啊!
今天咱们就来聊聊怎么用这个 Calendar Kit,放心,不整那些晦涩难懂的官方术语,咱们就按平时写代码的逻辑,一步步把功能做出来。
1. 这玩意儿能干啥?
简单来说,Calendar Kit 就是应用和系统日历之间的桥梁。
- 创建账户:你可以在日历里建一个属于你App的专属账户,比如"我的App日历",这样你的数据就和别人的分开了,互不干扰。
- 管理日程:你可以往这个账户里加日程(Event),设置时间、地点、提醒,还能改能删。
- 一键服务(大招!):这个最酷!你可以在日程里埋一个"传送门",用户在日历里看到日程,点一下按钮(比如"立即观看"、"一键入会"),直接就跳回你的App里了。这就是所谓的"流量回流"啊!
2. 准备工作:权限得先要
跟系统打交道,第一步永远是申请权限。咱们要读写日历,肯定得征得用户同意。
打开你的 module.json5,在 requestPermissions 里加上这两位爷:
"requestPermissions": [
{
"name": "ohos.permission.READ_CALENDAR",
"reason": "$string:reason_read_calendar",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.WRITE_CALENDAR",
"reason": "$string:reason_write_calendar",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
别忘了在 string.json 里把 reason 填好,告诉用户你为什么要读写日历(比如:"用于添加行程提醒")。
然后,在代码里动态申请权限。这块代码有点长,但都是标准动作,建议封装个工具类,或者直接在 EntryAbility 的 onCreate 里搞定。这里就不贴那一大坨样板代码了,记得用 abilityAccessCtrl 去弹窗就行。
3. 手把手教你写代码
好了,权限搞定,咱们开始撸代码。
第一步:拿到日历管家
所有操作的入口都是 CalendarManager。
import { calendarManager } from '@kit.CalendarKit';
// 建议把这玩意儿存成全局变量,或者单例,别每次都get一遍
let calendarMgr = calendarManager.getCalendarManager(context);
第二步:创建你的专属日历账户
别直接往默认账户里塞数据,那样显得很乱,而且容易误删用户自己的日程。咱们创建一个专属的。
async function initMyCalendar() {
// 定义账户信息
const myAccount: calendarManager.CalendarAccount = {
name: 'MyCoolApp', // 内部标识,别跟别人撞名
type: calendarManager.CalendarType.LOCAL,
displayName: '酷应用日程' // 这才是用户在日历App里看到的名字
};
try {
// 1. 创建账户
// 注意:如果账户已经存在,这步也不会报错,会直接返回已有的,很贴心
const calendar = await calendarMgr.createCalendar(myAccount);
// 2. 顺手配置一下颜色和提醒
// 设置个骚气的颜色,让用户一眼就能认出是你的日程
const config: calendarManager.CalendarConfig = {
enableReminder: true, // 开启提醒
color: '#FF0000' // 红色预警!(开玩笑的,选个跟App主题搭的颜色)
};
await calendar.setConfig(config);
console.log('账户创建成功,可以开始造作了!');
return calendar;
} catch (err) {
console.error('哎呀,创建账户翻车了:', err);
}
}
第三步:加个日程试试
假设咱们是个买票App,用户刚买了一张明天下午的高铁票。
async function addTrainTicketEvent(calendar: calendarManager.Calendar) {
// 搞定时间戳(这里随便写个时间,实际开发记得用真实时间)
const startTime = new Date('2025-05-01T14:00:00').getTime();
const endTime = startTime + 4 * 60 * 60 * 1000; // 4小时车程
// 构造日程对象
const event: calendarManager.Event = {
title: 'G1234 北京南 -> 上海虹桥', // 标题要清晰
type: calendarManager.EventType.NORMAL,
startTime: startTime,
endTime: endTime,
location: { location: '北京南站' }, // 地点加上,万一用户不知道去哪坐车呢
reminderTime: [60, 15], // 划重点!提前60分钟和15分钟各提醒一次,防误车神器
description: '座位:05车 12A,记得带身份证!' // 备注里放点关键信息
};
try {
const id = await calendar.addEvent(event);
console.log(`搞定!日程ID是 ${id},回头要改要删就靠它了`);
} catch (err) {
console.error('添加日程失败,可能是权限没给够?', err);
}
}
写完这段代码,运行一下,打开系统日历,你应该就能看到那条鲜艳的日程躺在那儿了,是不是很有成就感?😎
4. 进阶玩法:一键回流(DeepLink)
如果只是加个提醒,那还不够完美。用户看到提醒了,想查看车票详情,还得退出日历,滑屏找你的App,多麻烦。
Calendar Kit 的"一键服务"就是解决这个痛点的。咱们可以在日程里加个按钮,比如"查看车票",用户一点,直接跳回你的App详情页。
服务端配置(很重要,别忘了这步!)
这功能比较高级,光改客户端代码不行,还得去 小艺开放平台 注册一下。
简单说就是告诉华为:"嘿,如果有人点击 myapp://ticket/detail 这种链接,记得拉起我的App。"
具体步骤比较繁琐(要填一堆表单),大家去开发者联盟后台按指引操作就行,记得选 HAP LINK 方式。
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
客户端代码
注册完拿到链接模板后,代码里加上 service 字段就行:
const event: calendarManager.Event = {
// ... 其他字段同上 ...
// 加上这个,逼格瞬间提升
service: {
type: calendarManager.ServiceType.TRIP, // 告诉系统这是个出行服务
uri: 'myapp://ticket/detail?id=888888' // 你的DeepLink,记得跟服务端注册的匹配
}
};
系统会自动识别 TRIP 类型,在日历里显示一个"立即查看"或者类似的按钮。
5. 避坑指南 & 小技巧 🛡️
在实际开发中,我踩过几个坑,分享给大家避避雷:
-
权限死循环: 有时候你觉得自己申请了权限,但代码还是报
Permission denied。 解决:一定要检查module.json5里的reason字段是不是用了资源引用($string:...),直接写死字符串有时候是不生效的!还有,真机调试的时候,记得去设置里看看权限是不是真的开了。 -
账户重复创建: 虽然
createCalendar会处理重复,但建议还是先getCalendar查一下。如果每次启动App都调一次创建,虽然不出错,但日志看着也闹心不是? -
提醒时间不准:
reminderTime单位是分钟。如果你填了个负数,或者填了个比当前时间还早的时间,系统可能会忽略或者报错。全天日程(isAllDay: true)的提醒时间算法不一样(0代表当天9点),这个要特别注意文档说明。 -
DeepLink跳不过去: 要是点击日历里的按钮没反应,或者跳错页面了。 检查:
module.json5里的skills配置对不对?actions和uris必须跟你的链接严丝合缝。
6. 总结
Calendar Kit 真的是个提升用户体验的小甜点。几行代码就能让你的App不仅有了系统级的强提醒能力,还能通过日历这个高频入口把用户拉回来。
不管是做工具类、电商类还是内容类应用,都可以想一想:我的App里有什么事件是值得被记录在日历里的? 找到这个点,加上这个功能,用户绝对会觉得你的App很贴心!
好了,赶紧去试试吧,把你的App塞进用户的日历里!