更新记录

2.0.1(2026-03-11)

  • 修复ios编译报错

2.0.0(2026-03-04)

  • 新增 updateEventCalendar 更新日历事件功能
  • 新增 queryEventCalendar 按时间段查询日历事件功能,支持关键字过滤
  • 新增事件地点(location)字段支持
  • 新增事件URL链接字段支持
  • 新增事件可用性状态(availability):忙碌/空闲/暂定/不可用
  • 新增高级重复规则(RecurrenceRule)支持:每日/每周/每月/每年重复
  • 新增重复间隔配置(如每2周、每3个月)
  • 新增重复结束日期和重复次数配置
  • 新增按月重复时指定日期(daysOfMonth)
  • 新增按年重复时指定月份(monthsOfYear)
  • 查询结果新增 location、url、isAllDay、availability、alarms、hasRecurrence、recurrenceFrequency、recurrenceInterval 等字段
  • 重构代码结构,提取公共方法,提高可维护性
  • 完善 interface.uts 类型定义

1.1.0(2026-02-03)

  • 新增 Android 平台支持
  • 使用 Android CalendarContract API 实现日历提醒功能
  • 自动请求日历读写权限
  • 统一 iOS 和 Android 返回数据格式
查看更多

平台兼容性

uni-app(4.84)

Vue2 Vue2插件版本 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
2.0.0 × × × × × 5.0 12 ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × - × ×

uni-app x(4.84)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 12 × ×

jun-calendar-event

uni-app 系统日历提醒插件 - 支持 iOS & Android 双平台

一个功能完善的 UTS 插件,用于在 uni-app 应用中调用系统原生日历功能,支持创建、更新、查询、删除日历提醒事件。

✨ 功能特性

  • 双平台支持: iOS 和 Android 原生实现
  • 完整 CRUD: 创建、查询、更新、删除日历事件
  • 多种重复规则: 每日、每周、每月、每年重复
  • 重复间隔: 支持每N天/周/月/年的间隔重复
  • 重复终止: 支持设置重复结束日期或重复次数
  • 闹钟提醒: 可设置多个提醒时间点
  • 全天事件: 支持全天事件类型
  • 事件地点: 设置事件发生的地点
  • URL链接: 关联URL
  • 可用性状态: 忙碌/空闲/暂定/不可用
  • 高级查询: 按时间段查询,支持关键字过滤
  • 权限管理: 自动请求和处理日历权限
  • 时区适配: 自动使用设备当前时区

📱 平台实现

平台 实现方式 最低版本 状态
iOS EventKit Framework iOS 9.0+ ✅ 已支持
Android CalendarContract API Android 5.0+ (API 21) ✅ 已支持

🚀 快速开始

1. 安装插件

将插件导入到项目的 uni_modules 目录下,或通过 HBuilderX 插件市场导入。

2. 导入使用

import {
    createEventCalendar,
    updateEventCalendar,
    removeEventCalendar,
    getEventCalendar,
    queryEventCalendar,
    removeAllEventCalendar,
} from "@/uni_modules/jun-calendar-event";

3. 创建日历提醒

createEventCalendar({
    title: "团队会议",
    notes: "讨论项目进度",
    startDate: "2026-03-25 10:00:00",
    endDate: "2026-03-25 12:00:00",
    alarmOffset: [-60 * 15], // 提前15分钟提醒
    isAllDay: false,
    weeks: [],
    location: "会议室A",
    url: "https://meeting.example.com/123",
    recurrence: null,
    availability: "busy",
    success: (res) => {
        console.log("创建成功,事件ID:", res.eventId);
    },
    fail: (err) => {
        console.log("创建失败:", err.message);
    },
});

4. 创建带高级重复规则的事件

// 每2周的周一、三、五重复,持续到2026年底
createEventCalendar({
    title: "健身训练",
    notes: "记得带运动装备",
    startDate: "2026-03-23 18:00:00",
    endDate: "2026-03-23 20:00:00",
    alarmOffset: [-60 * 30, -60 * 10],
    isAllDay: false,
    weeks: [],
    location: "健身房",
    url: "",
    recurrence: {
        frequency: "weekly",
        interval: 2,
        daysOfWeek: [1, 3, 5],
        daysOfMonth: [],
        monthsOfYear: [],
        endDate: "2026-12-31 23:59:59",
        count: 0,
    },
    availability: "busy",
    success: (res) => console.log("创建成功", res.eventId),
    fail: (err) => console.log("创建失败", err.message),
});

// 每月15号重复
createEventCalendar({
    title: "月度总结",
    notes: "提交月报",
    startDate: "2026-03-15 09:00:00",
    endDate: "2026-03-15 10:00:00",
    alarmOffset: [-60 * 60],
    isAllDay: false,
    weeks: [],
    location: "办公室",
    url: "",
    recurrence: {
        frequency: "monthly",
        interval: 1,
        daysOfWeek: [],
        daysOfMonth: [15],
        monthsOfYear: [],
        endDate: "",
        count: 12,
    },
    availability: "busy",
    success: (res) => console.log("创建成功"),
    fail: (err) => console.log("创建失败"),
});

5. 更新日历事件

updateEventCalendar({
    eventId: "event_id_here",
    title: "团队会议(已改期)",
    notes: "讨论项目进度 - 新会议室",
    startDate: "2026-03-26 14:00:00",
    endDate: "2026-03-26 16:00:00",
    alarmOffset: [-60 * 30],
    isAllDay: false,
    weeks: [],
    location: "会议室B",
    url: "",
    recurrence: null,
    availability: "busy",
    success: (res) => {
        console.log("更新成功");
    },
    fail: (err) => {
        console.log("更新失败:", err.message);
    },
});

6. 查询日历提醒

// 查询所有事件(当前到未来一年)
getEventCalendar((eventsJson) => {
    const events = JSON.parse(eventsJson);
    console.log("查询到的事件:", events);
});

// 按时间段查询,支持关键字过滤
queryEventCalendar({
    startDate: "2026-03-01 00:00:00",
    endDate: "2026-03-31 23:59:59",
    keyword: "会议",
    success: (eventsJson) => {
        const events = JSON.parse(eventsJson);
        console.log("查询到的事件:", events);
    },
    fail: (err) => {
        console.log("查询失败:", err.message);
    },
});

7. 删除日历提醒

removeEventCalendar({
    idfer: "event_id_here",
    success: (res) => {
        console.log("删除成功");
    },
    fail: (err) => {
        console.log("删除失败:", err.message);
    },
});

📖 API 文档

createEventCalendar(options)

创建日历提醒事件

参数 类型 必填 说明
title String 日历事件标题
notes String 日历事件备注/描述
startDate String 开始时间,格式:yyyy-MM-dd HH:mm:ss
endDate String 结束时间,格式:yyyy-MM-dd HH:mm:ss
alarmOffset Array\<Number> 提醒时间数组,单位:秒,负数表示提前
isAllDay Boolean 是否为全天事件
weeks Array\<Number> 每周重复,[0-6] 代表周日到周六,空数组不重复(被recurrence覆盖)
location String 事件地点
url String 关联URL链接
recurrence RecurrenceRule | null 高级重复规则,设置后覆盖weeks
availability String 可用性状态:busy/free/tentative/unavailable,默认busy
success Function 成功回调,参数:{ eventId: string }
fail Function 失败回调,参数:{ message: string }

updateEventCalendar(options)

更新已有的日历事件

参数 类型 必填 说明
eventId String 要更新的事件ID
title String 事件标题
notes String 事件备注
startDate String 开始时间
endDate String 结束时间
alarmOffset Array\<Number> 提醒时间数组
isAllDay Boolean 是否全天事件
weeks Array\<Number> 每周重复
location String 事件地点
url String 关联URL
recurrence RecurrenceRule | null 高级重复规则
availability String 可用性状态
success Function 成功回调
fail Function 失败回调

queryEventCalendar(options)

按时间段查询日历事件,支持关键字过滤

参数 类型 必填 说明
startDate String 查询开始时间
endDate String 查询结束时间
keyword String 按标题/备注/地点关键字过滤
success Function 成功回调,参数为事件JSON字符串
fail Function 失败回调

getEventCalendar(callback)

查询日历提醒列表(当前时间到未来一年)

参数 类型 必填 说明
callback Function 回调函数,参数为 JSON 字符串

removeEventCalendar(options)

删除指定的日历提醒

参数 类型 必填 说明
idfer String 事件 ID
success Function 成功回调
fail Function 失败回调

removeAllEventCalendar(options)

删除指定时间段内的所有日历提醒

参数 类型 必填 说明
startDate String 开始时间
endDate String 结束时间
success Function 成功回调
fail Function 失败回调

RecurrenceRule 重复规则

参数 类型 说明
frequency String 重复频率:daily/weekly/monthly/yearly
interval Number 重复间隔,默认1
daysOfWeek Array\<Number> 按周重复时指定星期几,0=周日 ~ 6=周六
daysOfMonth Array\<Number> 按月重复时指定日期,如[1,15]
monthsOfYear Array\<Number> 按年重复时指定月份,1-12
endDate String 重复结束日期,空字符串=永不结束
count Number 重复次数,0=无限次(与endDate二选一,endDate优先)

返回数据格式

{
  eventId: "事件唯一标识",
  title: "事件标题",
  notes: "事件备注",
  startDate: "2026-03-25 10:00:00",
  endDate: "2026-03-25 12:00:00",
  rules: [1, 3, 5],              // 每周重复规则
  location: "会议室A",            // 事件地点
  url: "https://example.com",    // 关联URL
  isAllDay: false,                // 是否全天
  availability: "busy",          // 可用性状态
  alarms: [-900, -3600],         // 闹钟提醒偏移(秒)
  hasRecurrence: true,            // 是否有重复规则
  recurrenceFrequency: "weekly", // 重复频率
  recurrenceInterval: 2           // 重复间隔
}

⚠️ 注意事项

1. 自定义基座

UTS 插件必须使用自定义基座进行测试和运行

2. 日期格式

日期时间必须严格遵守格式:yyyy-MM-dd HH:mm:ss

3. 提醒时间

alarmOffset 参数说明:

  • 单位:秒
  • 负数表示提前,正数表示延后
  • 示例:
    • -60 * 15 = 提前 15 分钟
    • -60 * 60 = 提前 1 小时
    • -60 * 60 * 24 = 提前 1 天

4. 重复规则

简单重复使用 weeks 参数,高级重复使用 recurrence 参数:

  • recurrence 设置后会覆盖 weeks
  • recurrence.endDaterecurrence.count 二选一,endDate 优先
  • 不同频率配合不同的子字段使用

5. 权限处理

  • iOS: 首次使用会弹出系统权限请求对话框
  • Android: 自动请求日历读写权限

将额外权限加入到 manifest.json > app-plus > distribute > android > permissions

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>

📚 相关文档

📝 更新日志

v2.0.0 (2026-03-04)

  • ✨ 新增 updateEventCalendar 更新日历事件
  • ✨ 新增 queryEventCalendar 按时间段查询事件,支持关键字过滤
  • ✨ 新增事件地点(location)支持
  • ✨ 新增事件URL链接支持
  • ✨ 新增事件可用性状态(availability)
  • ✨ 新增高级重复规则(RecurrenceRule):每日/每周/每月/每年
  • ✨ 新增重复间隔、结束日期、重复次数配置
  • ✨ 查询结果字段大幅扩展
  • 🔧 重构代码结构,提取公共方法
  • 📝 完善类型定义和文档

v1.1.0 (2024-12-20)

  • ✨ 新增 Android 平台完整支持
  • 🔧 统一 iOS 和 Android 数据格式
  • 📝 完善文档和示例
  • 🐛 修复已知问题

v1.0.0 (2024-07-04)

  • 🎉 首次发布
  • ✅ iOS 平台支持

📄 许可证

MIT License

隐私、权限声明

1. 本插件需要申请的系统权限列表:

日历读写

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。