iOS9中支持為app中的內容做索引以支持spotlight搜索,感覺是個很有新意的功能。需要提到的是這些索引是存在本地設備中的,不會同步到icloud中,更換了設備就沒有了。
效果就是這樣:
創建支持搜索的內容
支持搜索的內容的類是CSSearchableItem。
可以展示的屬性有標題,一段描述文字,還有縮略圖。這裡建議給每個item設置一個過期時間(expirationDate)。
首先創建表示一個配置展示內容的對象CSSearchableItemAttributeSet
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String) // Add metadata that supplies details about the item. attributeSet.title = "July Report.Numbers" attributeSet.contentDescription = "iWork Numbers Document" attributeSet.thumbnailData = DocumentImage.jpg
attributeSet也支持電話號碼,和地理坐標。右邊會有對應的動作,如果是支持導航會有一個箭頭。(因為我的app裡不需要這功能,我自己沒有試過)
attributeSet.phoneNumbers; attributeSet.latitude; attributeSet.longitude;
創建CSSearchableItem
uniqueIdentifier相當於這條數據的id。domainIdentifier則表示相關的域。蘋果還提供了一組api對這些索引進行修改刪除操作,domainIdentifier可以當做參數,比如可以講一個域下的所有索引刪除。
let item = CSSearchableItem(uniqueIdentifier: "1", domainIdentifier: "file-1", attributeSet: attributeSet)
將CSSearchableItem添加至系統
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { error in if error != nil { print(error?.localizedDescription) } else { print("Item indexed.") } }
tips
大部分的app可能還要兼容iOS8,這裡介紹下swift下的判斷方法。
如果是在一個方法裡要使用iOS9的api,使用下面來判斷(xcode7也會提醒你)。
if #available(iOS 9.0, *) { }
如果是自己寫的一整個方法想表示只在iOS9可用,用下面的關鍵字加在方法頭表示
@available(iOS 9.0, *)
直接貼我的項目代碼了。
用戶搜索後選中打開app的處理
在app delegate裡添加這個回調就好了。
func application(UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: [AnyObject]? -> Void) -> Bool { }
在OC下的方法是這個
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{ }
通過這個可以取到創建CSSearchableItem時設置的identifier
NSString* identifier=userActivity.userInfo[CSSearchableItemActivityIdentifier];
接著就可以用這個identifier取出對應的數據,進行處理了。
參考鏈接:
Index App Content
Session 709 — Introducing Search APIs