在 iOS9 之前,你只能在 spotlight 中輸入關(guān)鍵字,比如應(yīng)用名字,搜索到應(yīng)用。在 iOS9 中蘋(píng)果提供了一套 Search APIs。允許開(kāi)發(fā)者選擇應(yīng)用的內(nèi)容,索引起來(lái)供 spotlight 進(jìn)行搜索,同時(shí)可以設(shè)置在 spotlight 中的展示效果,以及點(diǎn)擊之后如何響應(yīng)。
3個(gè)新的搜索相關(guān)API
NSUserActivity
NSUserAcitivity 在介紹 iOS8 的 Handoff 時(shí)引入,iOS9 中允許對(duì)這些 activities 進(jìn)行搜索。你可以提供元數(shù)據(jù)給這些 activities, 這意味著 sptlight 可以索引這些內(nèi)容。類(lèi)似于瀏覽器展示網(wǎng)頁(yè)的做法(你打開(kāi)過(guò)的歷史頁(yè)面被記錄了下來(lái)),用戶可以快速的在 Spotlight中搜索,打開(kāi)最近的 activities。
Web Markup
Web Markup 允許應(yīng)用鏡像自己的內(nèi)容,并在 Spotlight 中建立索引。用戶并不需要應(yīng)用安裝在自己的設(shè)備上來(lái)展示搜索結(jié)果。蘋(píng)果的爬蟲(chóng)自己去抓取你網(wǎng)站上打了 markup 的內(nèi)容,這些內(nèi)容稍后會(huì)提供給 Safari 和 Spotlight。
事實(shí)上,這個(gè)重要的特性,甚至并不需要用戶安裝了你的應(yīng)用在自己的設(shè)備上。這樣可以將你的應(yīng)用展示給更多的潛在用戶。蘋(píng)果的云服務(wù),將你的應(yīng)用的內(nèi)容索引起來(lái),讓你的應(yīng)用和 public Search APIs 保持一個(gè)深度連接。更多關(guān)于Web Markup 的內(nèi)容,可以閱讀蘋(píng)果官方的文檔 《Use Web Markup to Make App Content Searchable》。
CoreSpotlight
CoreSpotlight 是 iOS9 提供的新 Freamework,允許你索引你的應(yīng)用內(nèi)容。當(dāng)使用它的 Api,你可以方便的將你喜歡的數(shù)據(jù),索引起來(lái),NSUserActivity? 幫助存儲(chǔ)用戶的使用歷史。它讓你的應(yīng)用可以底層的和 CoreSpotlight 進(jìn)行連接,將索引存儲(chǔ)在用戶設(shè)備上。
使用 Core Spotlight APIs
NSUserActivity 和 Markup 更簡(jiǎn)單和容易使用一些, CoreSpotlight 則相對(duì)復(fù)雜一些。為了示范Core Spotlight APIs 是怎么工作的,讓我們來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的應(yīng)用。這個(gè)應(yīng)用展示我的一個(gè)朋友列表,點(diǎn)擊朋友的名字可以查看照片。你可以在?Github?上找到源文件。

這個(gè)應(yīng)用有一個(gè)簡(jiǎn)單的 storyboard, 包含兩個(gè) controller,? FriendTableViewController 展示一個(gè)列表,每行顯示一個(gè)朋友的名字, FriendViewController 展示朋友的詳細(xì)信息。

首先,我們重載 Datasource 類(lèi)的 init() 方法,創(chuàng)建和存儲(chǔ)一個(gè)包含 Person 對(duì)象的數(shù)組。你可能希望從數(shù)據(jù)庫(kù)中,或者你的服務(wù)器加載數(shù)據(jù),這里只是為了展示,所以我們選擇創(chuàng)建簡(jiǎn)單的模擬數(shù)據(jù)。

一旦數(shù)據(jù)存儲(chǔ)到了 People 這個(gè)數(shù)組中,Datasource 類(lèi)就準(zhǔn)備好可以用了。
現(xiàn)在數(shù)據(jù)準(zhǔn)備好了,在FriendTableViewController 中創(chuàng)建一個(gè) instance, 給 table 的 cell 來(lái)展示數(shù)據(jù)。

在 cellForRowAtIndexPath 方法中,展示內(nèi)容

現(xiàn)在,模擬數(shù)據(jù)已經(jīng)準(zhǔn)備好了。我們用 iOS9 提供的新 API ?把他們存儲(chǔ)到 Core Spotlight 中。回到Datasource 類(lèi)中,我們創(chuàng)建一個(gè) savePeopleToIndex 方法。這個(gè)可以在FriendTableViewController的視圖加載完成后調(diào)用。

最后一步是調(diào)用 CSSearchableIndex的indexSearchableItems 方法。它會(huì)真正的把 items 存儲(chǔ)到CoreSpotlight 中,這樣用戶就可以搜索和展示出結(jié)果了。

好了,當(dāng)你運(yùn)行一下你的應(yīng)用后,數(shù)據(jù)就索引起來(lái)了,當(dāng)你在 spotlight 中搜索時(shí),朋友的信息出來(lái)了。

響應(yīng)用戶的選中事件
現(xiàn)在用戶看到了搜索的結(jié)果,希望他們會(huì)點(diǎn)擊一下。但是,如果現(xiàn)在他們點(diǎn)擊了,會(huì)怎么樣呢?只會(huì)打開(kāi)你的應(yīng)用。如果你希望跳轉(zhuǎn)至展示用戶點(diǎn)擊的朋友的詳細(xì)信息,你還需要再做一點(diǎn)點(diǎn)工作。當(dāng)用戶用點(diǎn)擊的方式打開(kāi)應(yīng)用時(shí)。,我們可以通過(guò) UIApplicationDelegate 中的continueUserActivity,具體規(guī)定應(yīng)用的行為。

如你所見(jiàn),我們之前,通過(guò) indexSearchableItems 方法,存儲(chǔ)在 CoreSpotligh t中的信息,現(xiàn)在可以讓 userActivity.userInfo 字典使用了。我們唯一感興趣的是 friend ID, 之前我們 items 的 kCSSearchableItemActivityIdentifier 存儲(chǔ)在了索引中。
一旦我們從 userInfo 字典中拿到數(shù)據(jù),我們找到應(yīng)用的 navigation controller, 然后退到root(不用動(dòng)畫(huà),以免用戶察覺(jué)異樣),然后調(diào)用 showFriend 方法。我不詳細(xì)講這些了??傊篌w上就是根據(jù) friend ID, 找到 friend 的詳細(xì)信息的數(shù)據(jù),然后 push 了一個(gè)新的 ViewController 來(lái)展示他。這就是所有的操作了,現(xiàn)在,當(dāng)用戶點(diǎn)擊一個(gè)結(jié)果時(shí),應(yīng)用被打開(kāi),同時(shí)到了這個(gè)朋友的詳細(xì)頁(yè)面。

如你所見(jiàn),在應(yīng)用左上角有一個(gè)“回到搜索”的按鈕,可以讓用戶直接快速的返回到Spotlight,當(dāng)然也可以在應(yīng)用中,點(diǎn)擊標(biāo)準(zhǔn)按鈕,來(lái)切換頁(yè)面。
Demo 總結(jié)
在上面的demo中,我們展示了,多么簡(jiǎn)單就可以把應(yīng)用的內(nèi)容索引到 CoreSpotlight 中,對(duì)于用戶搜索特定內(nèi)容多么有幫助,多么強(qiáng)大的吸引用戶打開(kāi)你的應(yīng)用。
我們沒(méi)有展示如何從索引中移除數(shù)據(jù)。這對(duì)你來(lái)說(shuō)很重要,要時(shí)刻保持 spotlight 中的數(shù)據(jù)是最新的。要了解怎么移除舊的數(shù)據(jù),可以翻閱相關(guān)文檔,查看deleteSearchableItemsWithIdentifiers, deleteSearchableItemsWithDomainIdentifiers 和 deleteAllSearchableItemsWithCompletionHandler這三個(gè)方法。
好公民準(zhǔn)則的重要性
看起來(lái)存儲(chǔ)盡可能多的內(nèi)容到 Spotlight 和 Safari 中是個(gè)好主意,但是希望大家能夠在 iOS 的生態(tài)系統(tǒng)中做個(gè)好公民,遵守讓用戶高興的準(zhǔn)則。并且 Apple 也會(huì)注意到你的行為,他們?cè)O(shè)置了相關(guān)的規(guī)則,一旦發(fā)現(xiàn)惡意的使用 Spotlight,你的內(nèi)容很容易被移到搜索的最后。
延伸閱讀
想了解更多的關(guān)于Search APIs的內(nèi)容,推薦你收看WWDC 2015的 session 709, Introducing Search APIs. 你也會(huì)對(duì)閱讀文檔《NSUserActivity Class Reference》和《documentation for CoreSpotlight》感興趣。
最后,別忘了,如果你想試一試我們剛創(chuàng)建的demo,可以到Githubthub中去下載。
更多內(nèi)容,請(qǐng)移步 iOS9 Day-by-Day.