defaultCalendarForNewEvents не удалось

Когда я пытаюсь вызвать [newEventStore defaultCalendarForNewEvents], он возвращает сообщение об ошибке:

[707:907] defaultCalendarForNewEvents failed: Error Domain=EKCADErrorDomain Code=1013 "The operation couldn’t be completed. (EKCADErrorDomain error 1013.)"
[707:907] Error!Failed to save appointment. Description:Error Domain=EKErrorDomain Code=1 "No calendar has been set." UserInfo=0x1fc679f0 {NSLocalizedDescription=No calendar has been set.}

Приложение работает долго. Проблема пришла ко мне впервые. Телефон работает под управлением IOS6 Beta4. модель iphone 4. Кто-нибудь знает, когда метод defaultCalendarForNewEvents потерпит неудачу? Я не могу получить полезную информацию от Google.

8 ответов

На iOS6 Apple представила новый контроль конфиденциальности, который позволяет пользователю контролировать доступность контактов и календарей для каждого приложения. Итак, на стороне кода, вам нужно добавить какой-то способ запроса разрешения. В iOS5 или раньше мы всегда можем позвонить

EKEventStore *eventStore = [[[EKEventStore alloc] init] autorelease];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
    // iOS 6 and later
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (granted) {
            // code here for when the user allows your app to access the calendar
            [self performCalendarActivity:eventStore];
        } else {
            // code here for when the user does NOT allow your app to access the calendar
        }
    }];
} else {
    // code here for iOS < 6.0
    [self performCalendarActivity:eventStore];
}

Приложение Ios не сможет получить какие-либо данные из Календаря в системе iOS6, если вы не вызовите функцию - requestAccessToEntityType: завершение: завершение диалога, чтобы попросить ваших пользователей предоставить доступ к вашему приложению для доступа к Календарю / Напоминанию. Код будет выглядеть так:

//CalendarEventHandler.h  
@interface CalendarEventHandler : NSObject
{
EKEventStore *eventStore;
}
@property (nonatomic, strong) EKEventStore *eventStore;


//CalendarEventHandler.m 
self.eventStore =[[EKEventStore alloc] init];
if([self checkIsDeviceVersionHigherThanRequiredVersion:@"6.0"]) {
        [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

            if (granted){
                //---- codes here when user allow your app to access theirs' calendar.

            }else
            {
                //----- codes here when user NOT allow your app to access the calendar.  
            }  
        }];

    }else {
                //---- codes here for IOS < 6.0.

    }

// Ниже приведен блок для проверки текущей версии ios выше требуемой версии.

 - (BOOL)checkIsDeviceVersionHigherThanRequiredVersion:(NSString *)requiredVersion
 {
  NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

   if ([currSysVer compare:requiredVersion options:NSNumericSearch] != NSOrderedAscending)
   {
       return YES;
   }

       return NO;
  }

iOS6+ требует аутентификации пользователя для сохранения события в календаре его устройства. Вот фрагмент кода:

    // save to iphone calendar
    EKEventStore *eventStore = [[EKEventStore alloc] init];
    if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
    {
        // iOS 6 and later
        // This line asks user's permission to access his calendar
        [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
        {
            if (granted) // user user is ok with it
            {
                EKEvent *event = [EKEvent eventWithEventStore:eventStore];
                event.title  = aTitle;
                event.allDay = YES;

                NSDateFormatter *dateFormat = [[UIApplicationSingleton sharedManager] aDateFormatter];
                [dateFormat setDateFormat:@"MMM dd, yyyy hh:mm aaa"];
                event.startDate = event.endDate = //put here if start and end dates are same

                [event setCalendar:[eventStore defaultCalendarForNewEvents]];
                NSError *err;

                [eventStore saveEvent:event span:EKSpanThisEvent error:&err];

                if(err)
                    NSLog(@"unable to save event to the calendar!: Error= %@", err);

            }
            else // if he does not allow 
            {
                [[[UIAlertView alloc]initWithTitle:nil message:alertTitle delegate:nil cancelButtonTitle:NSLocalizedString(@"plzAlowCalendar", nil)  otherButtonTitles: nil] show];
                return;
            }
        }];
    }

    // iOS < 6
    else
    {
        EKEvent *event = [EKEvent eventWithEventStore:eventStore];
        event.title  = aTitle;
        event.allDay = YES;

        NSDateFormatter *dateFormat = [[UIApplicationSingleton sharedManager] aDateFormatter];
        [dateFormat setDateFormat:@"MMM dd, yyyy hh:mm aaa"];
        event.startDate = event.endDate = //put here if start and end dates are same

        [event setCalendar:[eventStore defaultCalendarForNewEvents]];
        NSError *err;

        [eventStore saveEvent:event span:EKSpanThisEvent error:&err];

        if(err)
            NSLog(@"unable to save event to the calendar!: Error= %@", err);

    }

И проверь мой this post если у вас возникли проблемы при настройке будильника для приложения.

У меня была такая же проблема, но наконец-то выяснили причину.

Мой случай состоял в том, чтобы добавить мои события Напоминания и Календаря, но я использовал одно EKEventStore, В конце концов я отделил их, и проблема исчезла:

private static let calendarEventStore = EKEventStore()
private static let remindersEventStore = EKEventStore()

Так что теперь я использую calendarEventStore для всех вещей, связанных с событием календаря и remindersEventStore для напоминания один.

-

На мой взгляд, это было связано с тем, что я просил defaultCalendarForNewEvents а также defaultCalendarForNewReminders() в одной EKEventStore юридическое лицо.

Также этот от EKEventStore документы:

События, напоминания и объекты календаря, полученные из хранилища событий, нельзя использовать с любым другим хранилищем событий

Решаемые. Я случайно отключил доступ приложения к календарю в Настройки-> Конфиденциальность на IOS6

Свифт форма

(основываясь на ответе @yunas)

_estore = EKEventStore()
_estore.reset()

_estore.requestAccessToEntityType(EKEntityTypeEvent) { (granted, error) in
    if granted {
        println("allowed")
        /* ... */
    } else {
        println("not allowed")
    }           
}

Откроется всплывающее окно "Доступ"

Для пользователей Xamarin:

EKEventStore eventStore = new EKEventStore();
eventStore.RequestAccess(EKEntityType.Event, (bool granted, NSError e) =>
{
    if (granted)
    {
       //Your code here when user gief permissions
    }
});

Перейдите в Симулятор / Настройки устройства / Конфиденциальность / Календари /YourApp Нажмите ON, чтобы разрешить доступ к календарю. И повторите ваш код. Это будет работать.

Другие вопросы по тегам