微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Swift EventKit的初学者指南C请求权限

Swift EventKit的初学者指南C请求权限

时间:09-12 来源:互联网 点击:

I’ve created a function named checkCalendarAuthorizationStatus(). Here a peek at what it does:

在这个文章提供的示例工程中,我已经创建了一个名为checkCalendarAuthorizationStatus()的函数.

接下来看看它的实现:

ViewController.swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // ... override func viewWillAppear(animated: Bool) { checkCalendarAuthorizationStatus() } func checkCalendarAuthorizationStatus() { let status = EKEventStore.authorizationStatusForEntityType(EKEntityTypeEvent) switch (status) { case EKAuthorizationStatus.NotDetermined: // This happens on first-run requestAccessToCalendar() case EKAuthorizationStatus.Authorized: // Things are in line with being able to show the calendars in the table view loadCalendars() refreshTableView() case EKAuthorizationStatus.Restricted, EKAuthorizationStatus.Denied: // We need to help them give us permission needPermissionView.fadeIn() default: let alert = UIAlertView(title: Privacy Warning, message: You have not granted permission for this app to access your Calendar, delegate: nil, cancelButtonTitle: OK) alert.show() } } // ... }

这里关键的功能是EKEventStore的 authorizationStatusForEntityType实现的.传入的EKEntityTypeEvent用于跟用户日历进行交互.如果我们想要检查他们的提醒的权限,我们将在这里使用EKEntityTypeReminder.

EKAuthorizationStatus的可能值根据switch里的相应的case来执行封装好的方便阅读的独立功能的逻辑代码.

让我们一步步来看一看这些功能.

请求访问日历

正如标题所说的,所有的事情从这里开始.每当我们的应用程序加载和调用authorizationStatusForEntityType的时候,将返回NotDetermined的状态.就是在这一点上我们想请求访问日历.

为了这样做,按照下面的方法定义requestAccessToCalendar函数:

requestAccessToCalendar() class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // … func requestAccessToCalendar() { eventStore.requestAccessToEntityType(EKEntityTypeEvent, completion: { (accessGranted: Bool, error: NSError!) in if accessGranted == true { // Ensure that UI refreshes happen back on the main thread! dispatch_async(dispatch_get_main_queue(), { self.loadCalendars() self.refreshTableView() }) } else { // Ensure that UI refreshes happen back on the main thread! dispatch_async(dispatch_get_main_queue(), { self.needPermissionView.fadeIn() }) } }) } // … }

我们的EKEventStore实例提供了一个名为requestAccessToEntityType的函数.再次将EKEntityTypeEvent作为我们请求访问日历的参数传递.剩余的有趣的部分在我们提供的封装完的闭包里能够找到.

在实现里有三个主要的事情需要注意:

传递到闭包里的两个参数一个是用来说明访问权限是否被授予的Bool类型的,另一个是NSError.

我们需要调用dispatch_async(),并表明我们要调回主队列中执行刷新UI的操作.

self.needPermissionView.fadeIn()作为我操作中的一个UIView的拓展,[Swift中渐入/淡出动画的拓展类(Fade In / Out Animations as Class Extensions in Swift)](https://github.com/andrewcbancroft/EventTracker/tree/ask-for-permission).

授予访问权限!加载日历和刷新表视图

当被允许访问的时候,我们可以调用eventStore实例中的calendarsForEntityType函数,并传递EKEntityTypeEvent去抓取用户日历的数组在我们的表视图中显示.下面就来看看:

loadCalendars() class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // ... var calendars: [EKCalendar]? // ... func loadCalendars() { self.calendars = eventStore.calendarsForEntityType(EKEntityTypeEvent) as? [EKCalendar] } func refreshTableView() { calendarsTableView.hidden = false calendarsTableView.reloadData() } // ... }

拒绝访问–显示需要许可视图

当访问被拒绝的时候,我们需要弹出在故事板场景中创建的“Needs Permission View”.

在这个视图中,上面的函数重新被调用,这样有一个能够让用户直接跳转到我们应

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top