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
相关产品推荐
相关产品推荐

