成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Swift EventKit的初學者指南–請求權限

移動開發 iOS
EventKit為獲取和操作用戶日歷事件和提醒提供了一系列的類.在下面的教程中,我的目標是帶領你走出利用EventKit建立一個應用程序的第.我的目標是帶領你邁出利用EventKit建立一個應用程序的第一步.我將演示如何向用戶的日歷請求許可,我還將展示幾個處理用戶響應的例子(當他們授予訪問權限,或者拒絕).

[[137222]]

EventKit為獲取和操作用戶日歷事件和提醒提供了一系列的類.在下面的教程中,我的目標是帶領你走出利用EventKit建立一個應用程序的第.我的目標是帶領你邁出利用EventKit建立一個應用程序的***步.我將演示如何向用戶的日歷請求許可,我還將展示幾個處理用戶響應的例子(當他們授予訪問權限,或者拒絕).

Example scenario

場景

讓我們先提出一個基本方案,作為本教程的例子。

假設我們正在構建一個應用程序,現在,有一個單一的視圖控制器。在得到用戶授權允許的情況下,我們希望這個視圖控制器顯示日歷列表。如果用戶拒絕訪問,我們將向用戶展示一個消息,用來說明我們的應用程序在沒有訪問權限時不能運行,我們也將允許他們通過單擊一個按鈕能夠在他們的設備的設置中設置授權訪問.

我已經創建一個那樣的應用程序作為例子–跳到GitHub中查看并研究這個例子的代碼.

資源

Xcode工程示例

Storyboard setup

故事面板設置

你使用EventKit的***步就是需要為自己創建一個用戶界面來處理當你***個程序啟動時用戶對”該程序可以訪問你的日歷嗎?”對出不同的響應,不久,我們將得到如何請求這個許可的詳情.但首先,讓我們來剖析我們如何用對于一個許可操作導致的給定響應能夠做正確的操作的一些視圖來安排我們的故事板.

用戶可以授予訪問權限,也可以拒絕授予訪問權限來通知他們的日歷或者提醒.我們需要為這兩種情況做好準備.

當被授予訪問權限時,tableview顯示日歷列表

我今天持樂觀態度,所以讓我們開始處理從一開始用戶就授予我們訪問他們日歷的權限的情況.

當用戶授予我們訪問權限,我們想列出一個表視圖的日歷.在接下來的教程中,我們將擔心數據源的設置.現在,我們將從實用工具欄中拽一個表格視圖過來.

為了得到填滿整個屏幕的表視圖,我做了幾件事情.通常,當你從實用工具欄中拽一個表視圖過來的時候,它會在故事板中填滿整個場景.在布局中我向下拖頂部邊緣知道它”捕捉”到我所期望的狀態欄底部被定位的那行.然后,我設置了以下限制:

Center X

Center Y

Equal width to Superview

Top space to Top Layout Guide for height.

我已經創建了一個設置表視圖的簡短截屏,如果你想要一個完整的練習,可以參看下面鏈接的內容:

Resources

資源

Screencast: Setting Up a Table View

Full transcript

這里有這些約束的詳細視圖,以及故事板看起來像裝表視圖的視覺效果.

 

 

***一點,在故事板中我已經將這個表視圖的hidden屬性設置為true.根據用戶允許或者拒絕對日歷的訪問后,我將切換表的可見性,但我認為值得指出的是在我例子中表視圖的初始狀態是被隱藏.

訪問被拒絕時的”需要許可”視圖

但有時,用戶拒絕授權訪問日歷,在意識到這樣做將導致基本上停止你應用程序所有的功能之前,如果你的整個應用程序或者只是該應用程序的一部分需要訪問功能,你需要一種方法來告知用戶,并為他們提供一種方法跳到用戶設置,如果可能的話讓用戶手動授予訪問權限.

我在示例項目中的方法是在故事板場景中組織一個新的視圖,該視圖包含一個展示操作說明的標簽和一個點擊后使用戶進入我們應用程序的設置界面的按鈕.

再次,一些約束涉及到在運行時使一些事物正確的顯示.在這里我不會講述這個細節,因為它很可能因為每一個執行操作而有一點不同.

我將指出的意見事情是,這個視圖的透明度已經被設置為0,以便如果用戶拒絕授權,我能夠展示一個逐漸消失的效果.下面就來看看在設置了隱藏“NeedPermissionsView”的場景:

blob.png

Event Store的角色

EventKit的核心是EKEventStore.EKEventStore是事物的中心.創建EKEventStore的一個實例,為開發人員提供了對用戶的日歷和提醒列表中執行各種讀/寫操作的API.

一個與日歷交互的視圖控制器應該有一個引用EKEventStore的實例.這很容易被創建–這里是一個例子:

ViewController.swift

  1. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
  2. let eventStore = EKEventStore() 
  3. // ... 

檢查日歷的授權

一旦我們有了引用EKEventStore的實例,我們可以做像檢查用戶是否授權訪問他們的日歷這樣的事情.根據這里,我們可以做是否需要請求許可的決定,隨后確定要顯示的視圖(表視圖或者需要許可視圖).

我們在哪里檢查日歷授權很重要.我的建議是每次在視圖出現時檢查(即在viewWillAppear()中),因為用戶***授予訪問權限,切換設置,拒絕訪問的情況是完全有可能的.我們的應用程序需要做出適當的響應.

In the example project provided with this article, I’ve created a function named checkCalendarAuthorizationStatus(). Here a peek at what it does:

在這個文章提供的示例工程中,我已經創建了一個名為checkCalendarAuthorizationStatus()的函數.

接下來看看它的實現:

ViewController.swift

  1. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
  2. // ... 
  3. override func viewWillAppear(animated: Bool) { 
  4. checkCalendarAuthorizationStatus() 
  5. func checkCalendarAuthorizationStatus() { 
  6. let status = EKEventStore.authorizationStatusForEntityType(EKEntityTypeEvent) 
  7. switch (status) { 
  8. case EKAuthorizationStatus.NotDetermined: 
  9. // This happens on first-run 
  10. requestAccessToCalendar() 
  11. case EKAuthorizationStatus.Authorized: 
  12. // Things are in line with being able to show the calendars in the table view 
  13. loadCalendars() 
  14. refreshTableView() 
  15. case EKAuthorizationStatus.Restricted, EKAuthorizationStatus.Denied: 
  16. // We need to help them give us permission 
  17. needPermissionView.fadeIn() 
  18. default
  19. let alert = UIAlertView(title: "Privacy Warning", message: "You have not granted permission for this app to access your Calendar", delegate: nil, cancelButtonTitle: "OK"
  20. alert.show() 
  21. // ... 

這里關鍵的功能是EKEventStore的 authorizationStatusForEntityType實現的.傳入的EKEntityTypeEvent用于跟用戶日歷進行交互.如果我們想要檢查他們的提醒的權限,我們將在這里使用EKEntityTypeReminder.

EKAuthorizationStatus的可能值根據switch里的相應的case來執行封裝好的方便閱讀的獨立功能的邏輯代碼.

讓我們一步步來看一看這些功能.

請求訪問日歷

正如標題所說的,所有的事情從這里開始.每當我們的應用程序加載和調用authorizationStatusForEntityType的時候,將返回NotDetermined的狀態.就是在這一點上我們想請求訪問日歷.

為了這樣做,按照下面的方法定義requestAccessToCalendar函數:

  1. requestAccessToCalendar() 
  2. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
  3. // … 
  4. func requestAccessToCalendar() { 
  5. eventStore.requestAccessToEntityType(EKEntityTypeEvent, completion: { 
  6. (accessGranted: Bool, error: NSError!) in 
  7. if accessGranted == true { 
  8. // Ensure that UI refreshes happen back on the main thread! 
  9. dispatch_async(dispatch_get_main_queue(), { 
  10. self.loadCalendars() 
  11. self.refreshTableView() 
  12. }) 
  13. else { 
  14. // Ensure that UI refreshes happen back on the main thread! 
  15. dispatch_async(dispatch_get_main_queue(), { 
  16. self.needPermissionView.fadeIn() 
  17. }) 
  18. }) 
  19. // … 

我們的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去抓取用戶日歷的數組在我們的表視圖中顯示.下面就來看看:

  1. loadCalendars() 
  2. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
  3. // ... 
  4. var calendars: [EKCalendar]? 
  5. // ... 
  6. func loadCalendars() { 
  7. self.calendars = eventStore.calendarsForEntityType(EKEntityTypeEvent) as? [EKCalendar] 
  8. func refreshTableView() { 
  9. calendarsTableView.hidden = false 
  10. calendarsTableView.reloadData() 
  11. // ... 

拒絕訪問–顯示需要許可視圖

當訪問被拒絕的時候,我們需要彈出在故事板場景中創建的“Needs Permission View”.

在這個視圖中,上面的函數重新被調用,這樣有一個能夠讓用戶直接跳轉到我們應用程序的設置頁面中,以便他們能夠從那里授權日歷訪問.這個按鈕連線到了一個IBAction.下面有實現IBAction的例子:

  1. goToSettingsButtonTapped() 
  2. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
  3. // ... 
  4. @IBAction func goToSettingsButtonTapped(sender: UIButton) { 
  5. let openSettingsUrl = NSURL(string: UIApplicationOpenSettingsURLString) 
  6. UIApplication.sharedApplication().openURL(openSettingsUrl!) 
  7. // ... 

結束語

這幾乎完成了使用 Event Kit的開始工作!對于checkCalendarAuthorizationStatus()函數的其余案例簡單的重用,我只是簡單的剖析了請求允許的過程.

我鼓勵你們跳到Github,并且作為你應用程序中利用Event Kit的開始,自己深入研究這些代碼.

責任編輯:chenqingxiang 來源: CocoaChina
相關推薦

2022-04-24 15:21:01

MarkdownHTML

2022-07-22 13:14:57

TypeScript指南

2010-06-13 11:13:38

UML初學者指南

2022-10-10 15:28:45

負載均衡

2021-05-10 08:50:32

網絡管理網絡網絡性能

2023-07-28 07:31:52

JavaScriptasyncawait

2022-03-28 09:52:42

JavaScript語言

2023-07-03 15:05:07

預測分析大數據

2018-10-28 16:14:55

Reactreact.js前端

2010-08-26 15:47:09

vsftpd安裝

2022-09-05 15:36:39

Linux日志記錄syslogd

2023-02-10 08:37:28

2012-03-14 10:56:23

web app

2021-05-06 09:00:00

JavaScript靜態代碼開發

2024-12-25 08:00:00

機器學習ML管道人工智能

2014-04-01 10:20:00

開源Rails

2020-08-16 13:10:46

TensorFlow深度學習數據集

2023-02-19 15:31:09

架構軟件開發代碼

2024-04-28 10:56:34

Next.jsWeb應用搜索引擎優化

2013-04-08 16:35:52

Adobe Edge
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久久久久丝袜 | 久草在线| 欧美美女爱爱视频 | 精品少妇一区二区三区在线播放 | 精品国产一区三区 | 中文字幕在线三区 | 一区二区三区视频在线免费观看 | 久久高清精品 | 中文字幕一区二区三区不卡在线 | 色婷婷一区二区三区四区 | www成年人视频 | 日本成人中文字幕 | 免费看国产一级特黄aaaa大片 | 欧美理论在线观看 | 国产精品一区二区三 | 日韩中文不卡 | 日本精品一区二区在线观看 | 亚洲综合精品 | 久久精品综合 | 国产激情视频在线 | 国产精品视频免费看 | 欧美精品在线一区二区三区 | 黄色成人免费看 | 亚洲精品9999 | 桃色五月 | 国产亚洲网站 | 涩涩视频在线观看免费 | 欧美久久一区二区三区 | 伊人免费在线观看 | 亚洲欧美国产毛片在线 | 91在线一区 | 日韩亚洲欧美一区 | 91精品国产乱码麻豆白嫩 | 亚洲欧美日韩精品久久亚洲区 | 国产9 9在线 | 中文 | 精品婷婷 | 日韩一区二区三区在线观看 | 一区二区在线不卡 | 日本高清不卡视频 | 97免费在线视频 | 亚洲在线中文字幕 |