iOS 9: Giới thiệu Search APIs

12:49:00 AM

Introduction

Tại WWDC 2015, Apple đã chính thức công bố iOS 9. Ngoài nhiều tính năng mới và những cải tiến, bản cập nhật này cũng cung cấp cho các nhà phát triển có cơ hội để làm cho các nội dung của ứng dụng của họ được phát hiện nhiều hơn và truy cập thông qua tìm kiếm Spotlight. API mới có sẵn trong iOS 9 cho phép bạn chỉ mục bất kỳ nội dung hoặc trạng thái giao diện trong ứng dụng của bạn, làm cho nó dễ tiếp cận người dùng của bạn thông qua Spotlight. Ba thành phần của search APIs mới là:

- Class  NSUserActivity, cái được thiết kế để xem nội dung của app
- Core Spotlight framework, được thiết kế cho bất kỳ nội dung nào của app.
- Web markup, thiết kế cho apps mà có nội dung được đối xứng trên website.


Trong bài viết này, chúng tôi sẽ cho bạn thấy cách mà bạn có thể sử dụng class  NSUserActivity và Core Spotlight framework trong ứng dụng của bạn.
Prerequisites

Bài hướng dẫn này yêu cầu bạn phải đang chạy Xcode 7 trên OS X 10.10 hoặc mới hơn. Để làm theo cùng với chúng tôi, bạn cũng có thể tải về starter project từ GitHub.

1. Using  NSUserActivity

Trong phần đầu của hướng dẫn này, tôi sẽ cho bạn thấy làm thế nào bạn có thể chỉ mục nội dung của một ứng dụng thông qua các lớp   NSUserActivity. API này là một trong những cái tương tự được sử dụng cho Handoff, một tính năng được giới thiệu trong iOS 8 năm ngoái, và xử lý cả việc lưu trữ và khôi phục lại trạng thái hiện tại của ứng dụng.
Nếu bạn chưa từng làm việc với  NSUserActivity, tác giả đề nghị bạn nên đọc bài hướng dẫn của họ ở đây bao gồm các vấn đề cơ bản của  Handoff và   NSUserActivity trước khi chúng ta tiếp tục.

Trước khi viết bất kỳ dòng code nào, hãy mở starter project lên và run app bằng máy ảo hoặc máy thật. Lúc này, bạn sẽ thấy rằng các ứng dụng đơn giản chỉ hiển thị một danh sách bốn chương trình TV và trang chi tiết cho mỗi một chương trình.



Để bắt đầu, mở project lên và mở file DetailViewController.swift. thêm vào method  configureView của class  DetailViewController bằng những dòng code sau:


Đoạn code để cấu hình những labels trong view controller là không thay đổi, nhưng hãy đi từng bước một tìm hiểu đoạn code về user activity:


Tạo một đối tượng  NSUserActivity mới với unique identifier là com.tutsplus.iOS-9-Search.displayShow. Starter project đã được cấu hình sẵn để sử dụng identifier này để đảm bảo identifier này không thay đổi.
- Sau đó gán giá trị là một dictionary cho thuộc tính  userInfo của user activity. Cái này sẽ được sử dụng sau để khôi phục trạng thái của app.
- Tiếp theo là cung cấp cho thuộc tính  title của user activity một giá trị kiểu chuỗi. Cái này sẽ hiển thị lên trong thanh kết quả của Spotlight search.
- Để đảm bảo rằng nội dung của app có thể được tìm kiếm được nhiều hơn ngoài tiêu đề của nó, bạn cũng cung cấp một tập hợp các từ khóa cho nó. Trong đoạn mã trên, tập hợp các từ khóa bao gồm mỗi từ của tên chương trình cũng như các thể loại của nó.
- Tiếp theo, bạn thiết lập một số thuộc tính của đối tượng NSUserActivity để nói với hệ điều hành bạn muốn user activity được sử dụng. Trong bài hướng dẫn này, chúng ta chỉ tập trung vào thành phần search của API vì vậy chúng ta sẽ vô hiệu hóa Handoff và kích hoạt search.
- Cuối cùng, bạn gọi method   becomeCurrent của user activity ở vị trí này nó sẽ tự động được thêm vào chỉ mục kết quả tìm kiếm của thiết bị.


Trong đoạn code thực hiện ở trên, bạn có thể thấy hai dòng comment. Trong khi chúng ta sẽ không sử dụng các thuộc tính đó trong bài hướng dẫn này, điều quan trọng là phải biết có những thuộc tính khác có thể được sử dụng.


-   Với việc thực hiện ở trên, một user activity và kết quả tìm kiếm được tạo ra cho mỗi lần xuất hiện riêng biệt chỉ khi ứng dụng đã được mở. Khi bạn thực hiện eligibleForPublicIndexing của user activity, Apple bắt đầu theo dõi việc sử dụng và tương tác của các hoạt động đặc biệt này từ kết quả tìm kiếm của người dùng. Nếu kết quả tìm kiếm được tương tác bởi nhiều người sử dụng, Apple sẽ đưa các user activity lên cloud index của họ. Một khi user activity ở trong cloud index này, nó có thể được tìm kiếm bởi bất cứ ai đã cài đặt ứng dụng của bạn, bất kể họ có mở nội dung cụ thể hay không. Thuộc tính này chỉ nên được thiết lập để cho các hoạt động có thể truy cập bởi tất cả người dùng của ứng dụng của bạn.
-   Một user activity cũng có thể có tuỳ chọn expirationDate. Khi thuộc tính này được set, user activity của bạn sẽ chỉ xuất hiện lên trong kết quả tìm kiếm cho tới khi ngày quy định.


Bây giờ bạn đã biết cách tạo một  NSUserActivity có thể hiển thị trong kết quả tìm kiếm của Spotlight, bạn đã sẵn sàng để test nó. Build và run app và mở một vài chương trình trong app. Khi bạn đã thực hiện xong, quay trở về home screen (nhấn tổ hợp phím Command-Shift-H trong iOS Simulator) và kéo màn hình xuống hoặc kéo sang cạnh trái để thấy màn hình search.

Bắt đầu gõ 1 vài ký tự của chương trình mà bạn mở trong app và bạn sẽ thấy nó hiển thị trong kết quả tìm kiếm như bên dưới.



Ngoài ra, có thể nhập vào 1 thể loại trong những chương trình mà bạn đã mở. Bởi vì từ khoá mà bạn gán cho user activity, điều này cũng sẽ làm cho các kết quả được hiển thị lên trong kết quả tìm kiếm.


Nội dung trong app của bạn được chỉ mục một cách chính xác bởi hệ thống và kết quả được hiển thị trong Spotlight. Tuy nhiên, khi bạn chọn 1 kết quả, ứng dụng của bạn không đưa người dùng tới kết quả tìm kiếm tương ứng. Nó chỉ chạy app.

May mắn, tương tự với Handoff, bạn có thể dùng class  NSUserActivity để khôi phục trạng thái chính xác trong app. Để làm được điều này, bạn cần phải thực hiện 2 method. Thực hiện method  application(_:continueUserActivity:restorationHandler:) trong AppDelegate như bên dưới.


Tiếp theo, thực hiện method  restoreUserActivityState(_:) trong MasterViewController.


Build và run app lại và thử tìm 1 chương trình. Khi bạn chọn vào 1 chương trình trong kết quả tìm kiếm, app sẽ đưa bạn tới thẳng detail view controller và hiển thị thông tin hiện tại cho chương trình mà bạn đã chọn.



2. Sử dụng Framework Core Spotlight


Một tập hợp các APIs khác trong iOS 9 hỗ trợ user tìm kiếm nội dung trong app của bạn là Core Spotlight framework. Framework này có một kiểu thiết kế cơ sở dữ liệu và để cho bạn cung cấp nhiều thông tin hơn về nội dung mà bạn muốn nó có thể được tìm kiếm.

Trước khi bạn có thể sử dụng Core Spotlight framework, chúng ta cần kết nối project tới framework này. Trong Project Navigator, chọn project và mở tab Build Phases ở phía trên cùng. Tiếp theo, mở mục Link Binary With Libraries và click vào dấu +. Trong menu xuất hiện, tìm CoreSpotlight và kết nối project tới framework này. Lặp lại những bước này với MobileCoreServices framework.



Tiếp theo, để đảm bảo rằng kết quả tìm kiếm mà ứng dụng của chúng ta cung cấp là từ Core Spotlight, xóa app từ thiết bị thử nghiệm của bạn hoặc iOS Simulator và comment các dòng sau trong class  DetailViewController:


Cuối cùng, mở file MasterViewController.swift và thêm vào các dòng sau trước khi định nghĩa structure  Show:


Tiếp theo, thêm các đoạn code sau vào  viewDidLoad của class  MasterViewController:



Trước khi kiểm ta đoạn code này, hãy phân tích từng bước trong vòng lặp  for.
-    Tạo một đối tượng  CSSearchableItemAttributeSet, truyền 1 item cho tham số content type. Nếu kết quả tìm kiếm liên kết tới một tấm hình, cho ví dụ, bạn sẽ truyền  kUTTypeImage.
-    Bạn gán cho thuộc tính title của attribute set với giá trị là name của show. Cũng giống như  NSUserActivity, title này là cái sẽ được xuất hiện trên cùng của kết quả tìm kiếm.
-  Tiếp theo, bạn khởi tạo một chuỗi mô tả và gán giá trị này cho thuộc tính  contentDescription của attribute set. Chuỗi này sẽ được hiển thị phía dưới tiêu đề kết quả trong Spotlight.
-     Bạn khởi tạo một mảng chứa các từ khoá kết quả tìm kiếm giống như bạn đã làm với  NSUserActivity.
-     Cuối cùng, bạn khởi tạo một  CSSearchableItem với 1 unique item identifier, unique domain identifier để nhóm các items với nhau và 1 attribute set. Không như  NSUserActivity, cái mà trả về user activity từ kết quả tìm kiếm, unique identifiers bạn sử dụng cho  CSSearchableItem là những thông tin duy nhất mà bạn nhận từ hệ thống khi kết quả tìm kiếm của bạn được chọn từ user. Bạn cần sử dụng những identifiers này để khôi phục app của bạn về trạng thái chính xác nhất.

Mỗi lần bạn khởi tạo 1  CSSearchableItem cho các chương trình TV, bạn chỉ mục chúng sử dụng method  indexSearchableItems(_:completionHandler:)  trong đối tượng  CSSearchableIndex mặc định.

Build và run app, tất cả những chương trình sẽ được ghi vào mục lục bởi Spotlight. Điều hướng tới khung search và tìm kiếm thử 1 chương trình nào đó.



Kết quả tìm kiếm từ Core Spotlight được xử lý bằng những phương pháp tương tự như  NSUserActivity, nhưng tiến trình này hơi khác nhau. Khi 1  CSSearchableItem được chọn từ kết quả tìm kiếm, hệ thống sẽ tạo 1 đối tượng  NSUserActivity cho bạn mà chứa unique identifier của item đã chọn.

Trong hàm  application(_:continueUserActivity:restorationHandler:) của appdelegate, bạn có thể sử dụng cách sau để nhận thông tin bạn cần từ kết quả tìm kiếm từ Core Spotlight:



Một cách tốt khi chỉ mục nội dung từ app của bạn với Core Spotlight framework là xoá các items khi chúng không còn cần thiết. Class  CSSearchableIndex cung cấp 3 methods để xoá các items được tìm kiếm:

 -   deleteAllSearchableItemsWithCompletionHandler(_:)
 -   deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)
 -   deleteSearchableItemsWithIdentifiers(_:completionHandler:)


Như một ví dụ, thêm đoạn code sau vào cuối hàm  viewDidLoad của class  MasterViewController:


Build và run app lần nữa. Khi bạn thử tìm bất kỳ 1 chương trình nào, không có kết quả trả về bởi vì chúng đã bị xoá từ mục lục.

3. Combining  NSUserActivity và Core Spotlight

Một điều mới được thêm vào class  NSUserActivity trong iOS 9 là thuộc tính  contentAttributeSet. Thuộc tính này cho phép bạn gán 1  CSSearchableItemAttributeSet, cũng như cái mà bạn đã tạo trước đó. Attribute set này cho phép kết quả tìm kiếm của bạn đối với đối tượng  NSUserActivity để hiển thị cùng 1 số chi tiết như kết quả tìm kiếm từ Core Spotlight.

Bắt đầu bằng cách thêm đoạn import sau ở trên cùng file DetailViewController.swift:


Tiếp theo, cập nhật hàm  configureView trong class  DetailViewController bằng cách sau:



Build và run app, mở vài chương trình lên. Khi bạn tìm kiếm 1 chương trình, bạn sẽ thấy rằng kết quả của bạn, tạo với  NSUserActivity, chứa cùng mức độ chi tiết như kết quả tìm kiếm từ Core Spotlight.


Lời kết

Trong bài hướng dẫn này, bạn đã biết được cách làm 1 ứng dụng mà nội dung của nó có thể được truy cập thông qua iOS Spotlight bằng cách sử dụng class  NSUserActivity và Core Spotlight framework. Tác giả cũng cho chúng ta thấy cách lập chỉ mục nội dung từ app sử dụng cả 2 APIs này và cách khôi phục trạng thái app khi 1 kết quả tìm kiếm được chọn từ user.

Các API tìm kiếm mới được giới thiệu với iOS 9 rất dễ sử dụng và làm cho nội dung của ứng dụng của bạn dễ dàng hơn để tìm kiếm và dễ tiếp cận hơn cho người dùng của bạn.


Nguồn: TechTalk

Share this

Related Posts

Previous
Next Post »