SWIFT: I dont get notifications from my CloudKit app?

送分小仙女□ 提交于 2019-12-08 10:13:52

问题


I asked this question and people have answered but nothing ever works. This is very important to me that I can get this to work. Here is some of my code:

          @IBAction func sendSweet(sender: AnyObject) {





    //delegate method




    let newSweet = CKRecord(recordType: "Extra1")
    newSweet["content"] = textField.text

    let publicData = CKContainer.defaultContainer().publicCloudDatabase
    publicData.saveRecord(newSweet, completionHandler: { (record:CKRecord?, error:NSError?) -> Void in
        if error == nil {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.tableView.beginUpdates()
                self.sweets.insert(newSweet, atIndex: 0)
                let indexPath = NSIndexPath(forRow: 0, inSection: 0)
                self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Top)
                self.tableView.endUpdates()
                self.textField.text = ""
                self.textField.resignFirstResponder()



            })


        }})
    // Put the CloudKit private database in a constants
    let privateDatabase = CKContainer.defaultContainer().publicCloudDatabase

    // Create subscription and set three of its properties (an id, a predicate, and options)
    let friendsSubscription = CKSubscription(recordType: "Extra1",
        predicate: NSPredicate(format: "TRUEPREDICATE"),
        subscriptionID: "Extra1",
        options: .FiresOnRecordCreation)

    // Create a notification and set two of its properties (alertBody and shouldBadge)
    let notificationInfo = CKNotificationInfo()
    notificationInfo.alertBody = "New message in Lms Chat"
    notificationInfo.shouldBadge = false

    // Attach the notification to the subscription
    friendsSubscription.notificationInfo = notificationInfo

    // Save the subscription in the private database
    privateDatabase.saveSubscription(friendsSubscription) {recordReturned, error in
        // On the main thread, display an error/success message in the textView
        if error != nil {
            NSOperationQueue.mainQueue().addOperationWithBlock {
                self.textField.text = "Cloud error\n\(error!.localizedDescription)"
            }
        } else {
            NSOperationQueue.mainQueue().addOperationWithBlock {
                self.textField.text = ""
            }
        }
    }

}
func textFieldShouldEndEditing(textField: UITextField!) -> Bool {  //delegate method
    return false
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {   //delegate method
    textField.resignFirstResponder()

    return true

}

It's a messaging app so people can message eachother but I also want them to recieve notifications. This is the code for notifications and I also have some code for notifications in App Delegate:

import UIKit
import CloudKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


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

        let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)

        UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)

        UIApplication.sharedApplication().registerForRemoteNotifications()

        return true
    }

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {



        print(deviceToken)       // This is the device token
        var token: String = "\(deviceToken)"    /// formatted token.
        // Following lines will convert token from NSData to String.
        let rawtoken = token.stringByReplacingOccurrencesOfString(">", withString: "")
        let cleantoken = rawtoken.stringByReplacingOccurrencesOfString("<", withString: "")
        var finaltoken = cleantoken.stringByReplacingOccurrencesOfString(" ", withString: "")
        // Send device token to server

    }
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print(error)

}


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

        if cloudKitNotification.notificationType == CKNotificationType.Query {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                NSNotificationCenter.defaultCenter().postNotificationName("performReload", object: nil)
            })

        }

    }

    func resetBadge () {
        let badgeReset = CKModifyBadgeOperation(badgeValue: 0)
        badgeReset.modifyBadgeCompletionBlock = { (error) -> Void in
            if error == nil {
                UIApplication.sharedApplication().applicationIconBadgeNumber = 0
            }

        }

        CKContainer.defaultContainer().addOperation(badgeReset)
    }


    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(application: UIApplication) {
        resetBadge()

    }

    func applicationWillEnterForeground(application: UIApplication) {
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            NSNotificationCenter.defaultCenter().postNotificationName("performReload", object: nil)
        })
    }

    func applicationDidBecomeActive(application: UIApplication) {
        resetBadge()
    }

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }

But notifications do not come in even though I have all of the code needed to make notifications every time someone sends a message. Am I missing something? Thanks!

Someone answered me before saying:

You are adding data to the public database but you are creating your subscription on the private database. One of those two needs to be changed to match the other.

So I changed the let privateDatabase = CKContainer.defaultContainer().privateCloudDatabase to let privateDatabase = CKContainer.defaultContainer().publicCloudDatabase

Someone also told me I was missing a function:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {



    print(deviceToken)       // This is the device token
    var token: String = "\(deviceToken)"    /// formatted token.
    // Following lines will convert token from NSData to String.
    let rawtoken = token.stringByReplacingOccurrencesOfString(">", withString: "")
    let cleantoken = rawtoken.stringByReplacingOccurrencesOfString("<", withString: "")
    var finaltoken = cleantoken.stringByReplacingOccurrencesOfString(" ", withString: "")
    // Send device token to server

            }
        }
    }

They said: "What I mean is that to send notification, you register user for push Notification. For the case If the register succeeds, you have to implement the method above. if the registeration fails, you have to implement this :"

 func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print(error)

}

I added this and it still doesn't work (Notifications still do not come up.) Any other solution? Thanks!

来源:https://stackoverflow.com/questions/37495254/swift-i-dont-get-notifications-from-my-cloudkit-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!