10

我想从我的应用程序中打开本机 IOS 日历(ical)并添加事件。有什么办法可以打开特定事件的日历吗?

我也以编程方式关注 Open iphone calendar app,但尚未成功。

4

3 回答 3

32

请参阅日历和提醒编程指南。但基本流程是:

  1. EventKit.Framework将and添加EventKitUI.Framework到您的项目中。(请参阅链接到库或框架。)

  2. 导入标头:

    #import <EventKitUI/EventKitUI.h>
    
  3. 如果创建事件,请使用:

    - (IBAction)didPressCreateEventButton:(id)sender
    {
        EKEventStore *store = [[EKEventStore alloc] init];
    
        if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)])
        {
            // iOS 6
            [store requestAccessToEntityType:EKEntityTypeEvent
                                  completion:^(BOOL granted, NSError *error) {
                                      if (granted)
                                      {
                                          dispatch_async(dispatch_get_main_queue(), ^{
                                              [self createEventAndPresentViewController:store];
                                          });
                                      }
                                  }];
        } else
        {
            // iOS 5
            [self createEventAndPresentViewController:store];
        }
    }
    
    - (void)createEventAndPresentViewController:(EKEventStore *)store
    {
        EKEvent *event = [self findOrCreateEvent:store];
    
        EKEventEditViewController *controller = [[EKEventEditViewController alloc] init];
        controller.event = event;
        controller.eventStore = store;
        controller.editViewDelegate = self;
    
        [self presentViewController:controller animated:YES completion:nil];
    }
    
  4. 您的视图控制器应符合EKEventEditViewDelegate协议:

    @interface ViewController () <EKEventEditViewDelegate>
    

    并实现didCompleteWithAction方法:

    - (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    
  5. 您显然可以以任何您想要的方式创建您的活动。例如,这是在下周查找具有适当标题的事件,如果没有找到,则创建一个新事件(一小时长的事件,在四小时后开始):

    - (EKEvent *)findOrCreateEvent:(EKEventStore *)store
    {
        NSString *title = @"My event title";
    
        // try to find an event
    
        EKEvent *event = [self findEventWithTitle:title inEventStore:store];
    
        // if found, use it
    
        if (event)
            return event;
    
        // if not, let's create new event
    
        event = [EKEvent eventWithEventStore:store];
    
        event.title = title;
        event.notes = @"My event notes";
        event.location = @"My event location";
        event.calendar = [store defaultCalendarForNewEvents];
    
        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSDateComponents *components = [[NSDateComponents alloc] init];
        components.hour = 4;
        event.startDate = [calendar dateByAddingComponents:components
                                                    toDate:[NSDate date]
                                                   options:0];
        components.hour = 1;
        event.endDate = [calendar dateByAddingComponents:components
                                                  toDate:event.startDate
                                                 options:0];
    
        return event;
    }
    
    - (EKEvent *)findEventWithTitle:(NSString *)title inEventStore:(EKEventStore *)store
    {
        // Get the appropriate calendar
        NSCalendar *calendar = [NSCalendar currentCalendar];
    
        // Create the start range date components
        NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
        oneDayAgoComponents.day = -1;
        NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                                      toDate:[NSDate date]
                                                     options:0];
    
        // Create the end range date components
        NSDateComponents *oneWeekFromNowComponents = [[NSDateComponents alloc] init];
        oneWeekFromNowComponents.day = 7;
        NSDate *oneWeekFromNow = [calendar dateByAddingComponents:oneWeekFromNowComponents
                                                           toDate:[NSDate date]
                                                          options:0];
    
        // Create the predicate from the event store's instance method
        NSPredicate *predicate = [store predicateForEventsWithStartDate:oneDayAgo
                                                                endDate:oneWeekFromNow
                                                              calendars:nil];
    
        // Fetch all events that match the predicate
        NSArray *events = [store eventsMatchingPredicate:predicate];
    
        for (EKEvent *event in events)
        {
            if ([title isEqualToString:event.title])
            {
                return event;
            }
        }
    
        return nil;
    }
    
于 2013-04-01T12:11:40.807 回答
10

使用 url 方案打开本机日历应用程序。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"calshow://"]];

http://devsupport.layar.com/entries/23687993-How-to-use-Custom-URI-Scheme-Button-in-the-Creator-

于 2013-09-04T12:01:04.040 回答
3

下面的代码有助于将事件添加到本机日历。

- (NSString*)addEventToCalendarWithTitle:(NSString *)eventTitlestr Description:(NSString *)eventDescriptionstr startDate:(NSString *)startDatestr startTime:(NSString *)startTimestr {
        NSString *returneventidentifier=nil;
        if (__IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED) {
                NSDateFormatter *formatter_=[[NSDateFormatter alloc]init];
                NSTimeZone *gmtZone = [NSTimeZone systemTimeZone];
                NSDate *startedDate=nil;
                NSDate *endedDate=nil;
                [formatter_ setTimeZone:gmtZone];
                NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-US"];
                formatter_.locale = enLocale;
                [enLocale release];
                if (startDatestr!=nil&&startTimestr!=nil) {
                        startDatestr = [startDatestr stringByAppendingString:startTimestr];
                    }
                [formatter_ setDateFormat:[DATE_FORMAT_FROM_RESPONSE stringByAppendingString:TIME_FORMAT_FROM_RESPONSE]]; // here date and time formats are appended as datestring and time string are appended
                if(startDatestr!=nil){
                        
                        startedDate = [formatter_ dateFromString:startDatestr];
                        EKEventStore *eventStore = [[EKEventStore alloc] init];
                        //            __block BOOL accessGranted = NO;
                        //            if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
                        //                dispatch_semaphore_t sema = dispatch_semaphore_create(0);
                        //                [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
                        //                    accessGranted = granted;
                        //                    dispatch_semaphore_signal(sema);
                        //                }];
                        //                dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
                        //            } else { // we're on iOS 5 or older
                        //                accessGranted = YES;
                        //            }
                        //            
                        //            if (accessGranted) {
                        //            }
                        EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
                        event.title     = eventTitlestr;
            event.notes = eventDescriptionstr;
                        event.startDate = startedDate;
                        endedDate = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];
                        event.endDate   =endedDate ;
                        event.alarms=[NSArray arrayWithObject:[EKAlarm alarmWithRelativeOffset:DEFAULTALERTTIME]];
                        [event setCalendar:[eventStore defaultCalendarForNewEvents]];
                        NSError *err;
                        [eventStore saveEvent:event span:EKSpanThisEvent error:&err];  
                        [eventStore release];
                        eventStore=nil;
                        [endedDate release];
                        endedDate=nil;
                        returneventidentifier=event.eventIdentifier;
                    }
                [formatter_ release];
                formatter_=nil;
                
            }
        else {
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert !" message:@"Lower IOS versions event adding functionality is not possible." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
            }
        return returneventidentifier;
}
于 2013-05-15T07:33:30.257 回答