EKEventStore.authorizationStatus显示的对话框(对于:)显然隐藏在叠加层后面

时间:2016-10-05 08:44:55

标签: ios overlay ios10 eventkit

我的应用application(_:didFinishLaunchingWithOptions:launchOptions:)正在创建overlay这样的内容:

window.makeKeyAndVisible()
let launchStoryboard = UIStoryboard(name: "LaunchScreen", bundle: nil)
let overlayView = launchStoryboard.instantiateInitialViewController()!.view!
window.addSubview(overlayView)

Main.storyboard中定义的应用初始视图控制器是UITabBarController,其第一个标签包含UINavigationController。其根视图控制器viewDidLoad()调用EKEventStore.authorizationStatus(for:)

此时应用似乎停滞不前,只有叠加层可见。当我停止应用程序时,会出现一个对话框,询问是否允许应用程序访问日历。它显然隐藏在叠加层下面。

如何确保对话框出现在屏幕的最前方,以便用户有机会回答其实际问题?

更新以下是有关回答问题的一般上下文的更多信息:应用程序代理中代码的原因是 - 除非它在之前的启动时发生 - - 我需要提示用户输入服务器凭据,从服务器获取数据并将这些数据存储在EKEvent中。叠加层支持显示视图控制器以获取用户的凭据(请参阅here)。从服务器收到数据后,将删除叠加层。尽管应用程序生命周期的早期阶段,makeKeyAndVisible仍然需要调用UIApplication.shared.keyWindow才能获得值。该值是展示所述视图控制器以获取凭证所必需的。

1 个答案:

答案 0 :(得分:0)

问题不在于对话框隐藏在叠加层后面,而是我同步调用EKEventStore的{​​{1}}(通过在完成处理程序内发出信号的调用后等待)在requestAccess(to:completion:)内。因此整个应用程序停止运行,甚至没有显示对话框。

解决方案包括异步请求访问。目前以下方案已经足够好了:

  • 实例变量application(_:didFinishLaunchingWithOptions:launchOptions:)如果calendarEvent尚未获得授权,则nil
  • EKCalendar 内部调用
  • requestAccess(to:completion:)
  • application(_:didFinishLaunchingWithOptions:launchOptions:)calendarEvent
  • 的完成处理程序中设置为此EKCalendar
  • 在阅读或写入日历应用程序之前检查requestAccess(to:completion:)
  • 在运行循环周期内调用calendarEvent != nil application(_:didFinishLaunchingWithOptions:launchOptions:)时仍为calendarEvent; app的行为就像日历是空的一样
  • 在运行循环nil的后续循环期间已设置;应用程序实际上只在后续周期中写入日历