【问题标题】:EKEventStore requestAccess() is failing to display the user prompt in iOS 9EKEventStore requestAccess() 无法在 iOS 9 中显示用户提示
【发布时间】:2017-05-19 01:35:51
【问题描述】:

我在 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 中,提示不显示,完成处理程序立即触发,并且授权返回 false。

更糟糕的是,即使“日历权限”检查似乎已完成,您也无法进入“设置”并手动启用日历访问权限。就设备而言,该应用从未进行过权限检查,因此该应用永远不会出现在“设置”>“隐私”>“日历”下。

我尝试将检查移到 viewWillAppear 或 viewDidLoad 中,而不是等待用户点击按钮,但它仍然不起作用。我已经提取了一些带有事件检查的示例应用程序,它们在 iOS 9 中工作。我只是无法弄清楚为什么提示在这种情况下会失败。

该应用程序还检查位置(但不在此屏幕上),并且这些在 iOS 9 中正常工作。

【问题讨论】:

    标签: ios iphone swift permissions calendar


    【解决方案1】:

    我们发现了问题。不知何故,我们的项目在 info.plist 中没有 CFBundleDisplayName。在开发的后期,在 Xcode 8 中打开项目添加了该属性,但将名称留空。

    iOS 9 的日历权限和照片权限提示在权限提示中显示应用程序名称时都使用该值。

    解决方法是在 info.plist 中为 CFBundleDisplayName 简单地设置 $(PRODUCT_NAME)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多