2016-08-09 8 views
1

私のEventKitは、イベントがアクセスが拒否されたカレンダーに追加しようとしたときに、カレンダーへのアクセス許可を要求したいと思います。最初にアプリケーションを使用するかどうかを尋ねるだけで、設定でアクセスを拒否した場合は、アクセスを再度許可するようにユーザーに指示することはありません。助けてください。EventKitの許可

エクストラクレジット:イベントがカレンダーに既に存在するかどうかを確認し、そうであれば編集してください。これについての助けもありがとう!ここで

は私のコードです:

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

答えて

3

あなたが直接、再びアクセス権を付与するようにユーザに促すことができません。ただし、ユーザーのポップアップに権限のステータスを表示して、デバイス設定のアクセス許可を要求することができます。ここでは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 
    } 
}]; 

このEKEventStoreのメソッドを使用して、特定のイベントのストアをチェックすることができます。イベント識別子を渡す必要があります。

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

ありがとうございます。私はObjCの翻訳にはあまり役に立ちません。私はそれを理解することができましたが、eventWithIdentifierを使用してイベントをチェックしたり編集したりする方法がわかりません。 –

+0

eventWithIdentifierメソッドは、指定された識別子でストアにイベントが存在する場合、イベントを返します。そうでない場合は、nilを返します。明らかに私は間違っていた。 –

+0

保存すると、 'savedEventId = event.eventIdentifier'をチェックするか、識別子を保存して読み込まないだけですか? –