2013-03-06 3 views
4

내 앱에서 미리 알림을 저장/검색하려고하지만 어떤 이유로 EKReminder가 저장되지 않는 것처럼 보입니다. 내 코드는 다음과 같습니다.iOS 6에서 EKReminder를 저장하지 못했습니다.

EKEventStore * _eventStore = [[EKEventStore alloc] init]; 
[_eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) { 

    //create a new calendar for reminders. 
    EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityTypeReminder eventStore:_eventStore]; 
    EKSource *localSource = nil; 
    for (EKSource *source in _eventStore.sources) 
     if (source.sourceType == EKSourceTypeLocal) 
     { 
      localSource = source; 
      break; 
     } 

    calendar.source = localSource; 

    self.calendarIdentifier = calendar.calendarIdentifier; 
    EKReminder *reminder = [EKReminder reminderWithEventStore:_eventStore]; 
    reminder.calendar = calendar; 
    reminder.title = @"Test Reminder"; 
    reminder.startDateComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit fromDate:[NSDate date]]; 
    reminder.completionDate = [NSDate dateWithTimeIntervalSinceNow:100]; 

    EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeIntervalSinceNow:100]]; 
    reminder.alarms = @[alarm];  

    NSError *errorOb = nil; 
    BOOL saved = [_eventStore saveReminder:reminder commit:YES error:&errorOb]; 
    if (saved) NSLog(@"Saved Reminder"); 
    else NSLog(@"Failed to save reminder"); 

}]; 

그런 다음 나중에 알림이 실제로 저장되었는지 확인하려고합니다. 이 코드를 사용하여이 작업을 수행합니다.

NSPredicate *predicate = [_eventStore predicateForRemindersInCalendars:nil]; 
[_eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *reminders) { 
    for (EKReminder *reminder in reminders) { 
     NSLog(@"Reminder Title: %@", reminder.title); 
    } 
}]; 

내 새로운 알리미가 표시되지 않습니다!

누구나 내가 뭘 잘못하고 있다고 말할 수 있습니까 ??

답변

2

인증 상태가 EKAuthorizationStatusNotDetermined 인 경우에만 -requestAccessToEntityType:completion:으로 전화하면됩니다. 승인 상태는 +[EKEventStore authorizationStatusForEntityType:]을 사용하여 확인할 수 있습니다.

완료 블록은 처음으로 -requestAccessToEntityType:completion에 전화 할 때만 호출됩니다. Simulator에서는 앱이 이미 액세스 할 수 있기 때문에 한 번 호출하지 않습니다.

EKEventStore * _eventStore = [[EKEventStore alloc] init]; 
EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder]; 
if (authorizationStatus == EKAuthorizationStatusNotDetermined) { 
    [_eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) { 
     if (granted) { 
      [self createNewReminder]; 
     } else { 
      [self showNowAccessAlert]; 
     } 
    }]; 
} else { 
    if (authorizationStatus == EKAuthorizationStatusAuthorized) { 
     [self createNewReminder]; 
    } else { 
     [self showNowAccessAlert]; 
    } 
} 
+0

이 사실입니다. 통찰력을 주셔서 감사합니다 –

0

localSource를 EKSourceTypeCalDAV로 전환하여 작동하도록했습니다. 그것이 왜 필요한지 완전히 확신하지는 못했을 것입니다.

+0

'EKCalendar' 타입의'calendar'에'EKSource' 타입의'localSource'를 지정하고 있습니다, 이것은 아마 나쁜 생각 일 것입니다. 기본 캘린더를 사용하지 않는 이유는 무엇입니까? –

+0

은 오타였습니다. 고쳤다. 내 일정을 이벤트 저장소의 다른 모든 미리 알림과 구분할 수 있기를 원하므로 기본 일정을 사용하지 않습니다. –

+0

좋습니다. 왜 로컬 소스가 작동하지 않는지 잘 모르겠습니다. 캘린더 제목을 설정해 보셨습니까? –

0

희망이 당신을 위해 작동합니다.

if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) 
    { 
     // iOS 6 and later 
     // asks user to allow application to use his device calendar 
     [eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) 
     { 
      if (granted) 
      { 
       EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore]; 
       reminder.title = aNotification; 
       reminder.calendar = [eventStore defaultCalendarForNewReminders]; 
       NSDate *date = //aDate; 
       EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date]; 
       [reminder addAlarm:alarm]; 
       NSError *error = nil; 
       [eventStore saveReminder:reminder commit:YES error:&error]; 

       if(error) 
        NSLog(@"unable to Reminder!: Error= %@", error); 
      } 
     }]; 
    } 
    // iOS < 6 
    else 
    { 
     EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore]; 
     reminder.title = aNotification; 
     reminder.calendar = [eventStore defaultCalendarForNewReminders]; 
     NSDate *date = //aDate; 
     EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date]; 
     [reminder addAlarm:alarm]; 
     NSError *error = nil; 
     [eventStore saveReminder:reminder commit:YES error:&error]; 

     if(error) 
      NSLog(@"unable to Reminder!: Error= %@", error); 
    } 

그리고 디바이스 캘린더에 이벤트를 저장하는 데 문제가있는 경우 내 this post을 확인하십시오.

관련 문제