我想从我的应用程序中打开本机IOS日历(ical)并添加事件。 有什么方法可以打开特定事件的日历吗?
答案 0 :(得分:31)
请参阅Calendar and Reminders Programming Guide。但基本过程是:
将EventKit.Framework
和EventKitUI.Framework
添加到您的项目中。 (见Linking to a Library or Framework。)
导入标题:
#import <EventKitUI/EventKitUI.h>
如果要创建活动,请使用:
- (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];
}
您的视图控制器应符合EKEventEditViewDelegate
协议:
@interface ViewController () <EKEventEditViewDelegate>
并实施didCompleteWithAction
方法:
- (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action
{
[self dismissViewControllerAnimated:YES completion:nil];
}
您显然可以按照自己的方式创建活动。例如,这是在下周查找具有相应标题的事件,如果找不到,则创建一个新事件(在四小时内开始的一小时事件):
- (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;
}
答案 1 :(得分:10)
使用网址方案打开原生日历应用。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"calshow://"]];
http://devsupport.layar.com/entries/23687993-How-to-use-Custom-URI-Scheme-Button-in-the-Creator-
答案 2 :(得分: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;
}