8

CKSubscription документа через CKSubscription говорит: Когда запись модификация приводит подписку на огнь, сервер посылает уведомление толчка для всех устройств с этой подпиской тот, который сделал оригинальные изменения к за исключением запись.Наблюдайте CKRecord удаление не работает

Предположим, у меня есть два устройства: device 1 и device 2 зарегистрированы на разных учетных записях iCloud. Предположим, что оба устройства подписались на удаление записи для определенного типа записи.

  1. Если device 1 создает запись, а затем удаляет device 1 тогда device 2 получить уведомление - КОТОРЫЙ СОГЛАСНО DOC, НО ..
  2. Если device 1 создает запись, а затем удаляет device 2 тогда device 2 получить уведомление - я не думаю, что это СОГЛАСНО DOC, и это не имеет никакого смысла, device 2 удален так device 1 должен быть уведомлен

SET UP подписки на устройство 1 И УСТРОЙСТВО 2

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

    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil)) 
    application.registerForRemoteNotifications() 

    let defaultContainer = CKContainer.defaultContainer() 
    let publicDatabase = defaultContainer.publicCloudDatabase 

    publicDatabase.fetchAllSubscriptionsWithCompletionHandler({subscriptions, error in 

     if error == nil { 

      if subscriptions.count == 0 { 

       let subscription = CKSubscription(recordType: "OU", predicate: NSPredicate(value: true), options: .FiresOnRecordDeletion) 
       subscription.notificationInfo = CKNotificationInfo() 
       subscription.notificationInfo.shouldBadge = false 
       subscription.notificationInfo.alertBody = "OU removed or upated" 
       publicDatabase.saveSubscription(subscription, completionHandler: {subscription, error in 
        if error == nil { 
        } else { 
         println("\(error.localizedDescription)") 
        } 
       }) 
      } 

     } else { 
      println("\(error.localizedDescription)") 
     } 
    }) 


    return true 
} 

CREATE RECORD на устройстве 1

@IBAction func addOU(sender: AnyObject) { 

    var defaultContainer = CKContainer.defaultContainer() 
    var publicDatabase = defaultContainer.publicCloudDatabase 

    let r = CKRecord(recordType: "OU", recordID: CKRecordID(recordName: "aaaa")) 
    publicDatabase.saveRecord(r, completionHandler: { r2, error in 

     if error == nil { 
     } else { 
      println("\(error.localizedDescription)") 
     } 
    }) 
} 

УДАЛИТЬ ЗАПИСЬ НА УСТРОЙСТВЕ 2

@IBAction func removeOU(sender: AnyObject) { 

    var defaultContainer = CKContainer.defaultContainer() 
    var publicDatabase = defaultContainer.publicCloudDatabase 

    publicDatabase.deleteRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: {recordID, error in 

     if error == nil { 

     } else { 
      println("\(error.localizedDescription)") 
     } 
    }) 
} 
+1

Я radared баг rdar: // 18810914 –

ответ

9

Я до сих пор считаю, что это не имеет никакого смысла, как CKSubscription работает, но как временное решение я рекомендую измененную первые CKRecord «ы lastModifiedUserRecordID пользователя, который требуется удалить запись, и только после этого удалить запись.

Для изменения lastModifiedUserRecordID вы должны принести его и не делать ничего на это сохранить его обратно, а затем удаление может прийти:

@IBAction func removeOU(sender: AnyObject) { 

    var defaultContainer = CKContainer.defaultContainer() 
    var publicDatabase = defaultContainer.publicCloudDatabase 

    publicDatabase.fetchRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: {record, error in 

     if error == nil { 

      publicDatabase.saveRecord(record, completionHandler: {record2, error in 

       if error == nil { 

        publicDatabase.deleteRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: {recordID, error in 

         if error == nil { 

         } else { 
          println("\(error.localizedDescription)") 
         } 
        }) 
       } else { 
        println("\(error.localizedDescription)") 
       } 
      }) 

     } else { 
      println("\(error.localizedDescription)") 
     } 
    }) 
} 
+0

о мой бог ... Сообщается ли эта ошибка? Радар? –

+0

получил знакомые проблемы, и ваше обходное решение помогло мне. В моем случае была следующая проблема: устройство 1 создало запись и подписалось на запись, которая удаляется. Устройство 2 удалило запись. Устройство 1 не получает уведомление. –

+1

Я сообщил об этом –

 Смежные вопросы

  • Нет связанных вопросов^_^