Функциональность календаря приложения больше не работает в iOS 6

В приложении, которое я сейчас разрабатываю, есть взаимодействие между пользователем и календарем пользователя, как это происходит во многих приложениях, очень стандартные вещи. Он работал нормально, пока я не обновился до ios 6. Теперь я столкнулся с диалоговым окном «Это приложение не имеет доступа к вашим календарям. Вы можете включить доступ в настройках конфиденциальности», когда я пытаюсь выполнить те же функции календаря, но мое приложение делает не отображается в настройках конфиденциальности календаря устройства. Есть ли какой-то новый API, который мне нужно использовать, чтобы попросить пользователя предоставить доступ?

Большое спасибо за помощь в решении этой проблемы, кто может помочь.


person JLoewy    schedule 21.09.2012    source источник


Ответы (5)


Я считаю, что у меня точно такая же проблема. Я развертываю обычную сборку разработчика приложения, над которым работаю, на свой iPhone 4 с iOS 6.

РЕДАКТИРОВАТЬ: я, наконец, решил это так, я не нашел информацию в Интернете, а нашел ее в API.

Запустите следующее, чтобы запросить разрешение. Очевидно, это асинхронный вызов, и доступ не будет предоставлен, пока пользователь не авторизует приложение.

EKEventStore *es = [[EKEventStore alloc] init];
[es requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    /* This code will run when uses has made his/her choice */
}];

Кроме того, вы можете указать, что приложение пытается сделать с информацией в Info.plist. Существует ключ под названием «Конфиденциальность — описание использования календарей» (NSCalendarsUsageDescription), который может содержать строковое описание, которое будет отображаться в приглашении для пользователя.

Ниже приведены полные сведения о проблеме, с которой я столкнулся (исправлено выше):

Когда я пытаюсь добавить событие в календарь, я вижу следующий экран: Добавить сообщение об ошибке события

Когда я открываю настройки конфиденциальности календаря, приложение не отображается: Настройки, конфиденциальность, календари

Все это наводит меня на мысль, что в файле Info.plist я должен указать какой-то параметр, чтобы включить доступ к календарю и запросить у пользователя разрешение при запуске. Я искал в Интернете, но ничего не нашел.

@jloewy, я думаю, это та же проблема, что и у тебя?

person www.jensolsson.se    schedule 24.09.2012

Если вы планируете поддерживать устройства до iOS 6, я бы добавил следующее, иначе вы получите сообщение об ошибке.

EKEventStore *store = [[EKEventStore alloc] init];    
if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        /* This code will run when uses has made his/her choice */
    }];
}
person Mongo    schedule 09.10.2012

Если вы хотите дождаться ответа пользователя на запрос, можно добавить несколько строк кода к принятому ответу:

__block BOOL accessGranted = NO;

if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        accessGranted = granted;
        dispatch_semaphore_signal(sema);
    }];
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
} else { // we're on iOS 5 or older
    accessGranted = YES;
}

if (accessGranted) {
    // go on
}
person tilo    schedule 17.12.2012

Он запросит разрешение только один раз и в следующий раз запомнит выбор. Если вы не разрешите доступ к календарю, в следующий раз он не будет спрашивать и не позволит добавить событие в календарь.

Если вы хотите сбросить эти настройки, вам нужно удалить «Настройки конфиденциальности», и только тогда он будет запрашивать разрешения, когда ваше приложение попытается получить доступ к календарю с помощью API RequestAccessToEntityType.

http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html

person AnkitJain    schedule 29.12.2012
comment
Пожалуйста, рассмотрите возможность добавления ссылки на документацию. - person Jeff Wolski; 30.12.2012
comment
@Jeff - Спасибо за предложение. Вот ссылка на соответствующую документацию Apple: developer.apple.com/library/ios/#documentation/EventKit/ - person AnkitJain; 30.12.2012

Появится всплывающее окно, запрашивающее у пользователя разрешение, прежде чем разрешить приложению доступ к информации календаря. Если вы не разрешили приложению доступ к календарю, вам необходимо явно разрешить приложению доступ к календарю, добавив приложение в белый список настроек.

person J2theC    schedule 21.09.2012
comment
Я тоже так думал, но это не так. Я попытался удалить приложение с устройства и восстановить его, но это окно никогда не появляется. - person JLoewy; 22.09.2012
comment
это в разделе конфиденциальности в настройках - person serhats; 15.12.2012