在iOS设备上访问以编程方式创建的日历

时间:2012-03-29 19:49:38

标签: iphone ios calendar icalendar

我已经想出如何在我的iPhone应用程序中添加自定义日历,但我无法弄清楚如何将该日历添加到设备的日历中。从应用程序内部查看时,该事件显示正确的日历,但即使我点击事件的日历行,我的日历也不在列表中,如果我想保持日历名称正确,我必须取消。有没有办法'订阅'我本地创建的日历,以便我可以在设备上的日历应用程序中看到它(显然,我也希望它与用户的计算机同步等)。

2 个答案:

答案 0 :(得分:6)

它与iCloud有关。启用iCloud时,将隐藏具有本地源(EKSourceTypeLocal)的日历。

答案 1 :(得分:1)

我今天一直在努力解决这个问题,这一切似乎都取决于我(最终用户)在设备上的日历设置。

我个人将我的GMail日历以Exchange格式同步 - 这样做可以防止“本地”日历出现。

通过操纵依赖于用户设置的EKSource,应该正确显示您的日历 - 这适用于我的Exchange场景,请参阅EKSource类参考了解更多场景。考虑检查iCloud!

EKCalendar *calendar = [EKCalendar calendarWithEventStore:self.eventStore];
calendar.title = @"My Calendar";

EKSource *localSource = nil;
EKSource *defaultSource = [self.eventStore defaultCalendarForNewEvents].source;

if (defaultSource.sourceType == EKSourceTypeExchange) {
    localSource = defaultSource;
} else {

    for (EKSource *source in self.eventStore.sources) {
        if (source.sourceType == EKSourceTypeLocal) {
            localSource = source;
            break;
        }
    }

}

if (localSource) {
    calendar.source = localSource;
} else {
    NSLog(@"Error: no local sources available");
}

NSError *error = nil;
BOOL result = [self.eventStore saveCalendar:calendar commit:YES error:&error];

if (result) {

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:calendar.calendarIdentifier forKey:@"Calendar"];
    [userDefaults synchronize];

    NSLog(@"Saved calendar to event store");

} else {
    NSLog(@"Error saving Calendar");
}