07/09/2018, 15:52

Đồng bộ với iCloud

iCloud là dịch vụ điện toán đám mây được Apple đưa vào hoạt động từ tháng 10 năm 2011. Cho tới tháng 7 năm 2013, dịch vụ đã có hơn 320 triệu người sử dụng (wiki). Dịch vụ cho phép sao lưu không dây (wireless) dữ liệu và cấu hình của các thiết bị iOS thay vì phải sử dụng iTunes trên Mac hay ...

iCloud là dịch vụ điện toán đám mây được Apple đưa vào hoạt động từ tháng 10 năm 2011. Cho tới tháng 7 năm 2013, dịch vụ đã có hơn 320 triệu người sử dụng (wiki).

Dịch vụ cho phép sao lưu không dây (wireless) dữ liệu và cấu hình của các thiết bị iOS thay vì phải sử dụng iTunes trên Mac hay Windows. Các dữ liệu cho phép sao lưu bao gồm ảnh và video trong Camera Roll, các cấu hình, dữ liệu của ứng dụng, tin nhắn văn bản và đa phương tiện, nhạc chuông, thư thoại…

Việc sao lưu được thực hiện tự động hàng ngày khi thiết bị trong trạng thái khóa, đang kết nối với internet thông qua wifi và đang được cắm sạc. Khi có vấn đề gì về dữ liệu, người dùng có thể dùng iCloud để khôi phục.

Với iCloud, lập trình viên có thể đồng bộ database Core Data giữa các thiết bị chạy iOS. Trong khuôn khổ bài viết, tôi sẽ trình bày các bước cần thiết để tạo một ứng dụng sử dụng iCloud để đồng bộ dữ liệu.

2.1. Tạo project CloudDemo

Tạo mới 1 ứng dụng dùng ngôn ngữ Swift với template Master-Detail Application, tích chọn Use Core Data như hình dưới đây:

s1.png

2.2. Tạo App ID và Provisioning Profiles

Chú ý: bạn cấn phải mua tài khoản developer của Apple ($99/năm) để thực hiện các bước dưới đây

Tạo App ID:

Đăng nhập vào địa chỉ developer.apple.com

Vào mục Member Center > Certificates, Identiiers & Profiles > Identifiers và tạo App ID mới theo Product name và Bundle Identifier tương ứng với project của bạn. Tích chọn service iCloud ở mục App Services

Sau khi tạo thành công ta sẽ có App ID tương tự như sau:

s2.png

Tạo Provisioning Profiles:

Vào mục Member Center > Certificates, Identiiers & Profiles > Provisioning Profiles và tạo mới profile sử dụng App ID đã tạo ở trên. Ta sẽ có kết quả tương tự như trong hình:

s3.png

Import profile vào Xcode:

Đăng nhập tài khoản develop
Download và click đúp vào file provisioning vừa tải về

2.3. Chọn Entitlements cho project

Bước tiếp theo bạn cần cấp cho chương trình khả năng vào quyền sử dụng iCloud storagestorage.
Vào trang Capabilities trong phần cấu hình project và turn on iCloud

s4.png

2.4. Import MagicalRecord

Import MagicalRecord vào dự án (đơn giản nhất là thông qua cocoa pod)

Có thể bạn phải sửa lại hàm setupCoreDataStackWithiCloudContainer trong file MagicalRecord+iCloud.h như sau (để fix lỗi AppID có dấu . )

+ (void) setupCoreDataStackWithiCloudContainer:(NSString *)icloudBucket localStoreNamed:(NSString *)localStore;
{

    NSMutableString * contentNameKey =[[NSMutableString alloc] initWithString: [[[NSBundle mainBundle] infoDictionary] objectForKey:(id)kCFBundleIdentifierKey]];

    // Munge the key: NSPersistentStoreUbiquitousContentNameKey should not contain periods
    [contentNameKey replaceOccurrencesOfString:@"." withString:@"~" options:NSLiteralSearch range:NSMakeRange(0, [contentNameKey length])];

    [self setupCoreDataStackWithiCloudContainer:icloudBucket
                                 contentNameKey:contentNameKey
                                localStoreNamed:localStore
                        cloudStorePathComponent:nil];
}

2.5. Cấu hình Magical Record

Tại file AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        MagicalRecord.setupCoreDataStackWithiCloudContainer("iCloud.truong.tuan.CloudDemo", localStoreNamed: "CloudDemo_local")

        return true
    }

func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        // Saves changes in the application's managed object context before the application terminates.
        MagicalRecord.cleanUp()
    }

2.6. Đăng ký Notification để cập nhật giao diện khi dữ liệu hoàn thành đồng bộ

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("iCloudUpdate"), name: kMagicalRecordPSCDidCompleteiCloudSetupNotification, object: nil)

2.7. Chạy thử chương trình

s5.png

Chạy thử chương trình, nhập dữ liệu sau đó xoá chương trình đi và thử chạy lại, bạn sẽ thấy dữ liệu được phục hồi như cũ (có thể bạn cần phải nhấn nút refresh - 1 vấn đề liên quan tới việc gửi notification không chính xác)

3. Kết luận

Như vậy chúng ta đã hoàn thành việc tìm hiểu sơ bộ về iCloud và cách đồng bộ dữ liệu Core Data. Trong thực tế, các bạn có thể phải giải quyết thêm bài toán đồng bộ dữ liệu khác như ảnh, nhạc, video … và bài toán database migration.

Cảm ơn đã theo dõi.

Source Code

0