SWIFT:我没有从我的CloudKit应用程序收到通知?

我问这个问题,人们已经回答,但没有任何工作。 这对我来说是非常重要的,我可以得到这个工作。 这是我的一些代码:

@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 } 

这是一个消息应用程序,所以人们可以给彼此留言,但我也希望他们收到通知。 这是通知的代码,我也有一些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:. } 

但是即使我有每次有人发送消息时都需要进行通知的代码,通知也不会进入。 我错过了什么吗? 谢谢!

有人回答我之前说:

您正在将数据添加到公共数据库,但您正在私人数据库上创build您的订阅。 其中一个需要改变,以配合其他。

所以我改变了let privateDatabase = CKContainer.defaultContainer().privateCloudDatabase let privateDatabase = CKContainer.defaultContainer().publicCloudDatabase

有人还告诉我,我错过了一个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 } } } 

他们说:“我的意思是发送通知,注册用户推送通知,对于这种情况,如果注册成功,你必须实现上面的方法,如果注册失败,你必须实现这个:”

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

我加了这个,它仍然不起作用(通知仍然没有出现。)任何其他解决scheme? 谢谢!