Advertisement
Scroll to top
Read Time: 10 min

() 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 identifierteam 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.

Configuring the CloudBug TargetConfiguring the CloudBug TargetConfiguring the CloudBug Target

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.

Enabling iCloud for the CloudBug TargetEnabling iCloud for the CloudBug TargetEnabling iCloud for the CloudBug Target

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.

Enabling CloudKit for the CloudBug TargetEnabling CloudKit for the CloudBug TargetEnabling CloudKit for the CloudBug Target

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.

Opening the CloudKit DashboardOpening the CloudKit DashboardOpening the CloudKit Dashboard

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.

The User Record Type Is a Default Record TypeThe User Record Type Is a Default Record TypeThe User Record Type Is a Default Record Type

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.

Creating a New Record TypeCreating a New Record TypeCreating a New Record Type

Thay đổi tên của record type mới thành Bug và thêm hai thuộc tính TitleDescription. 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.

This Is What the New Record Type Should Look LikeThis Is What the New Record Type Should Look LikeThis Is What the New Record Type Should Look Like

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

Create the Bug Record Type by Clicking SaveCreate the Bug Record Type by Clicking SaveCreate the Bug Record Type by Clicking Save

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.

Create a New RecordCreate a New RecordCreate a New Record

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

Add Data to the New RecordAdd Data to the New RecordAdd Data to the New Record

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 ByModified 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ượng error
  • Nếu đối tượng errornil, chúng ta lặp qua các phần tử của mảng results và tạo ra một đối tượng Bug cục bộ cho mỗi record. Mỗi đối tượng Bug 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.

Loading Records Into CloudBugLoading Records Into CloudBugLoading Records Into CloudBug

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

Make Sure You Are Logged in to iCloudMake Sure You Are Logged in to iCloudMake Sure You Are Logged in to iCloud

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

Showing the Bugs DescriptionShowing the Bugs DescriptionShowing the Bugs Description

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

Create a New Bug RecordCreate a New Bug RecordCreate a New Bug Record

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.

The New Record Shows Up in the CloudKit DashboardThe New Record Shows Up in the CloudKit DashboardThe New Record Shows Up in the CloudKit Dashboard

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.

Deleting RecordsDeleting RecordsDeleting Records

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.