偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

ios9學(xué)習(xí)系列:Search API

移動(dòng)開發(fā)
在WWDC 2015會(huì)議上,蘋果官方公布了iOS9。除開許多新的特性和增強(qiáng)功能,這次升級(jí)也給了開發(fā)者們一個(gè)機(jī)會(huì)讓他們的app里的內(nèi)容能通過Spotlight搜索功能被發(fā)現(xiàn)和使用。在iOS9中可用的新APIs允許你去索引APP里面的內(nèi)容或者界面狀態(tài),通過Spotlight來讓用戶使用。

[[146026]]

介紹

在WWDC 2015會(huì)議上,蘋果官方公布了iOS9。除開許多新的特性和增強(qiáng)功能,這次升級(jí)也給了開發(fā)者們一個(gè)機(jī)會(huì)讓他們的app里的內(nèi)容能通過Spotlight搜索功能被發(fā)現(xiàn)和使用。在iOS9中可用的新APIs允許你去索引APP里面的內(nèi)容或者界面狀態(tài),通過Spotlight來讓用戶使用。 這些新的搜索APIs的三大組件為:

  • NSUserActivity 類, 它是為可被看見的APP內(nèi)容而設(shè)計(jì)的

  • Core Spotlight 框架, 為任何APP內(nèi)容而設(shè)計(jì)的 

  • web markup,為這一類型的APP設(shè)計(jì)的,就是APP的內(nèi)容在某個(gè)網(wǎng)站上有鏡像

在這個(gè)教程里,我將會(huì)向你展示可以怎樣在你的應(yīng)用中使用NSUserActivity類以及 Core Spotlight 框架。

準(zhǔn)備工作

這個(gè)教程需要你運(yùn)行在Xcode7 和OSX 10.10系統(tǒng)或更后的系統(tǒng)。為了緊跟我的步伐,還需要你去GitHub上下載初始工程。

1.使用 NSUserActivity

在這個(gè)教程的開始部分,我將會(huì)給你展示怎樣通過NSUserActivity類來索引一個(gè)APP里的內(nèi)容。這個(gè)API也是在Handoff里使用的那一個(gè),handoff是在去年iOS8中介紹的功能,它用于保存和復(fù)原一個(gè)應(yīng)用的當(dāng)前狀態(tài)。

如果你之前沒有使用過NSUserActivity,那么我建議你在開始這個(gè)教程之前先閱讀我的這篇教程 ,它覆蓋了Handoff和NSUserActivity的基礎(chǔ)內(nèi)容。

在開始寫代碼之前,打開初始工程,然后在iOS模擬器上或者測(cè)試機(jī)上運(yùn)行APP。在這個(gè)階段,你會(huì)看到這個(gè)APP簡(jiǎn)單地展示了一個(gè)有著4個(gè)TV節(jié)目的列表,以及每個(gè)節(jié)目的詳細(xì)頁面。

001.png002.png

首先,打開工程然后到DetailViewController.swift文件。把DetailViewController類里configureView方法里的內(nèi)容替換為如下:

 
  1. func configureView() { 
  2.     // Update the user interface for the detail item. 
  3.     if self.nameLabel != nil && self.detailItem != nil { 
  4.         self.nameLabel.text = detailItem.name 
  5.         self.genreLabel.text = detailItem.genre 
  6.            
  7.         let dateFormatter = NSDateFormatter() 
  8.         dateFormatter.timeStyle = .ShortStyle 
  9.         self.timeLabel.text = dateFormatter.stringFromDate(detailItem.time) 
  10.            
  11.         let activity = NSUserActivity(activityType: "com.tutsplus.iOS-9-Search.displayShow"
  12.         activity.userInfo = ["name": detailItem.name, "genre": detailItem.genre, "time": detailItem.time] 
  13.         activity.title = detailItem.name 
  14.         var keywords = detailItem.name.componentsSeparatedByString(" "
  15.         keywords.append(detailItem.genre) 
  16.         activity.keywords = Set(keywords) 
  17.         activity.eligibleForHandoff = false 
  18.         activity.eligibleForSearch = true 
  19.         //activity.eligibleForPublicIndexing = true 
  20.         //activity.expirationDate = NSDate() 
  21.    
  22.         activity.becomeCurrent() 
  23.     } 

在view controller里,配置label的代碼是不變的,讓我們來一步一步分析 user activity 代碼:

  1. 使用唯一標(biāo)識(shí)符 com.tutsplus.iOS-9-Search.displayShow創(chuàng)建一個(gè)新的NSUserActivity對(duì)象。 這個(gè)工程已經(jīng)被配置成確保使用這個(gè)標(biāo)識(shí)符時(shí)要保證它不會(huì)被改變。

  2. 然后為這個(gè)user activity 分配一個(gè)userInfo字典。它將會(huì)在后面被用來修復(fù)應(yīng)用的狀態(tài)。

  3. 給activity的title屬性賦予了一個(gè)字符串值。這就是將會(huì)在Spotlight 搜索結(jié)果里出現(xiàn)的內(nèi)容。

  4. 為了確??伤褜さ膬?nèi)容不僅止限于應(yīng)用的標(biāo)題,你也要提供一系列的關(guān)鍵字。在上面的代碼段中,關(guān)鍵字列表中包含了每個(gè)節(jié)目的名字以及它的類型。

  5. 接下來,你向NSUserActivity對(duì)象賦予一些屬性來告訴操作系統(tǒng)你想讓這個(gè)user activity用來做什么。在這個(gè)教程中,我們只是查看搜索組件的API 因此我們把Handoff禁用掉然后把search開啟。

  6. 最后, 調(diào)用user activity的becomeCurrent方法,就在此時(shí)它自動(dòng)的被加入到了設(shè)備的搜索結(jié)果索引中。

在以上的實(shí)現(xiàn)代碼中,你可能注意到了兩條被注釋的語句。盡管我們不會(huì)在這個(gè)教程中使用這些屬性,但是了解每個(gè)屬性是做什么用的也是很重要的。

  1. 在上面的實(shí)現(xiàn)代碼中,每個(gè)節(jié)目的user activity和 搜索結(jié)果都是僅當(dāng)應(yīng)用曾經(jīng)被打開過時(shí)而創(chuàng)建的。當(dāng)你讓你的user activity有eligibleForPublicIndexing屬性時(shí),Apple就開始從用戶的搜索結(jié)果當(dāng)中觀察這個(gè)特殊activity的作用和交互了。如果這個(gè)搜索結(jié)果是被很多用戶所使用的,Apple就提升這個(gè)user activity到它自己的云索引(cloud index)中。一旦這個(gè)user activity在這個(gè)云索引中了,它就可以被所有安裝過你的應(yīng)用的人搜索得到,而不管他們是否有打開過那些內(nèi)容。這個(gè)屬性只有當(dāng)且僅當(dāng)activities能被你應(yīng)用的所有用戶使用時(shí)才能被設(shè)置為true。

  2. 一個(gè)user activity 可以有一個(gè)可選的屬性expirationDate。 當(dāng)這個(gè)屬性被設(shè)置時(shí),你的user activity 只會(huì)在設(shè)置的時(shí)期之前才會(huì)展示在搜索結(jié)果里。

現(xiàn)在你已經(jīng)知道了怎樣創(chuàng)建一個(gè)可以在Spotlight中展示搜索結(jié)果的NSUserActivity,現(xiàn)在就來實(shí)驗(yàn)吧。編譯運(yùn)行你的APP,然后在你的應(yīng)用中打開一些節(jié)目。做完這些后,返回到home頁面(在iOS 模擬器中按 Command-Shift-H)然后向下掃或者滑動(dòng)到最左邊的屏幕就可以拉起搜索框視圖。

在搜索框里填入某個(gè)你已經(jīng)打開了的節(jié)目的標(biāo)題,你將會(huì)在搜索結(jié)果里看到它被顯示出來,如下圖。

Simulator Screen Shot 10 Jul 2015, 12.10.05 PM.png

另外的,輸入某個(gè)你已經(jīng)打開了的節(jié)目的類別。歸功于你已經(jīng)對(duì)user activity賦予了關(guān)鍵字信息,這也會(huì)導(dǎo)致節(jié)目將會(huì)在搜索結(jié)果列表里被列舉出來。

02.png

你應(yīng)用的內(nèi)容被操作系統(tǒng)正確的索引出來并且結(jié)果就展現(xiàn)在Spotlight 里。但是,當(dāng)你輕觸一個(gè)搜索結(jié)果時(shí),你的應(yīng)用并不會(huì)帶領(lǐng)用戶進(jìn)入他們想要的搜索結(jié)果里面去,而只是簡(jiǎn)單地拉起這個(gè)應(yīng)用。

#p#

幸運(yùn)的是,通過 Handoff, 你可以利用NSUserActivity類來復(fù)原應(yīng)用里的正確狀態(tài)。為了使這成為可能我們需要實(shí)現(xiàn)兩個(gè)方法。

如下所示在AppDelegate類里實(shí)現(xiàn) application(_:continueUserActivity:restorationHandler:) 方法:

  1. func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool { 
  2.     let splitController = self.window?.rootViewController as! UISplitViewController 
  3.     let navigationController = splitController.viewControllers.first as! UINavigationController 
  4.     navigationController.topViewController?.restoreUserActivityState(userActivity) 
  5.     return true 
接下來,在MasterViewController類里實(shí)現(xiàn)restoreUserActivityState方法: 
  1. override func restoreUserActivityState(activity: NSUserActivity) { 
  2.     if let name = activity.userInfo?["name"] as? String, 
  3.         let genre = activity.userInfo?["genre"] as? String, 
  4.         let time = activity.userInfo?["time"] as? NSDate { 
  5.         let show = Show(name: name, genre: genre, time: time) 
  6.         self.showToRestore = show 
  7.            
  8.         self.performSegueWithIdentifier("showDetail", sender: self) 
  9.     } 
  10.     else { 
  11.         let alert = UIAlertController(title: "Error", message: "Error retrieving information from userInfo:\n\(activity.userInfo)", preferredStyle: .Alert) 
  12.         alert.addAction(UIAlertAction(title: "Dismiss", style: .Cancel, handler: nil)) 
  13.            
  14.         self.presentViewController(alert, animated: true, completion: nil) 
  15.     } 

在寫這篇文章的當(dāng)下,Xcode7(Beta3)的最新版本有一個(gè)問題那就是一個(gè)用于修復(fù)的user activity的 userInfo 屬性會(huì)變成空。這就是為什么我會(huì)處理errors以及展示一個(gè)userInfo(被操作系統(tǒng)返回的)信息的警告。

再次編譯運(yùn)行你的APP,搜索一個(gè)節(jié)目。當(dāng)你在搜索結(jié)果里輕觸一個(gè)節(jié)目時(shí),APP將會(huì)直接將你帶到詳細(xì)信息的view controller并展示出你選擇的節(jié)目的當(dāng)前信息。

03.png

2.使用Core Spotlight 框架

另外一些在iOS9中能使你的內(nèi)容可被用戶搜索得到的APIs就是Core Spotlight 框架。這個(gè)框架有一個(gè)類似數(shù)據(jù)庫的設(shè)計(jì)并且能夠給你提供更多的關(guān)于你想被搜索到的內(nèi)容的信息。

在你可以使用Core Spotlight框架之前,我們需要把這個(gè)工程同這個(gè)框架鏈接起來。在Project Navigator中,選中這個(gè)工程然后打開最上面的Build Phases欄目。接下來,展開 Link Binary With Libraries 區(qū)域然后點(diǎn)擊加號(hào)按鈕。在彈出的菜單中,搜索 CoreSpotlight 然后把你的工程跟這個(gè)框架鏈接起來。重復(fù)這些步奏來鏈接 MobileCoreServices 框架。

Screen Shot 2015-07-10 at 4.44.47 PM.png

接下來,為了確保我們的APP提供的搜索的結(jié)果確實(shí)來自于Core Spotlight,在你的測(cè)試機(jī)或者模擬器上刪除你的應(yīng)用然后在DetailViewController類中注釋掉下面的這條語句: 

  1. activity.becomeCurrent() 

最后,打開MasterViewController.swift然后在Show結(jié)構(gòu)體定義之前添加下面的語句: 

  1. import CoreSpotlight  
  2. import MobileCoreServices 

接下來,在MasterViewController類的viewDidLoad方法里添加下面的代碼:

 
  1. var searchableItems: [CSSearchableItem] = [] 
  2. for show in objects { 
  3.     let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String) 
  4.        
  5.     attributeSet.title = show.name 
  6.        
  7.     let dateFormatter = NSDateFormatter() 
  8.     dateFormatter.timeStyle = .ShortStyle 
  9.        
  10.     attributeSet.contentDescription = show.genre + "\n" + dateFormatter.stringFromDate(show.time) 
  11.        
  12.     var keywords = show.name.componentsSeparatedByString(" "
  13.     keywords.append(show.genre) 
  14.     attributeSet.keywords = keywords 
  15.        
  16.     let item = CSSearchableItem(uniqueIdentifier: show.name, domainIdentifier: "tv-shows", attributeSet: attributeSet) 
  17.     searchableItems.append(item) 
  18.    
  19. CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems) { (error) -> Void in 
  20.     if error != nil { 
  21.         print(error?.localizedDescription) 
  22.     } 
  23.     else { 
  24.         // Items were indexed successfully 
  25.     } 

在驗(yàn)證這段代碼之前,我們先過一遍for循環(huán)里的每一步。

  1. 你創(chuàng)建一個(gè) CSSearchableItemAttributeSet 對(duì)象, 給這個(gè)項(xiàng)目傳入一個(gè)內(nèi)容類型(content type)。例如,如果你的搜索結(jié)果鏈接到一張照片,那么你就應(yīng)該傳入kUTTypeImage常量。 

  2. 給屬性組合(attribute set)的title屬性賦予一個(gè)節(jié)目的名字。就如同 NSUserActivity一樣,這個(gè)標(biāo)題就是將在搜索結(jié)果列表的最頂端出現(xiàn)的那個(gè)。 

  3. 接下來,創(chuàng)建一個(gè)描述性字符串然后把它賦值給可搜索的屬性組合(attribute set)的contentDescription屬性。這個(gè)字符串將會(huì)在Spotlight中搜索結(jié)果的標(biāo)題下方出現(xiàn)。 

  4. 就像在NSUserActivity當(dāng)中創(chuàng)建的那樣,創(chuàng)建一個(gè)來自于搜索結(jié)果的關(guān)鍵字?jǐn)?shù)組。 

  5. 最后,創(chuàng)建一個(gè)有著唯一項(xiàng)目標(biāo)識(shí)符的,唯一域標(biāo)識(shí)符(用來聚集CSSearchableItem項(xiàng)目)的,和一個(gè)屬性組合(attribute set)的CSSearchableItem,與NSUserActivity不同的是, NSUserActivity 從搜索結(jié)果中返回user activity, 當(dāng)你的搜索結(jié)果被用戶選中時(shí),為CSSearchableItem設(shè)置的所有唯一標(biāo)識(shí)符信息就是你可以從操作系統(tǒng)那里得到的唯一信息。 你需要利用這些標(biāo)識(shí)符來復(fù)原你的應(yīng)用回到正確狀態(tài)。

一旦你為每個(gè)TV節(jié)目創(chuàng)建了一個(gè)CSSearchableItem項(xiàng)目時(shí),你利用 indexSearchableItems(_:completionHandler:) 方法和默認(rèn)的CSSearchableIndex對(duì)象來索引它們。

編譯運(yùn)行你的APP,你所有的節(jié)目將會(huì)被Spotlight索引到。去到搜索頁面然后搜索其中一個(gè)節(jié)目。

04.png

Core Spotlight搜索結(jié)果會(huì)被跟NSUserActivity里一樣的那個(gè)方法所處理,但是過程有一些輕微區(qū)別。當(dāng)一個(gè)CSSearchableItem項(xiàng)目在搜索結(jié)果里被選中時(shí),系統(tǒng)為你創(chuàng)建一個(gè)包含選中項(xiàng)目的唯一標(biāo)識(shí)符信息的NSUserActivity對(duì)象。

在你的 app delegate的 application(_:continueUserActivity:restorationHandler:)方法中,可以利用下面的實(shí)現(xiàn)代碼從Core Spotlight 搜索結(jié)果中獲取你要的信息:

 
  1. if userActivity.activityType == CSSearchableItemActionType { 
  2.     if let identifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String { 
  3.            
  4.         //  Use identifier to display the correct content for this search result 
  5.            
  6.         return true 
  7.     } 

使用Core Spotlight框架來索引APP內(nèi)容的一個(gè)良好的實(shí)踐就是當(dāng)項(xiàng)目不再被需要的時(shí)候刪除它們。CSSearchableIndex類提供了三種方法來刪除可搜索項(xiàng)目: 

  • deleteAllSearchableItemsWithCompletionHandler(:) 

  • deleteSearchableItemsWithDomainIdentifiers(:completionHandler:) 

  • deleteSearchableItemsWithIdentifiers(_:completionHandler:)

#p#

作為一個(gè)示例,添加下面代碼到MasterViewController類里的viewDidLoad方法:

  1. CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) { (error) -> Void in 
  2.     if error != nil { 
  3.         print(error?.localizedDescription) 
  4.     } 
  5.     else { 
  6.         // Items were deleted successfully 
  7.     } 

再一次的編譯運(yùn)行你的應(yīng)用。當(dāng)你想要搜索任何節(jié)目時(shí),不會(huì)有任何結(jié)果返回回來,因?yàn)樗鼈円呀?jīng)在索引當(dāng)中被刪除掉了。

3.聯(lián)合NSUserActivity和 Core Spotlight

另一個(gè)在iOS9中NSUserActivity類的新增特性就是contentAttributeSet屬性。這個(gè)屬性允許你賦予一個(gè)CSSearchableItemAttributeSet, 正如你先前創(chuàng)建的那個(gè)。這個(gè)屬性集合(attribute set)允許NSUserActivity對(duì)象的搜索結(jié)果可以展示如同 Core Spotlight搜索結(jié)果那樣的相同數(shù)量的詳細(xì)信息。

首先向DetailViewController.swift中最頂部添加下面的imports: 

  1. import CoreSpotlight  
  2. import MobileCoreServices 

接下來,用下面的實(shí)現(xiàn)代碼更新DetailViewController類的configureView方法:

 
  1. func configureView() { 
  2.     // Update the user interface for the detail item. 
  3.     if self.nameLabel != nil && self.detailItem != nil { 
  4.         self.nameLabel.text = detailItem.name 
  5.         self.genreLabel.text = detailItem.genre 
  6.            
  7.         let dateFormatter = NSDateFormatter() 
  8.         dateFormatter.timeStyle = .ShortStyle 
  9.         self.timeLabel.text = dateFormatter.stringFromDate(detailItem.time) 
  10.            
  11.         let activity = NSUserActivity(activityType: "com.tutsplus.iOS-9-Search.displayShow"
  12.         activity.userInfo = ["name": detailItem.name, "genre": detailItem.genre, "time": detailItem.time] 
  13.         activity.title = detailItem.name 
  14.         var keywords = detailItem.name.componentsSeparatedByString(" "
  15.         keywords.append(detailItem.genre) 
  16.         activity.keywords = Set(keywords) 
  17.         activity.eligibleForHandoff = false 
  18.         activity.eligibleForSearch = true 
  19.         //activity.eligibleForPublicIndexing = true 
  20.         //activity.expirationDate = NSDate() 
  21.            
  22.         let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String) 
  23.         attributeSet.title = detailItem.name 
  24.         attributeSet.contentDescription = detailItem.genre + "\n" + dateFormatter.stringFromDate(detailItem.time) 
  25.    
  26.         activity.becomeCurrent() 
  27.     } 

最后一次編譯運(yùn)行APP,然后打開一些節(jié)目。當(dāng)你搜索一個(gè)節(jié)目時(shí),你將會(huì)看到你的結(jié)果,伴隨NSUserActivity的創(chuàng)建,擁有和Core Spotlight 搜索結(jié)果相同級(jí)別的細(xì)節(jié)信息。

 05.png

總結(jié)

在這個(gè)教程中,你學(xué)習(xí)到了使用NSUserActivity類和 Core Spotlight框架來使你的應(yīng)用里的內(nèi)容可被iOS Spotlight 索引。我也向你展示了怎樣使用這兩個(gè)APIs在你的應(yīng)用里索引內(nèi)容以及當(dāng)一個(gè)搜索結(jié)果被用戶選中時(shí)怎樣復(fù)原你的應(yīng)用的狀態(tài)。

在iOS9中介紹的新的搜索APIs使用都很方便而且可以使你的應(yīng)用中的內(nèi)容更簡(jiǎn)單的被用戶發(fā)現(xiàn)和接觸。一如既往的,如果你有任何評(píng)論或問題,在下方的評(píng)論框里留言。

責(zé)任編輯:倪明 來源: Tuts+
相關(guān)推薦

2015-09-16 09:55:12

ios9學(xué)習(xí)UIKit Dynam

2015-09-25 09:44:24

ios9MapkitTrans

2015-08-24 09:24:21

ios學(xué)習(xí)contacts fr

2016-03-18 11:19:57

ios9replaykit入門

2015-08-24 09:19:05

ios9split scree

2015-08-20 09:19:46

ios9uistackview

2015-07-16 12:59:19

IOS9UIDynamics

2015-10-16 14:27:29

iOS9collectionV特性

2015-09-23 10:30:44

iOS 9UIStack Vie

2015-07-02 17:32:28

iOS 9蘋果

2015-09-09 15:51:54

2015-11-11 10:17:15

ios9聯(lián)系人框架干貨

2015-09-10 09:31:43

IOS9IOS9.1

2015-09-16 09:02:10

IOS9新功能搜索業(yè)務(wù)

2015-07-27 09:04:33

ios9

2015-10-20 09:36:52

蘋果iOS 9字體

2015-05-19 09:51:57

WWDCiOS9

2015-10-12 11:26:12

iOS 9適配

2015-07-13 16:56:40

IOS 9適配教程

2015-08-03 10:03:09

iosuistack vie
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)