在我正在开发的应用程序中,用户和用户日历之间存在交互,就像在许多应用程序中发生的那样,非常标准的东西。它正常工作,直到我升级到ios 6.我现在面对的是"这个应用程序无法访问您的日历。您可以在隐私设置"中启用访问权限对话框,当我尝试执行相同的日历功能但我的应用程序没有出现在设备日历隐私设置中。是否需要使用一些新的api才能要求用户授予访问权限?
非常感谢帮助我解决这个问题,无论谁能提供帮助。
答案 0 :(得分:28)
我相信我有完全相同的问题。我正在使用iOS 6为我的iPhone 4部署正常的开发人员版本的应用程序。
编辑:我终于解决了这个问题,我没有在网上找到这些信息,而是在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中的信息执行的操作。有一个名为Privacy - Calendars Usage Description(NSCalendarsUsageDescription)的密钥,它可以包含将在提示中显示给用户的字符串描述。
以下是我遇到的问题的完整详细信息(由上述修复):
当我尝试将活动添加到日历时,我会看到以下屏幕:
当我打开日历隐私设置的设置时,看不到任何应用:
这一切都让我觉得我必须在Info.plist中设置一些设置来启用日历访问并询问用户启动权限。我在网上搜索但没找到任何东西。
@jloewy,我想这是你遇到的同样的问题?
答案 1 :(得分:9)
如果您计划在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 */
}];
}
答案 2 :(得分:7)
如果您想等待用户回复请求,可以在接受的答案中添加一些代码行:
__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
}
答案 3 :(得分:1)
它只会要求一次许可,并且下次会记住这个选择。如果您不允许访问日历,则下次不会询问,也不允许向日历添加事件。
如果要重置这些设置,则必须删除“隐私设置”,然后只有在您的应用尝试使用RequestAccessToEntityType API访问日历时,它才会要求权限。
答案 4 :(得分:0)
在允许应用程序访问日历信息之前,会有一个弹出窗口要求用户许可。如果您不允许应用程序访问日历,则需要明确允许应用程序通过将应用程序列入设置白名单来访问日历。