无法在日历

时间:2016-12-28 14:55:23

标签: ios objective-c events calendar

我想在" someName"中添加事件。日历。如果具有给定名称的日历不存在,那么我将以编程方式创建一个。我的问题是当localSource(类型为EKSource)结果为null时,事件不会被添加。我添加了3个检查以确保我获得了localSource的值,但即便如此,在某些情况下localSource也是nil。所以在我的手机上添加了一些事件,但是在我朋友的手机上他们没有。

我关注了各种帖子,我了解到EKSource可以有6种类型:https://developer.apple.com/reference/eventkit/eksourcetype

我无法理解的是在什么情况下localSource会是零?这在普通语言中意味着什么?我可以从代码中执行某些操作以使其成为非零或用户必须在设备上执行某些操作吗?

- (void)setCalendar {
    NSArray *calendars = [self.eventStore calendarsForEntityType:nil];
    NSString *calendarTitle = someName;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title matches %@", calendarTitle];
    NSArray *filtered = [calendars filteredArrayUsingPredicate:predicate];
    if ([filtered count]) {
        self.calendar = [filtered firstObject];
    }
    else {
        self.calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];
        self.calendar.title = calendarTitle;
        EKSource *localSource;
        for (EKSource *source in self.eventStore.sources)
        {

            //if iCloud account is setup then add the event in that calendar
            if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"])
            {
                localSource = source;
                break;
            }
        }
        if (localSource == nil)
        {
            for (EKSource *source in self.eventStore.sources)
            {
                //if iCloud is not setup then look for local source
                if (source.sourceType == EKSourceTypeLocal)
                {
                    localSource = source;
                    break;
                }
            }

        }
        if (!localSource) {
            localSource = [self.eventStore defaultCalendarForNewEvents].source;
        }
        self.calendar.source = localSource;
        NSError *calendarErr = nil;
        BOOL calendarSuccess = [self.eventStore saveCalendar:self.calendar commit:YES error:&calendarErr];
        if (!calendarSuccess) {
            NSLog(@"Error while updating calendar %@", calendarErr);
        }
    }

}

PS:我有权添加日历活动。

1 个答案:

答案 0 :(得分:4)

本地资源描述用户日历中的'on my iphone','icloud','gmail'等字段。在我的代码中,当用户设置了icloud帐户但没有授予icloud帐户写入日历的权限时,本地源为null。因此,即使应用程序具有写入日历但本地源为零的权限,因此,向日历添加事件也会失败。

我的代码在给定的两种情况下添加到日历中:

  1. 用户已登录icloud并已授权icloud写入日历。在这种情况下,本地源不是nil,并且在'iCloud'中创建名称为'someName'的日历。
  2. 用户尚未登录icloud。现在,日历在'on my iphone'本地源上创建,名称为'someName'。