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

iOS 9 每天了解多一點(diǎn)第1天:搜索API

移動開發(fā)
在 iOS 9 之前,Spotlight 里只能搜索 app 的名字。隨著 iOS 9 新公布的搜索 API,蘋果現(xiàn)在允許開發(fā)者來定制自己 app 里能被搜到的內(nèi)容,搜索結(jié)果在 Spotlight 里顯示的方式,以及用戶點(diǎn)擊搜索結(jié)果的事件。

在 iOS 9 之前,Spotlight 里只能搜索 app 的名字。隨著 iOS 9 新公布的搜索 API,蘋果現(xiàn)在允許開發(fā)者來定制自己 app 里能被搜到的內(nèi)容,搜索結(jié)果在 Spotlight 里顯示的方式,以及用戶點(diǎn)擊搜索結(jié)果的事件。

3 個搜索 API

NSUserActivity

NSUserActivity API 是 iOS 8 介紹新功能 Handoff 時引入的,不過在 iOS 9 里,Spotlight 也能搜索到 activity。你現(xiàn)在可以給 acitivity 提供 metadata,表示這個 activity 是能搜到的。實際用起來是一個歷史記錄棧,跟你平常瀏覽網(wǎng)頁類似。用戶可以從 Spotlight 里快速打開最近使用過的 activity。

Web Markup

Web Markup 的機(jī)制是,app 可以把內(nèi)容鏡像到一個網(wǎng)站上,然后 Spotlight 就會索引里面的內(nèi)容。即使用戶設(shè)備上沒裝這個 app,Spotlight 里也能顯示出搜索結(jié)果。蘋果的爬蟲會在網(wǎng)絡(luò)上持續(xù)爬取,尋找網(wǎng)站上的特定 markup。之后搜索結(jié)果在 Safari 里和 Spotlight 里都會出現(xiàn)。

即使用戶沒裝這個 app,都能搜到結(jié)果,所以這個功能至關(guān)重要,它能給你帶來很多在潛在用戶面前曝光的機(jī)會。你暴露給搜索 API 的 app 里的深度鏈接,會被存到蘋果的云索引上。想進(jìn)一步了解 Web Markup,可以看看蘋果的官方文檔 Use Web Markup to Make App Content Searchable

CoreSpotlight

CoreSpotlight 是一個 iOS 9 的新框架,能讓你索引 app 里的任何內(nèi)容。之前提到的 NSUserActivity 可以用來保存用戶的歷史信息,而這個新的 API 可以索引任何數(shù)據(jù)。它為你接觸到用戶設(shè)備上的 CoreSpotlight 索引提供了必不可少的橋梁。

使用 Core Spotlight API

NSUserActivity 和 Web Markup API 相對來說用起來比較容易,而 CoreSpotlight 就要復(fù)雜一些。為了演示新的 CoreSpotlight API 是怎么用的,我們來做一個簡單的 app 吧。它的功能就是顯示一個朋友列表,點(diǎn)擊朋友名字的時候顯示一張肖像。你可以在GitHub上下載到源代碼,一步一步跟著做。

app截圖

App里有一個簡單的 storyboard,里面有一個FriendTableViewController,顯示簡單的朋友列表;還有一個FriendViewController,顯示每個朋友的細(xì)節(jié)。

storyboard

所有朋友的信息都存在Datasource類里。我們用這個類來創(chuàng)建保存朋友信息的 model,另外,把朋友保存到 Core Spotlight 索引的邏輯也寫在這個類里。

首先,我們重寫Datasource類的init()方法,在這個方法里創(chuàng)建并保存一個Person數(shù)組。可能數(shù)據(jù)一般應(yīng)該是從數(shù)據(jù)庫、服務(wù)器接口等處讀出來的,為了演示起見,我們就簡單寫一些假數(shù)據(jù)吧。

  1. override init () { 
  2.     let becky = Person()  
  3.     becky.name = "Becky"  
  4.     becky.id = "1"  
  5.     becky.image = UIImage(named: "becky")!  
  6.  
  7.     ...  
  8.  
  9.     people = [becky, ben, jane, pete, ray, tom] 

people數(shù)組存好數(shù)據(jù)之后,Datasource就準(zhǔn)備就緒啦!

這邊數(shù)據(jù)已經(jīng)準(zhǔn)備完畢,F(xiàn)riendTableViewController就可以創(chuàng)建一個Datasource的實例,在 table view 要顯示 cell 的時候使用。

  1. let datasource = Datasource() 

在cellForRowAtIndexPath方法里,顯示 cell 內(nèi)容的代碼如下:

  1. let person = datasource.people[indexPath.row] 
  2. cell?.textLabel?.text = person.name 

#p#

把 person 數(shù)據(jù)保存到 Core Spotlight 上

現(xiàn)在有了假數(shù)據(jù),我們就可以用上 iOS 9 的新 API,把它存到 Core Spotlight 上了。回到Datasource類,我們在這個類里定義了一個方法savePeopleToIndex。FriendTableViewController的界面加載完畢后,就可以調(diào)用這個方法。

在這個方法里,我們循環(huán)遍歷people數(shù)組里的每一個 person,為每一個 person 分別創(chuàng)建一個 CSSearchableItem,存到一個臨時數(shù)組searchableItems里。

  1. let attributeSet = CSSearchableItemAttributeSet(itemContentType: "image" as String) 
  2. attributeSet.title = person.name 
  3. attributeSet.contentDescription = "This is an entry all about the interesting person called (person.name)" 
  4. attributeSet.thumbnailData = UIImagePNGRepresentation(person.image) 
  5. let item = CSSearchableItem(uniqueIdentifier: person.id, domainIdentifier:  
  6.     "com.ios9daybyday.SearchAPIs.people", attributeSet: attributeSet) 
  7. searchableItems.append(item) 

最后一步是在默認(rèn)的CSSearchableIndex上調(diào)用indexSearchableItems。這一步就真正把這些 item 存到 CoreSpotlight 里了,此后用戶就可以搜索這些數(shù)據(jù),會在搜索結(jié)果里出現(xiàn)。

  1. CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems,  
  2.                    completionHandler: { error -> Void in 
  3.     if error != nil { 
  4.         print(error?.localizedDescription) 
  5.     } 
  6. }) 

完事兒了!把 app 跑起來,數(shù)據(jù)會實時加入存儲;在 spotlight 里一搜,就能搜到你的朋友啦~

搜索結(jié)果

響應(yīng)用戶點(diǎn)擊

現(xiàn)在用戶能在 Spotlight 里看到你的搜索結(jié)果了,但愿他們會點(diǎn)上一點(diǎn)!但如果他們真點(diǎn)了,會發(fā)生什么呢?就此刻而言,點(diǎn)擊搜索結(jié)果只會跳轉(zhuǎn)打開你的 app。如果你想要展示出用戶剛點(diǎn)擊的那位朋友,還得再寫點(diǎn)代碼。我們可以在 app 的AppDelegate的 continueUserActivity UIApplicationDelegate 方法里指定 app 從搜索結(jié)果打開之后的行為。

以下是這整個方法的代碼:

  1. func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool { 
  2.     // Find the ID from the user info 
  3.     let friendID = userActivity.userInfo?["kCSSearchableItemActivityIdentifier"] as! String 
  4.  
  5.     // Find the root table view controller and make it show the friend with this ID 
  6.     let navigationController = (window?.rootViewController as! UINavigationController) 
  7.     navigationController.popToRootViewControllerAnimated(false
  8.     let friendTableViewController = navigationController.viewControllers.first as! FriendTableViewController 
  9.     friendTableViewController.showFriend(friendID) 
  10.  
  11.     return true 

如代碼所示,之前我們用indexSearchableItems方法存在 CoreSpotlight 索引里的信息,現(xiàn)在可以用userActivity.userInfo獲取到。這里我們唯一感興趣的就是朋友的 ID,這個 ID 我們保存在索引 item 的kCSSearchableItemActivityIdentifier里了。

我們從userInfo字典里提取出 ID 之后,下一步是獲取到 app 的 navigation controller,pop 到首頁(不帶動畫,這樣用戶就不會看到 pop 的過程),然后調(diào)用friendTableViewController的showFriend方法。這個方法的細(xì)節(jié)我就不多說了,總之就是根據(jù) ID 從 datasource 里找到對應(yīng)的朋友,然后 push 進(jìn)來一個新的 view controller。收工啦!現(xiàn)在當(dāng)用戶點(diǎn)擊 spotlight 里的朋友時,他們會看到下面的畫面:

點(diǎn)擊搜索結(jié)果

截圖上可以看到,app的左上角有一個“Back to Search”按鈕。點(diǎn)擊這個按鈕會直接回到搜索結(jié)果頁面,就是剛才點(diǎn)擊朋友名字的那個頁面。用戶還可以點(diǎn)擊標(biāo)準(zhǔn)的返回按鈕,接著在 app 里面逛。

Demo 小結(jié)

在上面這個 demo 里,我們展示了整合 app 的數(shù)據(jù)與CoreSpotlight索引如此簡單,引導(dǎo)用戶打開 app 的功能如此強(qiáng)大,以及對用戶搜索特定內(nèi)容如此有幫助。

不過,我們并沒提到怎么從索引里刪除數(shù)據(jù)。這一點(diǎn)還是很重要的,應(yīng)該勤于更新索引的數(shù)據(jù)。想進(jìn)一步了解如何從 CoreSpotlight 刪除舊數(shù)據(jù),可以看看 deleteSearchableItemsWithIdentifiers,deleteSearchableItemsWithDomainIdentifiers 以及 deleteAllSearchableItemsWithCompletionHandler 方法。

有節(jié)操的重要性

盡管讓 Spotlight 和 Safari 索引到的 app 內(nèi)容似乎越多越好,在大肆往里灌水之前還是要三思。在 iOS 生態(tài)系統(tǒng)里保持節(jié)操,不僅能讓用戶更舒服,而且蘋果也盯著呢。蘋果花了很多心思來保證搜索結(jié)果是真正相關(guān)的,他們會跟蹤搜索結(jié)果點(diǎn)擊率,而灌水會導(dǎo)致被挪到搜索結(jié)果的末尾。

了解更多

想要進(jìn)一步了解新的搜索 API,推薦看一看 WWDC session 709,介紹搜索 API。你也可能會對 NSUserActivity Class ReferenceCoreSpotlight 文檔感興趣。別忘了,如果想要試試本文描述的 demo,可以在GitHub上下到源碼。

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

2015-07-21 16:43:13

IOSUI

2015-08-03 10:03:09

iosuistack vie

2015-07-27 09:04:33

ios9

2015-08-07 11:07:21

IOS9code covera每天積累一點(diǎn)

2019-06-17 06:18:27

邊緣計算物聯(lián)網(wǎng)霧計算

2019-06-26 05:14:32

性能優(yōu)化程序系統(tǒng)

2011-03-15 10:41:05

內(nèi)部類

2024-07-29 00:00:00

C程序色彩文本

2019-04-16 15:05:59

ServerlessIT基礎(chǔ)局域網(wǎng)

2020-09-25 17:44:43

人工智能 倫敦時裝學(xué)院

2010-05-20 15:29:43

優(yōu)化IIS

2016-04-05 10:12:58

HiveSQLHadoop

2024-12-18 18:29:12

2012-08-30 14:17:42

IBMdw

2018-01-09 21:47:17

2013-01-08 10:06:43

創(chuàng)業(yè)創(chuàng)業(yè)方法

2025-05-29 00:00:00

UI 庫前端模塊化

2012-03-27 08:49:19

Json

2009-09-14 19:44:27

LINQ To SQL

2009-07-09 15:09:05

JDK卸載
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 免费三级网站 | 亚洲精品免费在线 | 中文字幕一区二区三区日韩精品 | 欧美久久一区二区 | 一级一级毛片免费看 | 欧美一区二区精品 | 免费的av网站 | www4虎| 国产一区| 一区二区三区国产在线观看 | 韩国av一区二区 | 日韩精品一区二区三区视频播放 | 国产视频91在线 | 久久一区二区视频 | 国产一区二区在线免费观看 | 久久久久国产 | 久久不卡区| 精品国产aⅴ | 国产日韩欧美中文字幕 | 欧美综合国产精品久久丁香 | 91精品国产一区二区三区 | 国产精品国产馆在线真实露脸 | 欧美一级在线视频 | 成人免费一区二区三区牛牛 | 久久精品综合网 | 狠狠操狠狠操 | 亚洲精品国产一区 | 人人草天天草 | 免费在线观看一级毛片 | 免费视频一区二区 | 国产精品二区三区 | 欧美日韩视频在线 | 午夜爽爽爽男女免费观看影院 | 乳色吐息在线观看 | 中文一区二区 | 欧美在线一二三 | 成人精品国产一区二区4080 | 日韩一区不卡 | 91精品一区二区 | 一级特黄在线 | 精品国产精品三级精品av网址 |