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

iOS17下日历写入功能失效,权限请求方法已废弃求解决方案

iOS17适配:EKEvent日历权限请求方案修改

iOS17及以后,苹果废弃了requestAccess(to:)方法,要求使用细分的日历权限请求接口。根据你的场景(添加日历事件),使用仅写入权限即可满足需求,以下是适配后的完整代码:

func accessCalendarToAddEvent() {
    let eventStore = EKEventStore()
    
    // 适配iOS17+:请求仅写入日历权限
    if #available(iOS 17.0, *) {
        eventStore.requestWriteOnlyAccessToEventsWithCompletion { granted, error in
            DispatchQueue.main.async {
                self.handleCalendarPermissionResult(granted: granted, error: error, eventStore: eventStore)
            }
        }
    } else {
        // 兼容iOS17以下版本,保留旧权限请求逻辑
        eventStore.requestAccess(to: .event) { granted, error in
            DispatchQueue.main.async {
                self.handleCalendarPermissionResult(granted: granted, error: error, eventStore: eventStore)
            }
        }
    }
}

// 抽离权限结果处理逻辑,统一复用
private func handleCalendarPermissionResult(granted: Bool, error: Error?, eventStore: EKEventStore) {
    if granted && error == nil {
        let event = EKEvent(eventStore: eventStore)
        event.title = "Event 1"
        event.startDate = Date()
        event.endDate = Date()
        
        let eventController = EKEventEditViewController()
        eventController.event = event
        eventController.eventStore = eventStore
        eventController.editViewDelegate = self
        present(eventController, animated: true)
    } else {
        let alertController = UIAlertController(title: "需要日历权限", message: "请在设置中开启日历权限", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "确定", style: .default) { _ in
            guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { return }
            UIApplication.shared.open(settingsURL)
        }
        alertController.addAction(okAction)
        present(alertController, animated: true)
    }
}

关键修改说明

  • 新增版本判断#available(iOS 17.0, *),确保iOS17以下版本的兼容性
  • 替换权限请求方法:使用requestWriteOnlyAccessToEventsWithCompletion:,仅申请写入权限更符合隐私规范,用户授权意愿更高;若需要读取日历的场景,可替换为requestFullAccessToEventsWithCompletion:
  • 抽离权限结果处理逻辑,减少代码冗余,便于后续维护

内容的提问来源于stack exchange,提问作者Developer Rayo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:35:10