Programmatische benutzerdefiniertes Ereignis im iPhone-Kalender hinzufügen
Frage
Gibt es eine Möglichkeit iCal Ereignis den iPhone Kalender aus dem benutzerdefinierten App hinzufügen?
Lösung
Basierend auf Apple-Dokumentation , das ein wenig wie von iOS 6.0 geändert hat.
1) Sie sollten über den Zugriff auf den Kalender des Benutzers anfordern „: Abschluss: requestAccessToEntityType“ und das Ereignis ausführen innerhalb eines Blockes Handhabung
.2) Sie müssen Ihre Veranstaltung jetzt begehen oder die „commit“ param zu Ihrem speichern / entfernen Anruf
übergebenAlles andere bleibt gleich ...
Fügen Sie den EventKit Rahmen und #import <EventKit/EventKit.h>
, um Ihren Code.
In meinem Beispiel habe ich eine NSString * savedEventId Instanz Eigenschaft.
Um ein Ereignis hinzuzufügen:
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
}];
Nehmen Sie das Ereignis:
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];
}
}];
Dies fügt Ereignisse Standardkalender, wenn Sie mehrere Kalender haben, dann musst du herausfinden, welches das heißt
Swift Version
Sie müssen den EventKit Rahmen importieren
import EventKit
Event hinzufügen
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
}
}
Entfernen Ereignis
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
}
}
}
Andere Tipps
Sie können dies tun, um den Event-Kit Rahmen in O 4.0 verwendet wird.
Rechtsklick auf die FrameWorks Gruppe in den Gruppen und Dateien Navigator auf der linken Seite des Fensters. Wählen Sie ‚Add‘ und dann ‚Bestehende FrameWorks‘ und dann ‚EventKit.Framework‘.
Dann sollten Sie in der Lage sein, Ereignisse wie dies mit Code hinzufügen:
#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
Ja, es gibt noch keine API für diese (2.1). Aber es schien, als ob auf der WWDC eine Menge Leute bereits in der Funktionalität interessiert war (ich eingeschlossen) und die Empfehlung war auf die Webseite unten zu gehen und einen Feature-Request für diesen erstellen. Wenn es genug Interesse ist, könnten sie die ICal.framework an das öffentliche SDK am Ende bewegt.
Kalender Zugang wird 4.0 in iPhone OS hinzugefügt:
Kalenderzugriff
Apps können jetzt erstellen und bearbeiten Ereignisse direkt in die Kalender-App mit Event-Kit.
Erstellen Sie wiederkehrende Ereignisse, richten Sie Anfang und Ende Zeiten und an beliebigen Kalender zuweisen auf dem Gerät.
Sie können das Ereignis fügen Sie die Event-API wie Tristan skizziert und Sie können auch einen Termin in Google Kalender hinzufügen, die in der iOS-Kalender erscheint.
- (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 4.0 Implementierung:
Verwendung Import in oben auf der Seite von import EventKit
dann
@IBAction func addtoCalendarClicked(sender: AnyObject) {
let eventStore = EKEventStore()
eventStore.requestAccess( to: 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 = Date()
event.endDate = Date()
event.notes = "Event Details Here"
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 !")
}
}
})
}
Update für eine schnelle 4 für Dashrath Antwort
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.
}
}
Vergessen Sie auch nicht die Erlaubnis für die Kalendernutzung hinzufügen
Einfache .... verwenden tapku Bibliothek .... können Sie das Wort Google und es ... seine Open-Source verwenden ... genießen ..... keine Notwendigkeit, mit den Codes von nervt ....
Denken Sie daran, die endDate auf das erzeugte Ereignis zu setzen, ist es zwingend notwendig.
Sonst wird es nicht (fast geräuschlos) mit diesem Fehler:
"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"
Der komplette Arbeitscode ist für mich:
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
}];
Arbeits Code in Swift-4.2
import UIKit
import EventKit
import EventKitUI
class yourViewController: UIViewController{
let eventStore = EKEventStore()
func addEventToCalendar() {
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
DispatchQueue.main.async {
if (granted) && (error == nil) {
let event = EKEvent(eventStore: self.eventStore)
event.title = self.headerDescription
event.startDate = self.parse(self.requestDetails.value(forKey: "session_time") as? String ?? "")
event.endDate = self.parse(self.requestDetails.value(forKey: "session_end_time") as? String ?? "")
let eventController = EKEventEditViewController()
eventController.event = event
eventController.eventStore = self.eventStore
eventController.editViewDelegate = self
self.present(eventController, animated: true, completion: nil)
}
}
})
}
}
Jetzt werden wir die Veranstaltung Bildschirm bekommen und hier können Sie Ihre Einstellungen ändern:
Jetzt Delegatmethode fügen Sie das Ereignis Taste Aktion von Ereignisanzeige zu behandeln Abbrechen und fügen Sie:
extension viewController: EKEventEditViewDelegate {
func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
controller.dismiss(animated: true, completion: nil)
}
}
. Hinweis: Vergessen Sie nicht, hinzuzufügen, NSCalendarsUsageDescription Schlüssel in info plist
Die Google Idee ist ein netter, aber hat Probleme.
Ich kann erfolgreich einen Google-Kalenderereignis Bildschirm öffnen - aber nur auf der Haupt-Desktop-Version, und es nicht richtig angezeigt wird auf dem iPhone Safari. Der Google-Handy-Kalender, der ordnungsgemäß auf Safari anzeigt, scheint nicht mit der API zu arbeiten Ereignisse hinzuzufügen.
Im Moment kann ich nicht eine gute Art und Weise aus dem einem sehen.