如何在iOS 6中获取默认日历的名称/ ID

Spo*_*ude 0 icalendar objective-c xcode4

我的iPad上有两(2)个日历(iCal)(一个个人,一个用于应用程序).它们与我的iMac同步,仅用于测试.(节省我在特定应用程序日历中输入的时间).

我目前正在编写一个需要访问应用程序日历的应用程序.它是iPad上的主要日历.我试图让Apple的SimpleEKDemo(未经修改)与应用程序的日历一起工作,但到目前为止我甚至不能让它不崩溃,更不用说返回任何东西了.我几个小时以来一直在关注谷歌和SO问题,并决定是时候召唤大枪了.

这是它崩溃的代码:

- (void)viewDidLoad
{
    self.title = @"Events List";

    // Initialize an event store object with the init method. Initilize the array for events.
    self.eventStore = [[EKEventStore alloc] init];

    self.eventsList = [[NSMutableArray alloc] initWithArray:0];

    // Get the default calendar from store.
    self.defaultCalendar = [self.eventStore defaultCalendarForNewEvents];  //  <---- crashes here    --------

    //  Create an Add button
    UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                      UIBarButtonSystemItemAdd target:self action:@selector(addEvent:)];
    self.navigationItem.rightBarButtonItem = addButtonItem;
    [addButtonItem release];

    self.navigationController.delegate = self;

    // Fetch today's event on selected calendar and put them into the eventsList array
    [self.eventsList addObjectsFromArray:[self fetchEventsForToday]];

    [self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

这是"崩溃"的输出:

2012-10-05 14:33:12.555 SimpleEKDemo[874:907] defaultCalendarForNewEvents failed: Error Domain=EKCADErrorDomain Code=1013 "The operation couldn’t be completed. (EKCADErrorDomain error 1013.)"
Run Code Online (Sandbox Code Playgroud)

我需要确保我的日历正确...我该怎么做?

Wri*_*sCS 12

您需要确保在尝试访问事件存储之前询问权限.请注意,您只需要调用一次.如果用户拒绝访问,则需要转到iOS设置(请参阅代码中的注释)以启用应用程序的权限.

/* iOS 6 requires the user grant your application access to the Event Stores */
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    /* iOS Settings > Privacy > Calendars > MY APP > ENABLE | DISABLE */
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
     {
         if ( granted )
         {
             NSLog(@"User has granted permission!");
         }
         else
         {
             NSLog(@"User has not granted permission!");
         }
     }];
}
Run Code Online (Sandbox Code Playgroud)

在iOS 5中,您只能访问EKEntityTypeEventEvent Store中的Events(),这与您可以访问Reminders(EKEntityTypeReminder)的iOS 6不同.但是你需要上面的代码至少获得一次授权.

我还要提一下,在您访问之前,您需要获得许可EventStore:[self.eventStore defaultCalendarForNewEvents];.

此外,defaultCalendarForNewEvents这将是访问用户默认日历的正确方法.如果您希望访问具有其他名称的日历,则需要遍历日历并根据返回的结果选择适当的日历.