Подписки 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])
Я получил смутное воспоминание о том, что он не работает через какое-то время дурачиться с ним, и в этот момент я сбросил БД на панели управления облачного комплекта и подписался, и он снова заработал.