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à:
- Core
Spotlight framework, được thiết kế cho bất kỳ nội dung nào của app.
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 đó.
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:)
- 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.
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









EmoticonEmoticon