SWIFT:我没有从CloudKit应用程序收到通知吗? [英] SWIFT: I don't get notifications from my CloudKit app?

查看:66
本文介绍了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中也有一些通知的代码:

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, 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!

有人在回答我之前说:

您正在向公共数据库添加数据,但是您正在创建您在私有数据库上的订阅。

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.

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

推荐答案

在您的应用程序委托中,您缺少此方法:

In your app Delegate, you are missing this method :

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

    print(deviceToken)       // This is the device token
    var token: String = "\(deviceToken)"    /// formatted token.

    let rawtoken = token.stringByReplacingOccurrencesOfString(">", withString: "")
    let cleantoken = rawtoken.stringByReplacingOccurrencesOfString("<", withString: "")
    var finaltoken = cleantoken.stringByReplacingOccurrencesOfString(" ", withString: "")
    // Send device token to server

            }
        }
    }

我的意思是要发送通知,您需要注册用户以进行通知。对于这种情况,如果注册成功,则必须实现上述方法。
如果注册失败,则必须执行以下操作:

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)

}

这篇关于SWIFT:我没有从CloudKit应用程序收到通知吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆