Use the APIs of the Core Spotlight framework
Bài đăng này đã không được cập nhật trong 3 năm
Core Spotlight Framework
Các phiên bản iOS mới của apple đều có rất nhiều những thay đổi mang đến cho những nhà phát triển. Ở phiên bản iOS mới nhất, iOS 9 cũng không nằm ngoài truyền thống đó. Một lần nữa các nhà phát triển được cung cấp các frameworks và APIs của Apple để họ có thể tận dụng các ứng dụng của họ, thậm chí cao hơn. Một trong số đó mà hôm nay tôi muốn giới thiệu cho mọi người đó là Core Spotlight framework, với phiên bản iOS 9 Apple cung cấp một số các APIs mới tuyệt vời cho các nhà phát triển sử dụng.
Core Spotlight framework làm cho dữ liệu của một ứng dụng được tìm kiếm trên Spotlight. Từ kết quả đó chúng ta có thể mở ứng dụng đó xem chi tiết kết quả tìm kiếm. Các API Tìm kiếm đưa người dùng và các ứng dụng gần hơn, cũng khá ấn tượng phải không!
Trong ví dụ nhỏ dưới đây mình sẽ demo về Core Spotlight framework. Hiển thị danh sách truyện, thông tin của chúng và làm thế nào để chúng có thể hiển thị trên spotlight.
Tạo mới một project.
- Bundle identifier: com.comis
- Deployment target: 9.0
Tạo HomeViewController load data và update TableViewController
override func viewDidLoad() {
.....
loadComics()
}
func loadComics() {
if let path = NSBundle.mainBundle().pathForResource("ComicsData", ofType: "plist") {
let listItem = NSArray(contentsOfFile: path) as! Array<[String: String]>
let listComicItem = ComicObject.createListObjectFromListDict(listItem)
controller.updateWithListItem([listComicItem])
}
}
Hiển thị chi tiết truyện. Tạo Detail Comic ViewController.
// Tạo mới Detail Comic ViewController cùng với ComicObject
class func initWithComicObject(comic:ComicObject) -> DetailComicViewController {
let _self = DetailComicViewController.newViewController() as! DetailComicViewController
_self.comic = comic
return _self
}
// Tạo mới Detail Comic ViewController cùng với comicID. Sử dụng khi launch app from Spotlight.
class func initWithComicID(comicID: String)-> DetailComicViewController{
let _self = DetailComicViewController.newViewController() as! DetailComicViewController
_self.comicID = comicID
return _self
}
Hiển thị thông tin của truyện trên ViewController.
func setupView(){
lbTitle.text = self.comic.getTitle()
lbScore.text = self.comic.getRating()
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: self.comic.getImage())!) { (responseData, responseUrl, error) -> Void in
// if responseData is not null...
if let data = responseData{
// execute in UI thread
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.thumb.image = UIImage(data: data)
})
}
}.resume()
}
Indexing Data For The Spotlight
Tất cả dữ liệu muốn xuất hiện trong Spotlight Search đều được đại diện bởi CSSearchableItem sau khi khai báo sẽ được thêm vào CSSearchableItems. Mỗi một CSSearchableItem sẽ chứa các thuộc tính của đối tượng đó (Ví dụ như tên truyện, tác giả, ảnh đại diện).
CSSearchableItemAttributeSet cũng cấp cho bạn những thuộc tính của CSSearchableItems mà bạn có thể khai báo. Như displayName, alternateNames, path, contentURL, thumbnailURL, thumbnailData, keywords ...
func setupSearchableContent() {
let searchableItemAttributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
// Set the title.
searchableItemAttributeSet.title = self.comic.getTitle()
// Set the movie image
searchableItemAttributeSet.thumbnailURL = NSBundle.mainBundle().URLForResource("thumbcomic", withExtension: "jpg")
// Set the description.
searchableItemAttributeSet.contentDescription = self.comic.getDescription()
var keywords = [String]()
keywords.append(self.comic.getTitle())
keywords.append(self.comic.getDescription())
searchableItemAttributeSet.keywords = keywords
let searchableItem = CSSearchableItem(uniqueIdentifier:self.comic.getTitle(), domainIdentifier: "com.comics", attributeSet: searchableItemAttributeSet)
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([searchableItem]) { (error: NSError?) -> Void in
if let error = error {
// Indexing error
print(error.description)
} else {
// Search item successfully indexed!
}
}
}
Bây giờ các đối tượng của bạn đã có thể được tìm kiếm trên thanh spotlight. Nhưng chúng ta chưa thể mở ứng dụng để xem thông tin của kết quả tìm kiếm đó.
Để detect và Launch application iOS đã cung cấp cho bạn một func trong AppDelegate.
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?)
Tại đây bạn sẽ detect trong NSUserActivity, nếu ứng dụng của bạn được khởi động theo CSSearchableItemActionType thì bạn sẽ lấy giá trị định danh của đối tượng trong userInfo với key là CSSearchableItemActivityIdentifier. Giá trị này thường là ID của object chúng ta đã index. Trong ví dụ này dữ liệu là tĩnh và ở dưới client và tôi không render object ID. ID là title của object (uniqueIdentifier:self.comic.getTitle()). Sau khi khi có chuỗi định danh các bạn chỉ việc tạo mới Detail Comic ViewController truyền vào comicID và Push ViewController đó lên. Trong Detail Comic ViewController tôi đã viết một hàm để load dữ liệu truyện đó bằng comic ID và sau cùng là hiển thị chi tiết của truyện được tìm kiếm.
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
if userActivity.activityType == CSSearchableItemActionType {
if let uniqueIdentifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
let navigationController = self.window!.rootViewController as! UINavigationController
let detailComicVC = DetailComicViewController.initWithComicID(uniqueIdentifier);
navigationController.pushViewController(detailComicVC, animated: true)
}
}
return true
}
Kết Luận
Theo mình thấy thì đây là một API khá hay của iOS nó giúp người dùng tiếp cận gần hơn với các ứng dụng của bạn.
Ngay lần mở ứng dụng đầy tiên mình nghĩ các bạn lên suggest một loạt keywork mà người dùng có thể tìm kiếm trong spotlight và thế là mỗi khi search họ lại thấy ưng dụng của chúng ta hiện lên =)). Cái này mình không khuyến khích nhé.
Đây là một ví dụ khá đơn giản nhưng mình nghĩ nó đủ để chúng ta thực hiện ý đồ của mình.
Download the complete Xcode project from github: https://github.com/phamminhtien305/spotlightsearch.git
All rights reserved