CalendarKit示例CalendarApp授权弹窗失效,事件无法加载求助
解决iOS 17上CalendarApp权限弹窗不显示及EventKit错误(1,013)的方案
核心问题分析
Error (1,013) 是EventKit的权限校验失败错误,结合权限弹窗未弹出的现象,核心原因是权限配置不满足iOS 17的新要求,或权限请求逻辑存在版本兼容性问题。
具体修复步骤
1. 完善Info.plist权限描述
iOS 17对日历权限新增了细分的描述要求,必须在Info.plist中添加对应权限的说明(根据App实际需求选择,全量访问需配置第一个):
NSCalendarsFullAccessUsageDescription:说明申请全量日历访问权限的原因(例如"需要访问您的日历以展示和管理事件")NSCalendarsReadOnlyAccessUsageDescription:说明仅读取日历权限的原因NSCalendarsWriteOnlyAccessUsageDescription:说明仅写入日历权限的原因
缺少对应描述会直接导致权限弹窗无法触发。
2. 适配iOS 17的权限请求API
旧版本代码使用的requestAccess(to:completion:)方法在iOS 17上可能无法正常唤起弹窗,需替换为新的异步API:
import EventKit let eventStore = EKEventStore() Task { do { // 根据需求选择对应权限请求方法 let status = try await eventStore.requestFullAccessToEvents() if status { // 权限获取成功,执行事件加载逻辑 loadCalendarEvents() } else { // 权限被拒绝,引导用户前往设置开启 } } catch { print("权限请求失败: \(error)") } }
仅需读取权限时用requestReadOnlyAccessToEvents(),仅写入时用requestWriteOnlyAccessToEvents()。
3. 优化权限状态判断逻辑
在发起权限请求前,先检查当前权限状态,避免无效请求或错误处理:
let status = EKEventStore.authorizationStatus(for: .event) switch status { case .notDetermined: // 未请求过权限,发起权限申请 await requestCalendarAccess() case .authorized, .fullAccess, .writeOnly: // 已有有效权限,加载日历事件 loadCalendarEvents() case .denied, .restricted: // 权限被拒,弹出提示引导用户去设置页开启 showPermissionDeniedAlert() @unknown default: break }
iOS 17新增了.fullAccess和.writeOnly状态,适配后可覆盖所有权限场景。
4. 清理缓存重新部署
- 卸载设备上的目标App
- 清理Xcode的Derived Data(路径:
Xcode > 设置 > 位置 > Derived Data,删除对应文件夹) - 重新构建并部署App,避免缓存的权限状态干扰验证
验证标准
完成修复后重新运行App:
- 确认权限弹窗正常弹出
- 授权后日历事件可正常加载
- 控制台不再出现Error(1,013)日志
内容的提问来源于stack exchange,提问作者user2357008
相关产品推荐
相关产品推荐

