世博会-创建日历缺少来源

时间:2019-08-03 11:56:59

标签: ios react-native expo expo-calendar

尝试在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"

1 个答案:

答案 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上创建本地日历;这使我觉得,这个日历主题还有很多需要挖掘的地方。