2016-08-09 24 views
1

Ich möchte meine EventKit Berechtigung für den Kalender anfordern, wenn ein Ereignis versucht wird, dem Kalender mit Zugriff verweigert hinzugefügt werden. Es fragt nur das erste Mal, wenn die App verwendet wird, und wenn Sie den Zugriff in den Einstellungen verweigern, wird der Benutzer nicht aufgefordert, den Zugriff erneut zu gewähren. Bitte helfen Sie.EventKit Erlaubnis

Extra Credit: Ich möchte auch überprüfen, ob das Ereignis bereits im Kalender vorhanden ist, und wenn ja, bearbeiten Sie es. Jede Hilfe mit diesem würde auch geschätzt werden !!

Hier ist mein Code:

func addToCalendar(){ 
    let eventStore = EKEventStore() 

    let startDate = NSDate() 
    let endDate = startDate.dateByAddingTimeInterval(60 * 60) // One hour 

    if (EKEventStore.authorizationStatusForEntityType(.Event) != EKAuthorizationStatus.Authorized) { 
     eventStore.requestAccessToEntityType(.Event, completion: { 
      granted, error in 
      self.createEvent(eventStore, title: "\(self.meal.text!)", startDate: startDate, endDate: endDate) 
     }) 
    } else { 
     createEvent(eventStore, title: "\(self.meal.text!)", startDate: startDate, endDate: endDate) 
    } 
} 

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 
    event.notes = "\(self.Recipe.text!) - See Meal Planning on Listacular" 

    do { 
     try eventStore.saveEvent(event, span: .ThisEvent) 
     savedEventId = event.eventIdentifier 
    } catch { 

     print("Denied") 
    } 
} 

Antwort

3

Sie können direkt nicht prompt Benutzer wieder Zugriff zu gewähren. Sie können jedoch ein Benutzer-Popup zum Berechtigungsstatus anzeigen und die Berechtigung zum Aktivieren der Geräteeinstellungen anfordern. Hier ein Beispiel in objective-c

EKEventStore *store = [EKEventStore new]; 
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
    if (!granted) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      UIAlertController* alertController=[UIAlertController alertControllerWithTitle:@"Access to Calendar is Restricted" message:@"To re-enable, please go to Settings and turn on Calendar Settings for this app else Continue to create party without saving it to your Calendar" preferredStyle:UIAlertControllerStyleAlert]; 
      UIAlertAction *actionOK = [UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) 
             { 
              [self addEvent:store]; //your method 
             }]; 
      [alertController addAction:actionOK]; 
      [alertController addAction:[UIAlertAction actionWithTitle:kSETTINGS style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) 
             { 
              [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; 
             }]]; 
      [self presentViewController:alertController animated:NO completion:nil]; 
     }); 
    } 
    else 
    { 
     [self addEvent:store]; // your method 
    } 
}]; 

Mit dieser Methode von EKEventStore können Sie den Speicher für ein bestimmtes Ereignis überprüfen. Sie müssen die Ereignis-ID übergeben.

- (nullable EKEvent *)eventWithIdentifier:(NSString *)identifier; 
+0

Danke, ich bin nicht großartig darin, ObjC zu übersetzen. Ich konnte es herausfinden, bin mir aber nicht sicher, wie ich mit eventWithIdentifier ein Ereignis überprüfen und bearbeiten kann. –

+0

Die eventWithIdentifier-Methode gibt das Ereignis zurück, wenn ein Ereignis mit der angegebenen Kennung im Speicher vorhanden ist, andernfalls wird nil zurückgegeben. –

+0

anscheinend habe ich das falsch gemacht. Wenn er gespeichert wird, sollte er 'savedEventId = event.eventIdentifier' überprüfen oder speichert das nur den Identifikator und liest ihn nicht? –