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, чтобы разрешить доступ к календарю. И повторите ваш код. Это будет работать.