You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:05:10