尝试在iOS上创建日历时,我得到了:
Calendar 'My Calendar' could not be saved: Error Domain=EKErrorDomain
Code=14 "Calendar has no source" UserInfo=
{NSLocalizedDescription=Calendar has no source}
我的日历配置如下:
{
"allowsModications": true,
"color": "yellow",
"entityType": "event",
"source": {
"id": "220e5c20-eee3-406a-b1e0-cbd59b06ce66",
"name": "workout-scheduler",
"type": "local",
},
"sourceId": "220e5c20-eee3-406a-b1e0-cbd59b06ce66",
"title": "My Calendar",
"type": "local",
}
我的项目正在使用
"expo": "^34.0.0",
"expo-calendar": "~6.0.0"
答案 0 :(得分:0)
因此,对于好奇的人或可能发现自己有此类问题的人,您应该知道,尽管Android允许使用几乎iOS不会提供的任何值来定义源。
所以我要做的是,在创建日历后,我首先获取现有的日历,然后选择第一个源类型为caldav
的日历-iCloud使用了此标准,因此它将出现在设备上。有了该日历后,我将从他那里获取源ID,并将其设置为我的应用日历的源ID。
let iOsCalendarConfig = {
title: "Workout Events",
color: '#4B968A',
entityType: Calendar.EntityTypes.EVENT,
}
const getEventsCalendars = () => {
return Calendar.getCalendarsAsync(Calendar.EntityTypes.EVENT)
}
export const createCalendar = async (gymConfig) => {
let osConfig;
switch (Platform.OS) {
case "ios":
const calendars = await getEventsCalendars()
const caldavCalendar = calendars.find(calendar => calendar.source.type == "caldav")
osConfig = iOsCalendarConfig;
// Sources can't be made up on iOS. We find the first one of type caldav (most common internet standard)
osConfig.sourceId = caldavCalendar.source.id
break;
case "android":
...
break;
default:
}
return Calendar.createCalendarAsync(osConfig)
}
即使这样做有效,但我意识到例如无法像在Android上那样在iOS上创建本地日历;这使我觉得,这个日历主题还有很多需要挖掘的地方。