2015-02-07 10 views
23

Ich würde gerne wissen, wie Sie ein Kalenderereignis auf dem Gerät hinzufügen, aber mit swift. Ich weiß, dass es einige Beispiele gibt, die in Objective-C gemacht wurden, aber im Moment ist nichts schnell. Danke vielmals.So fügen Sie ein Ereignis im Gerätekalender mithilfe von swift hinzu

+0

Swift 2.0 Implementierung hinzugefügt: [HIER ON LINK] (http: // stackoverflow.com/Fragen/246249/programmatisch-Add-custom-event-in-the-iPhone-Kalender/34790334 # 34790334) – Dashrath

Antwort

26

Swift 3.0 Version

let eventStore : EKEventStore = EKEventStore() 

    // 'EKEntityTypeReminder' or 'EKEntityTypeEvent' 

    eventStore.requestAccess(to: .event) { (granted, error) in 

     if (granted) && (error == nil) { 
      print("granted \(granted)") 
      print("error \(error)") 

      let event:EKEvent = EKEvent(eventStore: eventStore) 

      event.title = "Test Title" 
      event.startDate = Date() 
      event.endDate = Date() 
      event.notes = "This is a note" 
      event.calendar = eventStore.defaultCalendarForNewEvents 
      do { 
       try eventStore.save(event, span: .thisEvent) 
      } catch let error as NSError { 
       print("failed to save event with error : \(error)") 
      } 
      print("Saved Event") 
     } 
     else{ 

      print("failed to save event with error : \(error) or access not granted") 
     } 
    } 

Referenz: https://gist.github.com/mchirico/d072c4e38bda61040f91

+10

für die Sie weiß nicht importieren müssen: Import EventKit es –

+1

funktioniert es gibt Fehler "Verwendung des nicht aufgelösten Bezeichners EKEntityTypeEvent". Fehle ich etwas? – Dashrath

+2

@Dashrath Verwenden Sie 'EKEntityType.Event' (einige Änderungen in Swift 2.0) statt –

3

Ich konnte dies einzustellen und die Compiler-Fehler in den Kommentaren erwähnt zu beseitigen auf die Antworten oben (und einige andere), wie folgt:

var eventStore : EKEventStore = EKEventStore() 

    // 'EKEntityTypeReminder' or 'EKEntityTypeEvent' 

    eventStore.requestAccessToEntityType(EKEntityType.Event, completion: { 
     (granted, error) in 

     if (granted) && (error == nil) { 
      print("granted \(granted)") 
      print("error \(error)") 

      var event:EKEvent = EKEvent(eventStore: eventStore) 

      event.title = "Test Title" 
      event.startDate = NSDate() 
      event.endDate = NSDate() 
      event.notes = "This is a note" 
      event.calendar = eventStore.defaultCalendarForNewEvents 

      eventStore.saveEvent(event, span: EKSpan.ThisEvent, error: nil) 

      print("Saved Event") 
     } 
    }) 

jedoch nach wie vor den folgenden Fehler bei t ich er unten in Bezug auf "EKSpan.ThisEvent": Falsche Argumentbezeichnung im Aufruf (habe ': span: error:', erwartet ': span: commit:').

Ich habe versucht, "Fehler" in "commit" zu ändern, aber es gab mir einen Compilerfehler, der sagte, dass es ein Bool statt Nil erwartet. Es scheint ein Problem zu sein, das mit Updates in schneller Syntax zu tun hat.

Edit: Ich endete nach this tutorial und war in der Lage, es zur Arbeit zu bekommen.

  1. Fragen Sie zuerst die Berechtigung zum Zugriff auf den Kalender und (falls diese Berechtigung erteilt wurde) rufen Sie eine Funktion zum Hinzufügen des Ereignisses auf.

    var savedEventId : String = "" 
    
    func requestAccessPermission() { 
        let eventStore = EKEventStore() 
    
        let startDate = NSDate() 
        let endDate = startDate.dateByAddingTimeInterval(60 * 60) // Ends one hour later 
    
        if (EKEventStore.authorizationStatusForEntityType(.Event) != EKAuthorizationStatus.Authorized) { 
         eventStore.requestAccessToEntityType(.Event, completion: { 
         granted, error in 
          self.createEvent(eventStore, title: "Test Title", startDate: startDate, endDate: endDate) 
         }) 
        } else { 
         createEvent(eventStore, title: "Test Title", startDate: startDate, endDate: endDate) 
        } 
    } 
    
  2. Die Funktion, die in dem obigen Codeausschnitt genannt wird, um das Ereignis hinzuzufügen:

    func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate) { 
        let event = EKEvent(eventStore: eventStore) 
        event.title = title 
        event.startDate = startDate 
        event.endDate = endDate 
        event.calendar = eventStore.defaultCalendarForNewEvents 
        do { 
         try eventStore.saveEvent(event, span: .ThisEvent) 
         savedEventId = event.eventIdentifier 
        } catch { 
         print("Error Saving") 
        } 
    } 
    
38

Swift 3.0 kompatibel:

func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) { 
    let eventStore = EKEventStore() 

    eventStore.requestAccess(to: .event, completion: { (granted, error) in 
     if (granted) && (error == nil) { 
      let event = EKEvent(eventStore: eventStore) 
      event.title = title 
      event.startDate = startDate 
      event.endDate = endDate 
      event.notes = description 
      event.calendar = eventStore.defaultCalendarForNewEvents 
      do { 
       try eventStore.save(event, span: .thisEvent) 
      } catch let e as NSError { 
       completion?(false, e) 
       return 
      } 
      completion?(true, nil) 
     } else { 
      completion?(false, error as NSError?) 
     } 
    }) 
} 

Und auch EventKit importieren

So

Sie können diese Methode leicht rufen von überall her:

addEventToCalendar(title: "Girlfriend birthday", description: "Remember or die!", startDate: NSDate(), endDate: NSDate()) 

Wenn Sie es vorziehen, können Sie diese Methode in einer utiliy Klasse setzen und definieren es als ‚statisch‘.

+1

Nizza, sauber, funktionierende Antwort –

+1

Sie müssen hinzufügen" Datenschutz - Kalender Verwendung Beschreibung "in info.plist. –

5

Sie müssen "Privacy - Calendars Usage Description" zu info.plist hinzufügen. folgenden Code arbeitet mit der neuesten Version von Xcode und schnell 3.

import EventKit 
class EventHelper 
{ 
    let appleEventStore = EKEventStore() 
    var calendars: [EKCalendar]? 
    func generateEvent() { 
     let status = EKEventStore.authorizationStatus(for: EKEntityType.event) 

     switch (status) 
     { 
     case EKAuthorizationStatus.notDetermined: 
      // This happens on first-run 
      requestAccessToCalendar() 
     case EKAuthorizationStatus.authorized: 
      // User has access 
      print("User has access to calendar") 
      self.addAppleEvents() 
     case EKAuthorizationStatus.restricted, EKAuthorizationStatus.denied: 
      // We need to help them give us permission 
      noPermission() 
     } 
    } 
    func noPermission() 
    { 
     print("User has to change settings...goto settings to view access") 
    } 
    func requestAccessToCalendar() { 
     appleEventStore.requestAccess(to: .event, completion: { (granted, error) in 
      if (granted) && (error == nil) { 
       DispatchQueue.main.async { 
        print("User has access to calendar") 
        self.addAppleEvents() 
       } 
      } else { 
       DispatchQueue.main.async{ 
        self.noPermission() 
       } 
      } 
     }) 
    } 
    func addAppleEvents() 
    { 
     let event:EKEvent = EKEvent(eventStore: appleEventStore) 
     event.title = "Test Event" 
     event.startDate = NSDate() as Date 
     event.endDate = NSDate() as Date 
     event.notes = "This is a note" 
     event.calendar = appleEventStore.defaultCalendarForNewEvents 

     do { 
      try appleEventStore.save(event, span: .thisEvent) 
      print("events added with dates:") 
     } catch let e as NSError { 
      print(e.description) 
      return 
     } 
     print("Saved Event") 
    } 
} 
0

Das auf iOS 11.2 Xcode wirklich langsam war 9.2, so dass ich modifizierte Antwort Luca Davanzo die Warteschlangen zu verwenden (viel schneller funktioniert):

func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) { 
     DispatchQueue.global(qos: .background).async {() -> Void in 
      let eventStore = EKEventStore() 

      eventStore.requestAccess(to: .event, completion: { (granted, error) in 
       if (granted) && (error == nil) { 
        let event = EKEvent(eventStore: eventStore) 
        event.title = title 
        event.startDate = startDate 
        event.endDate = endDate 
        event.notes = description 
        event.calendar = eventStore.defaultCalendarForNewEvents 
        do { 
         try eventStore.save(event, span: .thisEvent) 
        } catch let e as NSError { 
         completion?(false, e) 
         return 
        } 
        completion?(true, nil) 
       } else { 
        completion?(false, error as NSError?) 
       } 
      }) 
     } 
    }