以编程方式在iPhone日历中添加自定义事件

有没有办法从自定义应用程序添加iCal事件到iPhone日历?

基于苹果的文档 ,这已经改变了一些iOS 6.0。

1)您应通过“requestAccessToEntityType:completion:”请求访问用户的日历,并在块内执行事件处理。

2)你需要现在提交你的事件,或通过“提交”参数保存/删除调用

一切都保持不变

将EventKit框架和#import <EventKit/EventKit.h>到您的代码中。

在我的例子中,我有一个NSString * savedEventId实例属性。

要添加一个事件:

  EKEventStore *store = [EKEventStore new]; [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (!granted) { return; } EKEvent *event = [EKEvent eventWithEventStore:store]; event.title = @"Event Title"; event.startDate = [NSDate date]; //today event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting event.calendar = [store defaultCalendarForNewEvents]; NSError *err = nil; [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; self.savedEventId = event.eventIdentifier; //save the event id if you want to access this later }]; 

删除事件:

  EKEventStore* store = [EKEventStore new]; [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (!granted) { return; } EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId]; if (eventToRemove) { NSError* error = nil; [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error]; } }]; 

这将事件添加到您的默认日历,如果你有多个日历,那么你会发现哪一个是

Swift版本

您需要导入EventKit框架

 import EventKit 

添加活动

 let store = EKEventStore() store.requestAccessToEntityType(.Event) {(granted, error) in if !granted { return } var event = EKEvent(eventStore: store) event.title = "Event Title" event.startDate = NSDate() //today event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting event.calendar = store.defaultCalendarForNewEvents do { try store.saveEvent(event, span: .ThisEvent, commit: true) self.savedEventId = event.eventIdentifier //save event id to access this particular event later } catch { // Display error to user } } 

删除事件

 let store = EKEventStore() store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in if !granted { return } let eventToRemove = store.eventWithIdentifier(self.savedEventId) if eventToRemove != nil { do { try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true) } catch { // Display error to user } } } 

您可以使用OS 4.0中的Event Kit框架来完成此操作。

右键单击窗口左边的组和文件导航器中的FrameWorks组。 select“添加”,然后select“现有框架”,然后select“EventKit.Framework”。

那么你应该可以用这样的代码添加事件:

 #import "EventTestViewController.h" #import <EventKit/EventKit.h> @implementation EventTestViewController - (void)viewDidLoad { [super viewDidLoad]; EKEventStore *eventStore = [[EKEventStore alloc] init]; EKEvent *event = [EKEvent eventWithEventStore:eventStore]; event.title = @"EVENT TITLE"; event.startDate = [[NSDate alloc] init]; event.endDate = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate]; [event setCalendar:[eventStore defaultCalendarForNewEvents]]; NSError *err; [eventStore saveEvent:event span:EKSpanThisEvent error:&err]; } @end 

是的,这个(2.1)还没有API。 但在WWDC看来,很多人已经对function(包括我自己)感兴趣,build议去下面的网站,并为此创build一个function请求。 如果有足够的兴趣,他们可能最终将ICal.framework移动到公共SDK。

https://developer.apple.com/bugreporter/

日历访问正在iPhone OS 4.0中添加 :

日历访问
应用程序现在可以使用Event Kit直接在日历应用程序中创build和编辑事件。
创build周期性事件,设置开始和结束时间,并将其分配给设备上的任何日历。

您可以使用Tristan概述的Event API添加事件,还可以添加iOS日历中显示的Google日历事件。

使用Google的API Objective-C客户端

  - (void)addAnEvent { // Make a new event, and show it to the user to edit GTLCalendarEvent *newEvent = [GTLCalendarEvent object]; newEvent.summary = @"Sample Added Event"; newEvent.descriptionProperty = @"Description of sample added event"; // We'll set the start time to now, and the end time to an hour from now, // with a reminder 10 minutes before NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60]; GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date] timeZone:[NSTimeZone systemTimeZone]]; GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow timeZone:[NSTimeZone systemTimeZone]]; newEvent.start = [GTLCalendarEventDateTime object]; newEvent.start.dateTime = startDateTime; newEvent.end = [GTLCalendarEventDateTime object]; newEvent.end.dateTime = endDateTime; GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object]; reminder.minutes = [NSNumber numberWithInteger:10]; reminder.method = @"email"; newEvent.reminders = [GTLCalendarEventReminders object]; newEvent.reminders.overrides = [NSArray arrayWithObject:reminder]; newEvent.reminders.useDefault = [NSNumber numberWithBool:NO]; // Display the event edit dialog EditEventWindowController *controller = [[[EditEventWindowController alloc] init] autorelease]; [controller runModalForWindow:[self window] event:newEvent completionHandler:^(NSInteger returnCode, GTLCalendarEvent *event) { // Callback if (returnCode == NSOKButton) { [self addEvent:event]; } }]; } 

Swift 2.0实现:

使用import EventKit在页面顶部import EventKit

然后

 @IBAction func addtoCalendarClicked(sender: AnyObject) { let eventStore = EKEventStore() eventStore.requestAccessToEntityType( EKEntityType.Event, completion:{(granted, error) in if (granted) && (error == nil) { print("granted \(granted)") print("error \(error)") let event = EKEvent(eventStore: eventStore) event.title = "Event Title" event.startDate = NSDate() event.endDate = NSDate() event.notes = "Event Details Here" event.calendar = eventStore.defaultCalendarForNewEvents var event_id = "" do{ try eventStore.saveEvent(event, span: .ThisEvent) event_id = event.eventIdentifier } catch let error as NSError { print("json error: \(error.localizedDescription)") } if(event_id != ""){ print("event added !") } } }) } 

简单….使用tapku库….你可以谷歌这个词,并使用它…它的开源…享受…..不需要与这些代码窃听….

请记住将endDate设置为创build的事件,这是强制性的。

否则,它会失败(几乎是无声)与此错误:

 "Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}" 

完整的工作代码是:

 EKEventStore *store = [EKEventStore new]; [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (!granted) { return; } EKEvent *calendarEvent = [EKEvent eventWithEventStore:store]; calendarEvent.title = [NSString stringWithFormat:@"CEmprendedor: %@", _event.name]; calendarEvent.startDate = _event.date; // 5 hours of duration, we must add the duration of the event to the API NSDate *endDate = [_event.date dateByAddingTimeInterval:60*60*5]; calendarEvent.endDate = endDate; calendarEvent.calendar = [store defaultCalendarForNewEvents]; NSError *err = nil; [store saveEvent:calendarEvent span:EKSpanThisEvent commit:YES error:&err]; self.savedEventId = calendarEvent.eventIdentifier; //saving the calendar event id to possibly deleted them }]; 

谷歌的想法是一个不错的,但有问题。

我可以成功打开Goog​​le日历事件屏幕 – 但只能在主桌面版本上显示,并且在iPhone Safari上无法正常显示。 在Safari上正确显示的Google移动日历似乎无法与API一起添加事件。

目前,我看不到一个好办法。

更新为迅速4为Dashrath答复

 import UIKit import EventKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let eventStore = EKEventStore() eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in if (granted) && (error == nil) { let event = EKEvent(eventStore: eventStore) event.title = "My Event" event.startDate = Date(timeIntervalSinceNow: TimeInterval()) event.endDate = Date(timeIntervalSinceNow: TimeInterval()) event.notes = "Yeah!!!" event.calendar = eventStore.defaultCalendarForNewEvents var event_id = "" do{ try eventStore.save(event, span: .thisEvent) event_id = event.eventIdentifier } catch let error as NSError { print("json error: \(error.localizedDescription)") } if(event_id != ""){ print("event added !") } } }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

也不要忘了添加日历使用权限 图像的私人设置