Cloudkit不发送推送通知

时间:2016-08-02 00:17:47

标签: ios push-notification notifications cloudkit

我的应用程序没有发送(或接收)推送通知正在使用CloudKit订阅,因为有很多方法可以向南,我将在下面列出我所做的,这可能会有所帮助其他人有同样的问题,(希望)会指出我做错了什么:(

具体来说,我正试图在记录插入时获得静默通知(两者都在前景中的背景中),而我却两者都没有。

项目设置我在功能下启用CloudKit,在仪表板中设置记录类型。我在功能下为应用启用推送通知。我启用后台模式“远程通知”。

在发布时注册远程通知:

    // Register for push notification
    let settings = UIUserNotificationSettings(forTypes: [.Alert,.Badge,.Sound], categories: nil)
    application.registerUserNotificationSettings(settings)

    // Register for remote notification
    application.registerForRemoteNotifications()

监听推送通知注册成功(成功)并创建订阅:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    NSLog("Remote notifications registered - %@",deviceToken)
    createSubscriptions()
}

创建我的订阅对象,并设置它的通知信息,并将其保存到服务器:

private func createSubscriptions(user : CKRecord, completion: (NSError?) -> ()) {
        let messageSubscription = CKSubscription(recordType: "Messages", predicate: NSPredicate(format:"TRUEPREDICATE"), subscriptionID: "Messages", options: .FiresOnRecordCreation)
        let notificationInfo = CKNotificationInfo()
        notificationInfo.shouldSendContentAvailable = true
        notificationInfo.soundName = ""
        messageSubscription.notificationInfo = notificationInfo
        CKContainer.defaultContainer().publicCloudDatabase.saveSubscription(subscription) { (_, error) in
            if let error = error {
                if error.domain == "CKErrorDomain" && error.code == 15 {
                    NSLog("Already set, ignoring dupe")
                }
                else
                {
                    completion(error)
                    return
                }
            }
            completion(nil)
        }
}

我可以在CloudKit Dashboard中看到订阅确实已成功创建。

然后,我从第二个设备或仪表板创建一些记录(“消息”),看到它们是在查询或仪表板调用中添加的,但我从未调用过必须获取通知的方法:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // Crickets.  Never called
}

我理解通知在模拟器上不起作用。我在使用设备的开发中尝试了这个,并且在使用testflight和许多设备的生产中。我错过了很明显的东西吗?

2 个答案:

答案 0 :(得分:2)

你好像做得对。我能想到的两件事:

  1. 您确定要注册远程通知吗?我无法在任何地方看到application.registerForRemoteNotifications()的来电。我假设你忘记把它贴在这里。

  2. 您是否尝试在面板中删除订阅并重新创建?我遇到的问题是,使用不同的notificationInfo多次注册相同的订阅会中断它会停止触发。

答案 1 :(得分:1)

这有效...并且与你的版本有点不同......我不会尝试注册特定的通知,我会注册所有...然后在收到它们之后仔细查看它们。

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

    application.registerForRemoteNotifications()
    return true
}

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


    if notification.notificationType == .Query {
        let queryNotification = notification
        if queryNotification.queryNotificationReason  == .RecordUpdated {
           print("queryNotification.recordID \(queryNotification.recordID)")
        }
    }
   }