17

在我目前正在开发的应用程序中,用户和用户日历之间存在交互,就像许多应用程序中发生的那样,非常标准的东西。在我升级到 ios 6 之前它工作正常。当我尝试执行相同的日历功能但我的应用程序确实可以时,我现在面临“此应用程序无权访问您的日历。您可以在隐私设置中启用访问权限”对话框不会出现在设备日历隐私设置中。我需要使用一些新的 api 来要求用户授予访问权限吗?

非常感谢能帮助我解决这个问题的人。

4

5 回答 5

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,我想这与您遇到的问题相同吗?

于 2012-09-24T10:54:32.537 回答
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 */
    }];
}
于 2012-10-09T17:27:45.537 回答
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
}
于 2012-12-17T15:22:47.800 回答
1

它只会请求一次许可,下次它会记住选择。如果您不允许访问日历,则下次它不会询问,也不允许将事件添加到日历。

如果您想重置这些设置,您必须删除“隐私设置”,然后只有在您的应用尝试使用 RequestAccessToEntityType API 访问日历时,它才会请求权限。

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

于 2012-12-29T20:14:11.800 回答
0

在允许应用程序访问日历信息之前,将有一个弹出窗口询问用户的权限。如果您不允许应用程序访问日历,则需要通过在设置中将应用程序列入白名单来明确允许应用程序访问日历。

于 2012-09-21T21:13:10.627 回答