使用PyObjC调用EventKit保存事件报错EKErrorDomain Code=11
解决EKErrorDomain Code=11错误及PyObjC创建EKEvent的正确方式
错误原因分析
EKErrorDomain Code=11提示的“That event does not belong to that event store”,本质是事件与事件存储的绑定关系不符合系统预期。你虽然通过setEventStore_设置了事件的存储,但这种“先空初始化再绑定”的方式没有正确建立EKEvent内部与事件存储关联的必要状态,导致系统判定事件不属于当前存储。
正确创建EKEvent的方式
Objective-C中的EKEvent.init(eventStore:)对应PyObjC的initWithEventStore_方法,这才是创建关联指定事件存储的EKEvent的正确方式,而非先调用空参init()再补设存储。
修正后的代码
# 提前导入必要常量 from EventKit import EKEntityTypeEvent from Foundation import ObjCVar ek_store = EKEventStore.alloc().initWithAccessToEntityTypes_(EKEntityTypeEvent) # 明确请求事件权限,避免0的模糊性 print(f'{ek_store=}') my_cal_identifier = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' my_calendar = ek_store.calendarWithIdentifier_(my_cal_identifier) print(f'{my_calendar.eventStore()=}') # 改用带eventStore的初始化方法创建事件 event = EKEvent.alloc().initWithEventStore_(ek_store) print(f'{event.eventStore()=}') event.setStartDate_(my_startDate) event.setEndDate_(my_endDate) event.setCalendar_(my_calendar) event.setTitle_('My new event') # 传入错误指针捕获详细错误信息,方便调试 error = ObjCVar() success = ek_store.saveEvent_span_error_(event, 0, error) if not success: print(f'保存失败: {error.value()}')
额外注意事项
- 初始化
EKEventStore时,不要用0作为entityTypes参数,明确指定EKEntityTypeEvent,确保请求了正确的事件访问权限。 - 保存事件时传入错误指针,能获取比通用提示更详细的错误细节,帮助排查其他潜在问题。
内容的提问来源于stack exchange,提问作者Georg Pfolz
相关产品推荐
相关产品推荐

