我在 iOS 9 中请求日历访问时遇到了一个奇怪的案例。该逻辑在所有 iOS 10 设备上都运行良好。
在我们的例子中,我们在工具栏上添加了一个按钮,用户点击该按钮可将事件添加到他们的日历中。
因此,在用户第一次点击“添加到日历”按钮之前,我们不会检查访问日历的权限。像这样:
@IBAction func addToCalendarPressed(_ sender: UIBarButtonItem) {
eventStore.requestAccess(to: .event, completion: { (granted, error) in
if (granted) && (error == nil) {
// Present the EKEventEditViewController
} else {
// Do something else (show an alert)
}
})
}
在 iOS 10 中,该应用会如您所料显示访问日历的提示。 在 iOS 9.x 中,提示不显示,完成处理程序立即触发,并且 granted 返回 false。
更糟糕的是,即使“日历权限”检查似乎已完成,您也无法进入“设置”并手动启用日历访问权限。就设备而言,该应用从未进行过权限检查,因此该应用从未出现在“设置”>“隐私”>“日历”下。
我已经尝试将检查移动到 viewWillAppear 或 viewDidLoad 而不是等待用户点击按钮,但它仍然不起作用。我已经提取了一些带有事件检查的示例应用程序,它们可以在 iOS 9 中运行。我只是无法弄清楚为什么在这种情况下提示失败。
该应用程序还会检查位置(但不在此屏幕上),这些在 iOS 9 中可以正常工作。
最佳答案
我们发现了问题。不知何故,我们的项目在 info.plist 中没有 CFBundleDisplayName。在开发的后期,在 Xcode 8 中打开项目添加了属性,但将名称留空。
iOS 9 的日历权限和照片权限提示在权限提示中显示应用程序名称时都使用该值。
解决方法是在我们的 info.plist 中简单地为 CFBundleDisplayName 设置 $(PRODUCT_NAME)。
关于ios - EKEventStore requestAccess() 无法在 iOS 9 中显示用户提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41469283/