更新记录

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.endDate 和 recurrence.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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。