Giới thiệu về CloudKit
() translation by (you can also view the original English article)
Giới thiệu
CloudKit là một framework của Apple đã được giới thiệu cùng với iOS 8 vào năm 2014. Mục đích của nó là cung cấp một giải pháp đơn giản để lưu trữ dữ liệu ứng dụng của bạn trong đám mây bằng cách sử dụng iCloud, giúp nó sẵn có trên các thiết bị khác nhau. Một số tính năng chính của CloudKit bao gồm:
- lưu trữ lên đến 1 PB dữ liệu (hình ảnh, tập tin âm thanh, vv)
- lên đến 10 TB dung lượng lưu trữ cơ sở dữ liệu (chuỗi, số, mảng, vv)
- xác thực người dùng iCloud
- thông báo
Trong bài này, tôi sẽ hướng dẫn cho bạn cách làm thế nào để thiết lập và tương tác với CloudKit trong một ứng dụng iOS bằng cách tạo ra một ứng dụng mẫu gọi là CloudBug. CloudBug hiển thị một danh sách các lỗi với một tiêu đề và mô tả, được lưu trữ trong iCloud sử dụng CloudKit.
Các yêu cầu
Hướng dẫn này đòi hỏi rằng bạn đang chạy Xcode 6+ và có một tài khoản nhà phát triển iOS. Bạn cũng sẽ cần phải tải về dự án khởi đầu từ GitHub.
1. Cấu hình dự án
Điều đầu tiên bạn cần làm sau khi mở dự án khởi đầu là thay đổi bundle identifier và team của mục tiêu. Chọn dự án CloudBug trong Project Navigator và chọn mục tiêu CloudBug từ danh sách các mục tiêu.



Thay đổi bundle identifier thành một chuỗi duy nhất sử dụng ký hiệu dịch vụ tên miền đảo ngược. Tiếp theo, chọn team thích hợp cho tài khoản nhà phát triển của bạn.
Mở tab Capabilities ở bên trên và kích hoạt iCloud bằng cách bật ở nút bên phải. Điều này sẽ hiển ra các thiết lập iCloud cho mục tiêu CloudBug.



Trong các cài đặt iCloud, hãy tích vào checkbox có nhãn CloudKit để kích hoạt CloudKit cho mục tiêu CloudBug.



Build và chạy ứng dụng trên một thiết bị hoặc trên iOS Simulator để xem tất cả mọi thứ có hoạt động mà không có lỗi hay không.
2. Tạo Record Type Bug
Nhấp vào nút CloudKit Dashboard ở dưới cùng của các thiết lập iCloud. Điều này sẽ mở dashboard của CloudKit trong trình duyệt của bạn. Sau khi đăng nhập bằng tài khoản nhà phát triển của bạn, thì dashboard của CloudKit sẽ xuất hiện. Trước khi tiếp tục, hãy để tôi hướng dẫn bạn các mục trong thanh sidebar ở bên trái.



Schema
- Record Types có chức năng tương tự với một định nghĩa lớp thông thường. Các record được tạo ra giống như các đối tượng của lớp từ các kiểu này.
- Security Roles cung cấp một cách để cho phép những người dùng khác nhau truy cập dữ liệu theo nhiều cách khác nhau. Ví dụ, một security role có thể được sử dụng để cho phép chỉ người dùng cấp độ quản trị có quyền đọc và ghi dữ liệu.
- Subscription Types được sử dụng để quản lý các mục đăng ký khác nhau mà ứng dụng của bạn có nếu chúng đã được cài đặt.
Public Data
- User Records hoạt động giống như record thông thường ngoại trừ việc chúng đặc biệt được liên kết với record type Users mà không thể xóa.
- Default Zone là nơi mà tất cả các public record và dữ liệu khác của bạn sẽ được lưu trữ.
Private Data
- Default Zone hoạt động giống như default zone của public data, ngoại trừ rằng nó chỉ có thể truy cập đối với người dùng hiện đang đăng nhập.
Admin
- Team nơi bạn có thể xem các nhà phát triển khác cộng tác trên dự án và chỉnh sửa các quyền của họ.
- Deployment nơi bạn có thể xem những thay đổi sẽ được thực hiện đối với các phần tử schema khi dự án của bạn bước vào môi trường thành phẩm.
Trong hướng dẫn này, bạn sẽ chỉ tập trung vào các record type và default zone của public data. Bước tiếp theo là tạo ra record type đầu tiên của bạn.
Nếu bạn chọn Record Types từ sidebar ở bên trái, bạn sẽ thấy rằng một type có tên là Users đã tồn tại.



Hãy tạo một record type mới có tên là Bug sẽ chứa một tiêu đề và mô tả. Nhấp vào dấu cộng ở trên cùng để tạo ra record type mới.



Thay đổi tên của record type mới thành Bug và thêm hai thuộc tính Title và Description. Chọn kiểu của hai thuộc tính là String với tuỳ chọn Query trong Index được tích chọn. Record type mới sẽ trông giống như sau.



Nhấp vào Save ở góc dưới bên phải để tạo ra record type Bug.



3. Tạo các Record trong Dashboard của CloudKit
Khi bạn chọn Default Zone ở dưới Public Data, record type Bug sẽ được chọn. Tạo một record mới bằng cách nhấp vào New Record hoặc nhấn vào dấu cộng ở phía trên.



Nhập bất cứ điều gì bạn muốn cho các trường Description và Title.



Nhấp vào Save ở góc dưới bên phải để tạo ra record. Bạn sẽ thấy rằng record của bạn đã được gán một record ID duy nhất, Created, Modified, Created By và Modified By. Bất kể record type nào mà một record dựa trên, nó sẽ luôn luôn có năm thuộc tính này.
4. Nạp Record
Quay trở lại Xcode và mở MasterViewController.swift. Ở phía trên cùng, thêm một câu lệnh import để import framework CloudKit.
1 |
import CloudKit |
Cập nhật phương thức viewDidLoad
bằng cách nối thêm đoạn code sau đây.
1 |
let container = CKContainer.defaultContainer() |
2 |
let publicData = container.publicCloudDatabase |
3 |
|
4 |
let query = CKQuery(recordType: "Bug", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)) |
5 |
publicData.performQuery(query, inZoneWithID: nil) { results, error in |
6 |
if error == nil { // There is no error |
7 |
for bug in results { |
8 |
let newBug = Bug() |
9 |
newBug.title = bug["Title"] as! String |
10 |
newBug.description = bug["Description"] as! String |
11 |
|
12 |
self.objects.append(newBug) |
13 |
|
14 |
dispatch_async(dispatch_get_main_queue(), { () -> Void in |
15 |
self.tableView.reloadData() |
16 |
})
|
17 |
}
|
18 |
}
|
19 |
else { |
20 |
println(error) |
21 |
}
|
22 |
}
|
Hãy xem điều gì xảy ra ở đoạn code này.
- Trước tiên, chúng ta lấy một tham chiếu đến container mặc định cho ứng dụng. Container này chứa các record type và các record mà chúng ta tạo ra trong dashboard của CloudKit. Bạn có thể tạo thêm các container với một định danh duy nhất trong Target Inspector > Capabilities.
- Thứ hai, chúng ta lấy một tham chiếu đến public data của container. Định dạng tương tự đối với private data.
- Sau đó, chúng ta tạo ra một truy vấn đối với record type Bug, sử dụng một đối tượng
NSPredicate
. Predicate này có thể được sử dụng để lọc các kết quả của truy vấn, ví dụ, chỉ lấy các record được tạo ra hoặc sửa đổi sau một ngày nhất định. Đối với ví dụ này, chúng ta lấy tất cả record type Bug. - Tiếp theo, chúng ta nói cho cơ sở dữ liệu thực thi các truy vấn, kích hoạt một yêu cầu không đồng bộ. Khi yêu cầu được hoàn thành, khối hoàn thành được thực thi, giao cho chúng ta một mảng
results
và một đối tượngerror
- Nếu đối tượng
error
lànil
, chúng ta lặp qua các phần tử của mảngresults
và tạo ra một đối tượngBug
cục bộ cho mỗi record. Mỗi đối tượngBug
sẽ được thêm vào nguồn dữ liệu của table view và table view được nạp lại trong tiến trình chính.
Build và chạy ứng dụng của bạn để xem record mà chúng ta tạo ra trong Dashboard của CloudKit có được nạp vào CloudBug hay không.



Nếu bạn nhìn thấy một lỗi trong giao diện console của Xcode tương tự như dưới đây, thì hãy đảm bảo rằng bạn đã đăng nhập vào tài khoản iCloud một cách chính xác trên thiết bị thử nghiệm của bạn. Điều này cũng đúng nếu bạn đang chạy CloudBug trong iOS Simulator



Chạm vào bug trong table view sẽ hiện ra detail view controller với các mô tả của bug.



5. Tạo các Record
Mặc dù việc tải dữ liệu từ iCloud thông qua CloudKit có thể rất hữu ích, nhưng CloudBug cũng cần khả năng cho phép người dùng tạo record mới. Trong MasterViewController.swift, thêm đoạn code sau vào phương thức receiveBug(_:)
.
1 |
let container = CKContainer.defaultContainer() |
2 |
let publicData = container.publicCloudDatabase |
3 |
|
4 |
let record = CKRecord(recordType: "Bug") |
5 |
record.setValue(bug.title, forKey: "Title") |
6 |
record.setValue(bug.description, forKey: "Description") |
7 |
publicData.saveRecord(record, completionHandler: { record, error in |
8 |
if error != nil { |
9 |
println(error) |
10 |
}
|
11 |
})
|
Trước tiên là hai dòng quen thuộc. Chúng ta có được một tham chiếu đến container mặc định và public data. Chúng ta tạo ra một đối tượng CKRecord
, thiết lập giá trị cho các khoá Title và Description và lưu record vào iCloud.
Lưu ý rằng đối tượng record
trả về từ iCloud trong handler hoàn tất saveRecord(_:completionHandler:)
bao gồm các giá trị mà bạn thiết lập thủ công cũng như năm thuộc tính mặc định mà chúng ta đã thấy trước đó trong Dashboard của CloudKit.
Build và chạy ứng dụng của bạn, và gửi một bug mới bằng cách bấm vào dấu cộng ở phía trên bên phải, điền vào các trường title và description. Chạm vào Post và lưu record mới trong iCloud trong cơ sở dữ liệu CloudKit.



Xem lại Dashboard của CloudKit và điều hướng đến Default Zone ở dưới Public Data. Nếu mọi việc đều ổn, bạn sẽ thấy hai record Bug trong cơ sở dữ liệu.



6. Xoá Record
Hãy kết thúc bài này bằng cách cho phép người dùng xoá một bug. Thêm đoạn code sau vào phương thức tableView(_:commitEditingStyle:forRowAtIndexPath:)
phía trên objects.removeAtIndex(indexPath.row)
.
1 |
let container = CKContainer.defaultContainer() |
2 |
let publicData = container.publicCloudDatabase |
3 |
|
4 |
let bug = self.objects[indexPath.row] |
5 |
let query = CKQuery(recordType: "Bug", predicate: NSPredicate(format: "(Title == %@) AND (Description == %@)", argumentArray: [bug.title, bug.description])) |
6 |
publicData.performQuery(query, inZoneWithID: nil, completionHandler: { results, error in |
7 |
if error == nil { |
8 |
if results.count > 0 { |
9 |
let record: CKRecord! = results[0] as! CKRecord |
10 |
println(record) |
11 |
|
12 |
publicData.deleteRecordWithID(record.recordID, completionHandler: { recordID, error in |
13 |
if error != nil { |
14 |
println(error) |
15 |
}
|
16 |
})
|
17 |
}
|
18 |
}
|
19 |
else { |
20 |
println(error) |
21 |
}
|
22 |
})
|
Để xóa một record, chúng ta tạo ra một truy vấn giống như chúng ta đã làm trước đó. Tuy nhiên, để xóa một hồ sơ, chúng ta tạo ra một Predicate để khớp Title và Description của bug. handler hoàn thành trả về kết quả của các truy vấn mà chúng ta sử dụng để xóa record tương ứng khỏi public data.
Build và chạy ứng dụng, và xóa một trong các bug hoặc bằng cách vuốt về bên phải hoặc bằng cách bấm vào nút Edit.



Xem lại Dashboard của CloudKit để xem bug mà bạn chọn có thực sự bị xóa hay không.
Tóm tắt
Trong hướng dẫn này, bạn đã tạo ra ứng dụng CloudKit đầu tiên của bạn bằng cách liên kết ứng dụng của bạn với iCloud. Bạn đã học được cách làm thế nào để tạo ra các record type và record trong dashboard của CloudKit, và cách để nạp chúng trong ứng dụng của bạn. Ngoài thêm và xóa các record trong dashboard của CloudKit, chúng ta còn thêm và xóa các record bằng cách sử dụng framework CloudKit. Nếu bạn có bất kỳ ý kiến hay câu hỏi nào, hãy để lại chúng trong phần bình luận dưới đây nhé.