EventKitUI/EKCalendarChooser 需要访问通讯录 - 为什么?

EventKitUI/EKCalendarChooser needs access to contacts - why?

我自 2010 年以来就有一个现有的应用程序,现在 iOS 10 要求该应用程序在 Info.plist 中包含描述用法的字符串,如下所述: http://useyourloaf.com/blog/privacy-settings-in-ios-10/

但是,我已经在Info.plist中添加了相应的密钥。尽管如此,当应用程序尝试访问日历时,用户仍然报告应用程序崩溃。其中一位用户现在设法向我发送了一份崩溃报告,如下所示:

Termination Reason: TCC, This app has crashed because it attempted to access 
privacy-sensitive data without a usage description.    
The app's Info.plist must contain an NSContactsUsageDescription key with a string value explaining to the user how the app uses this data.
Triggered by Thread:  2

Filtered syslog:
None found

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x00000001812501a8 0x18124f000 + 4520
1   libdispatch.dylib               0x000000018113b7ec 0x181128000 + 79852
2   Contacts                        0x000000018aa2c63c 0x18a9c8000 + 411196
3   Contacts                        0x000000018a9f7c40 0x18a9c8000 + 195648
4   Contacts                        0x000000018aa08578 0x18a9c8000 + 263544
5   EventKitUI                      0x000000018f18b5a4 0x18f169000 + 140708
6   EventKitUI                      0x000000018f2a9628 0x18f169000 + 1312296
7   EventKitUI                      0x000000018f2aa3a8 0x18f169000 + 1315752
8   UIKit                           0x000000018843b1b4 0x1880e8000 + 3486132

现在的问题是,为什么我的应用程序需要访问 联系人,但我的应用程序只想访问 read/write 日历?

在崩溃代码中,我打开了一个 EKCalendarChooser,之前我使用 eventStore requestAccessToEntityType:EKEntityTypeEvent completion:(...)

请求用户许可

在我的 Info.plist 我有:
<key>NSCalendarsUsageDescription</key>
<string>Storing of leave data</string>

那么我该如何解决这个问题呢?我必须按照崩溃报告的指示添加 NSContactsUsageDescription 吗?为什么?它是否会导致弹出联系人访问提示,大多数用户可能认为这是一件坏事?

注意:最奇怪的是,在我的 none 设备上可以重现此崩溃,我只有几个用户报告了此类崩溃。

你说的是"only have a couple of users reporting this kind of crash"。当用户在设置应用程序中禁用 calendar/contacts/camera 等时应用程序崩溃,代码直接尝试访问禁用选项。所以在展示之前总是检查授权。 希望对你有帮助。

我刚刚遇到了同样的问题,我相信这是因为 EKCalendarChooser 可以显示您的哪些联系人正在共享日历。我刚刚关闭了所有共享,包括从 iCloud 家庭中删除家庭成员,它不再需要访问通讯录。然后,我尝试使用 EKCalendarChooser 与联系人共享日历,并在我选择联系人后提示获得许可。

这有点麻烦,但解决方案可能是继续添加使用说明,告诉用户需要许可才能显示/修改日历共享详细信息。另一种(也是更痛苦的)替代方法是创建您自己的视图来选择日历。

我不确定这是 Apple 故意的还是一个错误,因为我不知道开发人员是否有任何方法可以从 EKCalendarChooser 视图访问联系信息。