Функциональность приложения Календарь больше не работает в ios 6
В приложении, которое я сейчас разрабатываю, есть взаимодействие между пользователем и календарем пользователей, например, что происходит во многих приложениях, очень стандартными. Он работал нормально, пока я не перешел на ios 6. Теперь я столкнулся с "Это приложение не имеет доступа к вашим календарям. Вы можете включить доступ в диалоговом окне" Настройки конфиденциальности ", когда я пытаюсь выполнить те же функции календаря, не отображаются в настройках конфиденциальности календаря устройств. Есть ли какие-то новые api, которые мне нужно использовать, чтобы попросить пользователя предоставить доступ?
Большое спасибо за помощь в решении этой проблемы, кто может помочь.
Ответы
Ответ 1
Я считаю, что у меня такая же проблема. Я развертываю обычный Developer-build приложения, над которым я работаю на своем iPhone 4 с iOS 6.
EDIT: я, наконец, решил это так, я не нашел информацию в Интернете, но я нашел ее в 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), который может содержать описание строки, которое будет отображаться в приглашении пользователю.
Ниже приведены подробные сведения о проблеме, с которой я столкнулся (исправлено выше):
Когда я пытаюсь подключиться к календарю, я вижу следующий экран:
![Add Event error message]()
Когда я открываю настройки для параметров конфиденциальности календаря, приложение не отображается:
![Settings, Privacy, Calendars]()
Все это заставляет меня думать, что есть некоторая настройка, которую я должен поместить в Info.plist, чтобы включить доступ к календарю и спросить у пользователя разрешение на запуск. Я искал в Интернете, но ничего не нашел.
@jloewy, я думаю, это та же самая проблема, с которой вы сталкиваетесь?
Ответ 2
Если вы планируете поддерживать устройства до 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 */
}];
}
Ответ 3
Если вы хотите дождаться ответа пользователя на запрос, можно добавить некоторые строки кода к принятому ответу:
__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
}
Ответ 4
Он запрашивает разрешение только один раз и в следующий раз запоминает выбор. Если вы не разрешаете доступ к Календарю, он не будет запрашивать в следующий раз и не позволит добавлять событие в Календарь.
Если вы хотите использовать reset эти параметры, вы должны удалить "Настройки конфиденциальности", а затем только запрашивать разрешения, как только приложение попытается открыть календарь с помощью API RequestAccessToEntityType.
http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html
Ответ 5
Появится всплывающее окно с запросом пользователя на разрешение, прежде чем разрешить приложению получать доступ к календарной информации. Если вы не разрешили приложению получать доступ к календарю, вам необходимо явно разрешить приложению получать доступ к календарю, удаляя приложение в настройках.