Frage

Gibt es eine Möglichkeit iCal Ereignis den iPhone Kalender aus dem benutzerdefinierten App hinzufügen?

War es hilfreich?

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

übergeben

Alles 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.

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

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.

Google API Objective-C-Client

  - (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 Bild für privary Einstellung

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top