当前位置: 首页 > 科技观察

SwiftEventKit新手指南——请求权限

时间:2023-03-12 11:07:37 科技观察

EventKit提供了一组用于检索和操作用户日历事件和提醒的类。在下面的教程中,我的目标是带您完成使用EventKit构建应用程序的第一步。我的目标是带您完成使用EventKit构建应用程序的第一步。我将展示如何从用户的日历中请求许可,并且我将展示一些处理用户响应的示例(当他们授予访问权限或拒绝时)。示例场景让我们首先提出一个基本场景作为示例教程。假设我们正在构建一个应用程序,现在只有一个视图控制器。我们希望此视图控制器根据用户授权显示日历列表。如果用户拒绝访问,我们将向用户显示一条消息,说明我们的应用程序无法在没有访问权限的情况下运行,并且我们将允许他们通过单击按钮在其设备设置中设置授权访问权限。我已经创建了一个这样的应用程序作为示例——跳转到GitHub查看和探索这个示例的代码。资源Xcode项目示例Storyboard设置Storyboard设置使用EventKit的第一步是为您自己创建一个用户界面来处理用户对“此程序可以访问您的日历吗?”的不同响应。当您的第一个程序启动时,我们将很快详细介绍如何请求此权限。但首先,让我们剖析一下我们如何使用Arrangestoryboardswithviews为给定的权限操作响应做正确的事情。用户可以授予访问权限或拒绝访问权限以通知他们的日历或提醒。我们需要准备好情况。授予访问权限后,表格视图会显示日历列表。今天我很乐观,所以让我们从用户从一开始就授权我们访问他们的日历的情况开始。当用户授予我们访问权限时,我们想要列出日历的表视图。在下一个教程中,我们将着重设置数据源。现在,我们将从工具栏中拖出一个表视图。为了让表格视图填满整个屏幕,我做了几件事。通常,当您从工具栏中拖出一个表视图时,它会填满故事板中的整个场景。在布局中,我向下拖动顶部边缘,直到它“捕捉”到状态栏底部所在的所需行。然后,我设置了以下约束:CenterXCenterYEqualwidthtoSuperviewTopspacetoTopLayoutGuideforheight。如果需要,我创建了一个设置表格视图的简短屏幕截图。可以在以下链接中找到完整的练习:资源截屏视频:设置表格视图完整记录这是这些约束的详细视图,以及什么的视觉效果故事板看起来像一个表格视图。***一点点,在情节提要中我已经将这个表视图的隐藏属性设置为true。根据用户允许或拒绝访问日历后,我将切换表格的可见性,但我认为值得指出的是,我的示例中表格视图的初始状态是隐藏的。拒绝访问时显示“需要许可”?;view但有时,用户拒绝授权访问日历,在意识到这样做将导致基本上停止你的应用程序的所有功能之前,如果你的整个应用程序或只是应用程序的一部分需要访问功能,你需要一种方法来通知用户并给他们一种跳转到用户设置的方法,如果可能的话让用户手动授予访问权限。我在示例项目中的方法是在故事板场景中组织一个新视图,其中包含一个显示说明的标签和一个按钮,单击该按钮可将用户带到我们应用程序的设置屏幕。同样,一些约束涉及使事物在运行时正确显示。我不会在这里详细介绍这个,因为对于执行的每个操作来说,它可能会有一点不同。我要指出的是,此视图的不透明度已设置为0,这样如果用户拒绝授权,我就可以显示淡出效果。我们来看看隐藏“NeedPermissionsView”的场景设置:blob.pngEventStore的作用EventKit的核心是EKEventStore。EKEventStore是事物的中心。创建EKEventStore的实例为开发人员提供了对用户日历和提醒列表API执行各种读取以进行写入操作的能力。与日历交互的视图控制器应该引用EKEventStore的实例。这很容易创建-这是一个示例:ViewController.swiftclassViewController:UIViewController,UITableViewDataSource,UITableViewDelegate{leteventStore=EKEventStore()//...}检查日历的权限一旦我们有一个引用EKEventStore的实例,我们就可以做类似的事情检查用户是否有权访问他们的日历。从这里,我们可以决定是否请求权限,然后决定显示视图(表视图或需要权限的视图)。我们在哪里检查日历授权很重要。我的建议是在每次出现视图时检查(即在viewWillAppear()中),因为用户***授予访问权限,切换设置,访问被拒绝的情况是完全可能的。我们的应用程序需要做出适当的响应。在本文提供的示例项目中,我创建了一个名为检查日历授权状态()。下面看一下它的作用:在本文提供的示例项目中,我创建了一个名为checkCalendarAuthorizationStatus()的函数。接下来看它的实现:ViewController.swiftclassViewController:UIViewController,UITableViewDataSource,UITableViewDelegate{//...overridefuncviewWillAppear(animated:Bool){checkCalendarAuthorizationStatus()}funccheckCalendarAuthorizationStatus(){letstatus=EKEventStore.authorizationStatusForEntityType(EKEntityTypeEvent)switch(status){caseEKAuthorizationStatus.NotDetermined://Thishappensonfirst-runrequestAccessToCalendar()caseEKAuthorizationStatus.Authorized://ThingsareinlinewithbeingabletoshowthecalendarsinthetableviewloadCalendars()refreshTableView()caseEKAuthorizationStatus.Restricted,EKAuthorizationStatus.Denied://WeneedtohelpthemgiveuspermissionneedPermissionView.fadeIn()default:letalert=UIAlertView(title:"PrivacyWarning",消息:“您尚未授予此应用程序访问您的日历的权限”,代表:无,取消按钮Title:"OK")alert.show()}}//...}这里的关键函数是EKEventStore的authorizationStatusForEntityType。传入的EKEntityTypeEvent用于与用户的日历进行交互。如果我们要查看他们的提醒权限,我们会在这里使用EKEntityTypeReminder.EKAuthorizationStatus的可能取值,根据switch中对应的case来执行封装好的易读独立函数的逻辑代码。让我们一步一步地看一下这些功能。请求访问日历如下如标题所说,一切从这里开始。每当我们的应用程序加载并调用authorizationStatusForEntityType时,都会返回NotDetermined状态。正是在这一点上,我们想要请求访问日历。为此,请按照以下方法定义requestAccessToCalendar函数:requestAccessToCalendar()classViewController:UIViewController,UITableViewDataSource,UITableViewDelegate{//...funcrequestAccessToCalendar(){eventStore.requestAccessToEntityType(EKEntityTypeEvent,completion:{(accessGranted:Bool,error:NSError!)EnmainifaccessGranted==truehethen{/dispatch_async(dispatch_get_main_queue(),{self.loadCalendars()self.refreshTableView()})}else{//EnsurethatUIrefreshshappenbackonthemainthread!dispatch_async(dispatch_get_main_queue(),{self.needPermissionView.fadeIn()})}})}//…}我们的EKEventStore实例提供了一个名为requestAccessToEntityType的函数。我们再次将EKEntityTypeEvent作为访问日历的请求传递。其余有趣的部分可以在我们提供的包装闭包中找到。实现中主要有3个需要注意的地方:传递给闭包的两个参数,一个是Bool类型,用来表示是否授予访问权限,另一个是NSError。我们需要调用dispatch_async()并说明要回调到主队列执行刷新UI.self.needPermissionView.fadeIn()的操作在我的操作中作为一个UIView的扩展,[FadeIn/OutAnimationsasClassExtensionsinSwift)](https://github.com/andrewcbancroft/EventTracker/tree/ask-for-permission)。授予访问权限!加载日历和刷新表视图当允许访问时,我们可以在eventStore实例中调用calendarsForEntityType函数并传递EKEntityTypeEvent来获取用户日历数组并将它们显示在我们的表视图中。我们来看看:loadCalendars()classViewController:UIViewController,UITableViewDataSource,UITableViewDelegate{//...varcalendars:[EKCalendar]?//...funcloadCalendars(){self.calendars=eventStore.calendarsForEntityType(EKEntityTypeEvent)as?[EKCalendar]}hidden=falsecalendarsTableView.reloadData()}//...}AccessDenied–DisplayNeedsPermissionView当访问被拒绝时,我们需要弹出storyboard场景中创建的“NeedsPermissionView”。在这种情况下,上述该函数被重新调用,以便用户可以直接跳转到我们应用程序的设置页面,以便他们可以从那里授权日历访问。此按钮连接到IBAction。下面是一个实现IBAction的例子:goToSettingsButtonTapped()!)}//...}这就是EventKit的入门!为了简单复用checkCalendarAuthorizationStatus()函数的其余情况,我简单剖析了请求权限的过程。我鼓励您跳转到Github并在您的应用程序中使用EventKit作为开始,自己深入研究代码。