LoginSignup
9
8

More than 5 years have passed since last update.

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

Posted at

前回の続きです。

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します。

IMG_0583.jpg

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

CloudKit_Dashboard.jpg

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

CloudKit_Dashboard.jpg

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

IMG_0584.jpg

参考

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8