2

I am making a "texting app" you can call it and it uses cloudkit and I have been looking everywhere to add notifications that work with cloudkit... Would someone be able to tell me the code to add push notifications for cloudkit in detail because I am very lost... Also I wan't the notifications to go to different "texting rooms" (in cloudkit it would be record types...) For instance I have one record type called "text" and another one called "text 2" I don't want notifications from "text" to get to people who use "text2" and vise versa.

2

1 Answer 1

3

Using Swift 2.0 with El Captain & Xcode 7.2.1

Elia, You need to add this to your app delegate. Which will arrive in a userInfo packet of data, which you can then parse to see which database/app sent it.

UIApplicationDelegate to the class
application.registerForRemoteNotifications() to the

func application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

Than this method

func application(application: UIApplication, didReceiveRemoteNotification  userInfo: [NSObject : AnyObject]) {
    let notification = CKQueryNotification(fromRemoteNotificationDictionary: userInfo as! [String : NSObject])

    let container = CKContainer(identifier: "iCloud.com")
    let publicDB = container.publicCloudDatabase

    if notification.notificationType == .Query {
        let queryNotification = notification as! CKQueryNotification
        if queryNotification.queryNotificationReason  == .RecordUpdated {
            print("queryNotification.recordID \(queryNotification.recordID)")
            // Your notification

        }
    }

    print("userInfo \(userInfo["ck"])")
                    NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: self, userInfo:dataDict)
                }
            }
        }
    }

}

That'll get you started.

You can use this method to check your subscriptions programmatically, of course while your developing you can use the dashboard.

func fetchSubsInPlace() {
    let container = CKContainer(identifier: "iCloud.com")
    let publicDB = container.publicCloudDatabase

    publicDB.fetchAllSubscriptionsWithCompletionHandler({subscriptions, error in
        for subscriptionObject in subscriptions! {
            let subscription: CKSubscription = subscriptionObject as CKSubscription
            print("subscription \(subscription)")
        }
    })
}

And finally when you got it; you can this routine to ensure you capture any subscriptions you missed while your app was sleeping and make sure that subscriptions don't go to all your devices, once you treated them too.

 func fetchNotificationChanges() {
    let operation = CKFetchNotificationChangesOperation(previousServerChangeToken: nil)

    var notificationIDsToMarkRead = [CKNotificationID]()

    operation.notificationChangedBlock = { (notification: CKNotification) -> Void in
        // Process each notification received
        if notification.notificationType == .Query {
            let queryNotification = notification as! CKQueryNotification
            let reason = queryNotification.queryNotificationReason
            let recordID = queryNotification.recordID

            print("reason \(reason)")
            print("recordID \(recordID)")
            // Do your process here depending on the reason of the change

            // Add the notification id to the array of processed notifications to mark them as read
            notificationIDsToMarkRead.append(queryNotification.notificationID!)
        }
    }

    operation.fetchNotificationChangesCompletionBlock = { (serverChangeToken: CKServerChangeToken?, operationError: NSError?) -> Void in
        guard operationError == nil else {
            // Handle the error here
            return
        }

        // Mark the notifications as read to avoid processing them again
        let markOperation = CKMarkNotificationsReadOperation(notificationIDsToMarkRead: notificationIDsToMarkRead)
        markOperation.markNotificationsReadCompletionBlock = { (notificationIDsMarkedRead: [CKNotificationID]?, operationError: NSError?) -> Void in
            guard operationError == nil else {
                // Handle the error here
                return
            }
        }

        let operationQueue = NSOperationQueue()
        operationQueue.addOperation(markOperation)
    }

    let operationQueue = NSOperationQueue()
    operationQueue.addOperation(operation)
}


}
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks you very much for your help I appreciate it very much it helped alot. Best regards, Elia
Is it really possible to fetch all notifications that my app never accessed? Really? I need to test it. If so, Apple's Cloud Kit is really awesome;)
Yes, I believe so.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.