2013-04-01 21 views
10

Desidero aprire il calendario IOS nativo (ical) dalla mia applicazione e aggiungere un evento. C'è un modo per aprire un calendario per un evento particolare?Come aggiungere eventi nel calendario IOS nativo

Seguo anche Open iphone calendar app programmatically ma non ancora riuscito.

+0

'SBSLaunchApplicationWithIdentifier (CFSTR ("com.apple.mobilecal"), false);', ma è privato. –

+0

@AkshayPuoi dirmi quale libreria o applicazione di esempio hai indicato per visualizzare il calendario IOS nativo? –

risposta

31

Vedere Calendar and Reminders Programming Guide. Ma il processo di base è:

  1. Aggiungere il EventKit.Framework e EventKitUI.Framework al progetto. (Vedere Linking to a Library or Framework.)

  2. Importa l'intestazione:

    #import <EventKitUI/EventKitUI.h> 
    
  3. Se la creazione di un evento, è possibile utilizzare:

    - (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. vostro controller della vista deve essere conforme al protocollo EKEventEditViewDelegate:

    @interface ViewController() <EKEventEditViewDelegate> 
    

    e implementare il metodo didCompleteWithAction:

    - (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action 
    { 
        [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
    
  5. È possibile, ovviamente, creare il vostro evento qualsiasi modo si desidera. Ad esempio, questo è un evento cerca la prossima settimana con il titolo appropriato, e se non lo trova, creare un nuovo evento (evento di un'ora che parte in quattro ore):

    - (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; 
    } 
    
+0

Grazie. Anche se non sono in grado di aprire direttamente l'app di calendario, la soluzione è vicina a ciò di cui avevo bisogno. –

+0

grazie ..! Ha funzionato per me. – iGo

+0

Grazie mille, funziona bene, ho appena copiato e incollato come suo. – ravinder521986

3

Il codice seguente aiuta ad aggiungere eventi al calendario nativo.

- (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; 
} 
+0

Questo codice funziona per me –

10

Utilizzare lo schema di URL per aprire l'app del calendario nativo.

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

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

+0

ciao. la tua soluzione funziona perfettamente per iOS 7, ma non funziona quando ho provato un simulatore iOS 6.1. Eventuali suggerimenti ? – GoGreen

+4

Non funziona su simulatore 6.x in quanto il simulatore 6.x non ha un'app di calendario. Prova sul dispositivo. – nanjunda

Problemi correlati