本文翻譯自Chris Grant的《iOS 9 Day by Day :: Day 1 :: Search APIs》(https://www.shinobicontrols.com/blog/ios9-day-by-day-day1-search-apis)斯议。感謝Chris Grant的辛苦工作膛薛!
iOS 9之前浇雹,我們只能在Spotlight中根據(jù)名字搜索應用程序雏掠。蘋果在iOS 9上引入了搜索API厚满,允許開發(fā)者在應用內(nèi)指定可以被Spotlight索引和呈現(xiàn)的內(nèi)容吆你。
三個API
NSUSerActivity
iOS 8引入NSUserActivity
API是為了Handoff戴甩,而iOS 9允許我們對活動進行搜索舍败。給這些活動設置元數(shù)據(jù)(Metadata)后燕鸽,Spotlight就可以對它們進行索引兄世。所有的活動會跟瀏覽網(wǎng)頁一樣形成一個歷史記錄棧。用戶可以在Sptlight里快速打開已有的活動啊研。
Web Markup
Web Markup允許應用程序?qū)⑺鼈兊膬?nèi)容映射到一個網(wǎng)站御滩,從而在Spotlight里進行索引。用戶不需要在設備上安裝Spotlight里出現(xiàn)的應用党远。蘋果的索引器能夠抓取我們的網(wǎng)站來獲取所需的信息削解,抓取結(jié)果通過Safari和Spotlight提供給用戶。
在沒有安裝應用的設備上進行展示是一個非常重要的特征沟娱,這能增加我們的應用在潛在用戶前的曝光度氛驮。應用程序暴露給搜索API的深度鏈接被存儲在蘋果的云索引服務器上。更多關于Web Markup的信息請查看《Use Web Markup to Make App Content Searchable》济似。
CoreSpotlight
CoreSpotlight是一個新的iOS 9框架矫废,它允許我們在應用程序里對任何內(nèi)容進行索引盏缤。NSUserActivity
也可以用于保存用戶歷史。本質(zhì)上它給我們提供了訪問CoreSpotlight索引的能力蓖扑。
使用Core Spotlight API
NSUserActivity
與Web Markup API用起來要比CoreSpotlight要簡單唉铜。下面我們通過一個簡單的應用來說明Core Spotlight API如何工作。這個程序會顯示一個好友列表律杠,當點擊名字可以看到一個照片潭流。可以在GitHub上找到示例代碼柜去。
![](https://www.shinobicontrols.com/wp-content/uploads/2015/07/friendApp-576x1024.png)
應用程序使用Storyboard創(chuàng)建界面灰嫉,其中包含一個FriendTableViewController
顯示好友列表,而FriendViewController
顯示好友詳情诡蜓。
![](https://www.shinobicontrols.com/wp-content/uploads/2015/07/storyboard.png)
好友信息保存在名為Datasource
的類中熬甫。我們在這個類里創(chuàng)建保存好友信息的數(shù)據(jù)模型,并且包含操作Core Spotlight索引的代碼蔓罚。
首先,我們重寫Datasource
類中的init()
方法瞻颂,在里面創(chuàng)建一個Person
對象的數(shù)組豺谈。這些數(shù)據(jù)可以存儲在數(shù)據(jù)庫或者后臺服務器,這里只是為了演示贡这,所以只是使用一些非常簡單的測試數(shù)據(jù)茬末。
override init() {
let becky = Person()
becky.name = "Becky"
becky.id = "1"
becky.image = UIImage(named: "becky")!
...
people = [becky, ben, jane, pete, ray, tom]
}
一旦數(shù)據(jù)被存放在people
數(shù)組里,Datasource
就以及可以使用了盖矫。
FriendTableViewController
在顯示好友列表前要先創(chuàng)建一個Datasource
對象丽惭。
let datasource = Datasource()
在cellForRowAtIndexPath
函數(shù)中顯示好友名稱:
let person = datasource.people[indexPath.row]
cell?.textLabel?.text = person.name
保存people
入口到Core Spotlight
下面我們使用iOS 9中新的API來將數(shù)據(jù)保存到Core Spotlight中”菜回到Datasource
類责掏,定義一個名為savePeopleToIndex
的函數(shù)。FriendTableViewController
在視圖被加后可以調(diào)用該方法湃望。
在savePeopleToIndex
方法中遍歷people
數(shù)組中的每個人换衬,并且創(chuàng)建對應的CSSearchableItem
,然后將它們存儲在一個臨時數(shù)組searchableItems
中证芭。
let attributeSet = CSSearchableItemAttributeSet(itemContentType: "image" as String)
attributeSet.title = person.name
attributeSet.contentDescription = "This is an entry all about the interesting person called \(person.name)"
attributeSet.tumbnailData = UIImagePNGRepresentation(person.image)
let item = CSSearchableitem(uniqueIdentifier: person.id, domainIdentifier: "com.ios9daybyday.SearchAPIs.people", attributeSet: attributeSet)
searchableItems.append(item)
最后一步是在默認的CSSearchableIndex
上調(diào)用indexSearchableItems
瞳浦。這一步實際上是將數(shù)據(jù)保存到CoreSpotlight,這樣用戶就可以在Spotlight的搜索結(jié)果中看到它們了废士。
![](https://www.shinobicontrols.com/wp-content/uploads/2015/07/searchResults1-576x1024.png)
響應用戶選擇
當用戶看到Spotlight中的搜索結(jié)果后叫潦,有可能會點擊它們。但是這樣做的結(jié)果只是打開了應用的主界面官硝。如果希望在點擊了一個朋友后矗蕊,顯示它的詳細情況四敞,我們還需要做更多的事情。首先需要定制AppDelegate
中通過continueUserActivity
打開應用后執(zhí)行的UIApplicationDelegae
的方法拔妥。
下面是整個方法的實現(xiàn):
func appliction(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
//查找用戶ID
let friendID = userActivity.userInfo?["kCSSearchableItemActivityIdentifier"] as! String
//查找根視圖控制器并且顯示用戶信息
let navigationController = (window?.rootViewController as! UINavigationController)
navigationController.popToRootViewControllerAnimated(false)
let friendTableViewController = navigationController.viewControllers.first as! FriendTableViewController
friendTableViewController.showFriend(friendID)
return true
}
我們看到之前通過indexSearchableItems
函數(shù)存放在CoreSpotlight索引里的數(shù)據(jù)忿危,可以從userActivity.userInfo
字典中獲取到。我們感興趣的數(shù)據(jù)是每個好友的ID没龙,它被作為kCSSearchableItemActivityIdentifier
存儲在索引中铺厨。
一旦我們將userInfo
中的數(shù)據(jù)取出來,就可以去獲取應用程序的導航控制器硬纤,并且跳轉(zhuǎn)到根視圖解滓,然后通過friendTableViewController
里的showFriend
方法顯示好友詳情。結(jié)果如下:
![](https://www.shinobicontrols.com/wp-content/uploads/2015/07/backToSearch-576x1024.png)
在屏幕的左上角有一個“返回搜索”的選項筝家,點擊可以返回搜索界面洼裤。
示例總結(jié)
在上面的示例代碼里,我們可以看到如何將應用程序的數(shù)據(jù)整合到CoreSpotlight
索引溪王。然后Spotlight如何將我們引導到程序中對應的頁面腮鞍。
我們還沒有涉及到如何將數(shù)據(jù)從索引中移除,但總是保持索引中的數(shù)據(jù)為最新的很重要莹菱。如果需要從CoreSpotlight中移除老的數(shù)據(jù)移国,請查看deleteSearchableItemsWithIdentifiers
、deleteSearchableItemsWithDomainIdentifiers
和deleteAllSearchableItemsWithCompletionHandler
方法道伟。
好公民的重要性
將盡可能多的內(nèi)容索引到Spotlight和Safari看起來很不錯迹缀,但這么做之前一定要記得三思。成為一個對iOS生態(tài)系統(tǒng)有益的好公民不止能夠讓你的客戶體驗更好蜜徽,而且會引起蘋果的注意祝懂。它們做了許多事情去跟蹤、分析哪些垃圾制造者拘鞋,并將它們放到最后面砚蓬。
更多信息
關于搜索API的更多信息,建議觀看WWDC的Session 709:《Introducing Search APIs》掐禁。也可以閱讀《NSUserActivity Class Reference》和《CoreSpotlight文檔》怜械。本文的示例代碼可以在Github獲取到。
戴維營教育
戴維營教育(Dive In Education)傅事,潛心做IT職業(yè)教育缕允!緊跟時代潮流,不弄虛作假蹭越!不忘初心障本!
- 官網(wǎng):戴維營教育http://www.diveinedu.com
- 在線視頻:戴維營學院http://v.diveinedu.com
- 問答網(wǎng):潛心俱樂部http://divein.club