2015-12-21 1 views
3

Я добавляю подписку на тип записи 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") 
    } 
} 

ответ

3

Возможно, на этих устройствах имеется несколько подписей. Когда вы создаете новую подписку, удалите старые.

Посмотрите на

CKDatabase.fetchAllSubscriptionsWithCompletionHandler(_:) 

Для быстрой и грязной исправить, я полагаю, вы можете удалить приложение с устройства и установите его.

+1

Спасибо за ответ. Это то, чего я пренебрег делать. Я думал, что удалить подписку с Cloud Dashboard будет достаточно. По-видимому, это не так, и я обнаружил, что облачный контейнер грязный. В конце концов, я должен перезагрузить среду разработки. Теперь я использую метод CKModifySubscriptionsOperation, чтобы удалить старые и сохранить новые подписки. И я использую fetchAllSubscriptionsWithCompletionHandler для извлечения всех текущих подписей, которые необходимо удалить. – HioChao