Я добавляю подписку на тип записи Cloud Kit с FireOnCreation.CloudKit получает несколько уведомлений о создании записи
В appDelegate я использовал didReceiveRemoteNotificationWithCompletionHandler
, чтобы поймать уведомление. Проблема, с которой я сталкиваюсь, - это когда создается запись, соответствующая предикату, didReceiveRemoteNotificationWithCompletionHandler
будет запускать несколько раз. На устройстве A он срабатывает 3 раза подряд, а на устройстве B - 6 раз. Я даже попытался создать запись на Cloud DashBoard, и он все равно сделает то же самое. Таким образом, проблема заключается не в создании записи. Любое предложение или подсказки окажут большую помощь.
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
}
func subscribeRecordChangesForCurrentUser(userRecordID: CKRecordID) {
print("subscribeRecordChangesForCurrentUser \(userRecordID.recordName)")
let userRef = CKReference(recordID: userRecordID, action: CKReferenceAction.None)
let predicate = NSPredicate(format: "toUsers CONTAINS %@", userRef)
let subscription = CKSubscription(recordType: "Track", predicate: predicate, options: [.FiresOnRecordCreation])
let notificationInfo = CKNotificationInfo()
notificationInfo.alertBody = "Created a new track."
notificationInfo.shouldSendContentAvailable = true
notificationInfo.soundName = UILocalNotificationDefaultSoundName
subscription.notificationInfo = notificationInfo
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
publicDatabase.saveSubscription(subscription) { (subscription: CKSubscription?, error: NSError?) -> Void in
guard error == nil else {
print(error?.localizedDescription)
return
}
print("successfully subscript user")
}
}
Спасибо за ответ. Это то, чего я пренебрег делать. Я думал, что удалить подписку с Cloud Dashboard будет достаточно. По-видимому, это не так, и я обнаружил, что облачный контейнер грязный. В конце концов, я должен перезагрузить среду разработки. Теперь я использую метод CKModifySubscriptionsOperation, чтобы удалить старые и сохранить новые подписки. И я использую fetchAllSubscriptionsWithCompletionHandler для извлечения всех текущих подписей, которые необходимо удалить. – HioChao