12/08/2018, 13:46

Use the APIs of the Core Spotlight framework

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 ...

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.

demo.gif

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

0