以编程方式在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。
日历访问正在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 }];
谷歌的想法是一个不错的,但有问题。
我可以成功打开Google日历事件屏幕 – 但只能在主桌面版本上显示,并且在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. } }
也不要忘了添加日历使用权限