Подписки CloudKit не работают

Я пытаюсь отправить уведомление, когда пользователь создает новое событие в моем приложении. Я мог бы успешно настроить уведомление, потому что я вижу его на панели инструментов моего облачного комплекта, но когда кто-то создает событие, ничего не происходит...

Дело в том, что в ViewController1 пользователь выбирает имя и участников события, а в ViewController2 он продолжает выбирать другие вещи. Что я хочу сказать, так это то, что мне не нужно загружать какие-либо визуальные данные в мое приложение (когда приходит уведомление), я только хочу, чтобы, когда уведомление отображалось, пользователь НЕПОСРЕДСТВЕННО переходил к ViewController2. Вот мой код:

Делегат приложения:

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

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

    application.registerUserNotificationSettings(settings)
    application.registerForRemoteNotifications()

    return true
}

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    let cloudKitNotification = CKNotification(fromRemoteNotificationDictionary: userInfo as! [String : NSObject])

    if cloudKitNotification.notificationType == CKNotificationType.Query {


        NSNotificationCenter.defaultCenter().postNotificationName("notinoti", object: nil)

    }
}

ViewController1:

func setupCloudKitSubscription() {

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.boolForKey("subscribed") == false {

        let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)
        let subscription = CKSubscription(recordType: "Event", predicate: predicate, options: CKSubscriptionOptions.FiresOnRecordCreation)

        let notificationInfo = CKNotificationInfo()
        notificationInfo.alertLocalizationKey = "New event"
        notificationInfo.shouldBadge = true
        notificationInfo.desiredKeys = ["name"]

        subscription.notificationInfo = notificationInfo

        let publicData = CKContainer.defaultContainer().publicCloudDatabase
        publicData.saveSubscription(subscription, completionHandler: { (subscription, error) in

            if error != nil {
                print(error?.localizedDescription)
            } else {
                userDefaults.setBool(true, forKey: "subscribed")
                userDefaults.synchronize()
            }
        })
    }
}

ViewController2:

var currentRecord: CKRecord?

override func viewDidLoad() {
    super.viewDidLoad()

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        NSNotificationCenter.defaultCenter().addObserver(self , selector: Selector("fetchRecord"), name: "notinoti", object: nil)
    })
}

func fetchRecord(recordID: CKRecordID) -> Void {

    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase

    publicDatabase.fetchRecordWithID(recordID, completionHandler: ({record, error in
        if let err = error {
            dispatch_async(dispatch_get_main_queue()) {
                print(err.localizedDescription)
            }
        } else {
            dispatch_async(dispatch_get_main_queue()) {
                self.currentRecord = record
                //Now do something with the data
            }
        }
    }))
}

1 ответ

Педро,

Не знаю, значимо ли это, но моя "рабочая" строка подписки гласит: Я получил подписку в моем коде?

  let subID = String(NSUUID().UUIDString)
  let predicateY = NSPredicate(value: true)
  let subscription = CKSubscription(recordType: "Blah", predicate: predicateY, subscriptionID: subID, options: [.FiresOnRecordUpdate, .FiresOnRecordDeletion])

Я получил смутное воспоминание о том, что он не работает через какое-то время дурачиться с ним, и в этот момент я сбросил БД на панели управления облачного комплекта и подписался, и он снова заработал.

Другие вопросы по тегам