続 CloudKitを使ってみた Swift版 - サブスクリプション編


前回の続きです。

iCloudではクラウド上のデータの変更(追加/更新/削除)を、プッシュ通知(APN)で受け取ることができます。
プッシュ通知はシミュレータでは動作しないので、実機をつないで実行します。

基本的にはアップルデベロッパーライブラリの説明の通りです。(Swiftに読み替えて)

プッシュ通知を受けとるには、CKSubscriptionCKNotificationInfoを使用します。

CloudTableViewController.swift
    func saveSubscription() {

        let collection = CKContainer.defaultContainer().publicCloudDatabase

        // 1. Create a subscription on Persons.
        let subscription = CKSubscription(recordType: "Persons", predicate: NSPredicate(format: "TRUEPREDICATE"), options: [CKSubscriptionOptions.FiresOnRecordCreation, CKSubscriptionOptions.FiresOnRecordUpdate])

        // 2. Set a Notification details on it.
        let notificationInfo = CKNotificationInfo()
        notificationInfo.alertLocalizationKey = "Person record has changed!"
        notificationInfo.shouldBadge = true

        subscription.notificationInfo = notificationInfo // set it to the subscription

        // 3. Save the subscription on 'Persons' record.
        collection.saveSubscription(subscription) { (subscription:CKSubscription?, error:NSError?) in

            if let error = error {
                print("error occurred: \(error)")
            }

            print("Subscription is saved. \(subscription?.subscriptionID)")
        }
    }
  1. レコードタイプPersonsにレコードを追加FiresOnRecordCreation, 更新FiresOnRecordUpdateした場合にイベントを受け取るように定義します。
  2. プッシュ通知のメッセージを設定します。CKNotificationInfo.alertLocalizationKey
  3. 作成したサブスクリプション定義を、iCloudサーバに登録します。saveSubscription(subscription: CKSubscription,

プッシュ通知を有効にするためAppDelegate.swiftapplication:didFinishLaunchingWithOptions:に下記を追加します。

AppDelegate.swift
import CloudKit
...
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Sound], categories: nil)
        application.registerUserNotificationSettings(notificationSettings)
        application.registerForRemoteNotifications()
        print("registered!")
        return true
    }
AppDelegate.swift
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
        let notification = CKNotification(fromRemoteNotificationDictionary: userInfo as! [String:NSObject])
        print("An alert has been recieved from iCloud: \(notification.alertBody)")
    }

notification.alertBodyにメッセージの内容が渡されます。

以上です。
実機をつなぎ、ビルド&実行します。

プッシュ通知許可のダイアログが出ます。OKします。

CloudKitダッシュボードを開きます。
Subscriptoin Typesメニューを開き、サブスクリプションが登録されたのを確認します。

今回は、手動でレコードを新規作成してみます。(本来は、別のデバイスから登録することになります。)
PUBLIC DATA > Default Zoneを開きます。+をクリックし、レコードの情報を入力します。
Saveをクリックします。(非常にわかりづらいですが、画面の右下にあります。)

すぐに、実機にプッシュ通知が送られます。

参考