2015-02-07 17 views
23

का उपयोग कर डिवाइस कैलेंडर में कोई ईवेंट कैसे जोड़ें, मुझे डिवाइस में कैलेंडर ईवेंट जोड़ने का तरीका जानने में दिलचस्पी होगी, लेकिन स्विफ्ट का उपयोग करना। मुझे पता है कि उद्देश्य-सी में कुछ उदाहरण दिए गए हैं, लेकिन फिलहाल कुछ भी तेज नहीं है। बहुत धन्यवाद।स्विफ्ट

+0

स्विफ्ट 2.0 कार्यान्वयन जोड़ा गया: [यहां लिंक पर] (http: // stackoverflow।com/प्रश्न/246,249/प्रोग्राम के रूप में-एड-कस्टम-ईवेंट-इन-द-iphone-कैलेंडर/34,790,334 # 34,790,334) पता नहीं है जो आप आयात करना होगा के लिए – Dashrath

उत्तर

26

स्विफ्ट 3.0 संस्करण

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") 
     } 
    } 

संदर्भ: https://gist.github.com/mchirico/d072c4e38bda61040f91

+10

: आयात EventKit यह –

+1

काम करने के लिए यह देता है त्रुटि "अनसुलझा पहचानकर्ता EKEntityTypeEvent का उपयोग"। क्या मैं कुछ भूल रहा हूँ ? – Dashrath

+2

@ दशरथ 'EKEntityType.Event' का उपयोग करें (स्विफ्ट 2.0 में कुछ बदलाव) –

3

मैं इस समायोजित करने और संकलक टिप्पणी में उल्लेख किया त्रुटि को खत्म करने में सक्षम था उपर्युक्त उत्तरों (और कुछ अन्य) के अनुसार, निम्नानुसार:

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") 
     } 
    }) 

हालांकि, मुझे अभी भी निम्न त्रुटि मिलती है वह "EKSpan.ThisEvent" के बारे में नीचे है: कॉल में गलत तर्क लेबल (: अवधि: त्रुटि: ', अपेक्षित': अवधि: प्रतिबद्ध: ')।

मैंने "त्रुटि" को "प्रतिबद्ध" में बदलने की कोशिश की, लेकिन इसने मुझे एक कंपाइलर त्रुटि दी और कहा कि यह शून्य की बजाय बूल की अपेक्षा करता है। यह तेजी से वाक्यविन्यास में अद्यतन के साथ एक समस्या की तरह लगता है।

संपादित करें: मैं this tutorial के बाद समाप्त हुआ और इसे काम करने में सक्षम था।

  1. सबसे पहले, कैलेंडर तक पहुंचने के लिए अनुमति मांगें और (यदि वह अनुमति दी जाती है) ईवेंट जोड़ने के लिए एक फ़ंक्शन को कॉल करें।

    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. समारोह है कि इसके बाद के संस्करण कोड स्निपेट में कहा जाता है घटना जोड़ने के लिए:

    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

स्विफ्ट 3.0 संगत:

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?) 
     } 
    }) 
} 

और यह भी आयात EventKit

तो आप आसानी से हर जगह से इस विधि कॉल कर सकते हैं:

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

यदि आप चाहें, तो आप एक utiliy वर्ग के अंदर इस विधि रख दिया और 'स्थिर' के रूप में यह परिभाषित कर सकते हैं।

+1

में "गोपनीयता - कैलेंडर उपयोग विवरण" जोड़ने की आवश्यकता है। अच्छा, साफ, कामकाजी उत्तर –

+1

आपको "गोपनीयता - कैलेंडर उपयोग विवरण" "info.plist में। –

5

आपको info.plist पर "गोपनीयता - कैलेंडर्स उपयोग विवरण" जोड़ने की आवश्यकता है। के बाद कोड xcode के नवीनतम संस्करण को और तेज के साथ काम करता 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

यह वास्तव में आईओएस 11.2 Xcode 9.2 पर धीमी थी, इसलिए मैं कतारों का उपयोग करने के लिए लुका Davanzo के जवाब संशोधित (बहुत तेजी से काम करता है):

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?) 
       } 
      }) 
     } 
    }