2014-09-13 11 views
8

CKSubscription doc mówi: Kiedy modyfikacja rekordu powoduje abonament na ogień, serwer wysyła powiadomienia push dla wszystkich urządzeń z tej subskrypcji z wyjątkiem jednego, który wydał pierwotną zmianę do rekord.przestrzegać usunięcie CKRecord poprzez CKSubscription nie działa

Załóżmy, że mam dwa urządzenia: device 1 i device 2 zalogowane z różnych kont iCloud. Załóżmy, że oba urządzenia zostały subskrybowane w celu usunięcia rekordu dla określonego typu rekordu.

  1. Jeśli device 1 tworzy rekord, a następnie device 1 usuwa ona następnie device 2 otrzymywać powiadomienia - czyli WEDŁUG DOC, ale ..
  2. Jeśli device 1 tworzy rekord, a następnie device 2 usuwa ona następnie device 2 otrzymywać powiadomienia - I nie sądzę, że jest zgodna z DOC, a to nie ma żadnego sensu, device 2 usunięte tak device 1 powinny być zgłoszone

SET UP abonament na urządzenie 1 oraz urządzenie 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 
} 

utworzyć kartę na urządzeniu 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)") 
     } 
    }) 
} 

DELETE nagrywać na urządzenie 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

Mam radared się rdar błędu: // 18810914 –

Odpowiedz

9

ja nadal uważam, że to nie ma sensu jak CKSubscription prace, ale jako tymczasowy fix polecam zmienionym pierwszym CKRecord „s lastModifiedUserRecordID dla użytkownika, który chcesz usunąć rekord, a dopiero potem do rekordu usunąć.

Aby zmienić lastModifiedUserRecordID trzeba sprowadzić go bez niczego na niej zapisać go z powrotem, a następnie usunięcie może pochodzić:

@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

oh my Boże ... Czy ten błąd został zgłoszony? Radar? –

+0

uzyskałem znajomy problem i pomogło mi twoje obejście problemu. W moim przypadku wystąpił następujący problem: Urządzenie 1 utworzyło rekord i zasubskrybowano rekord zostanie usunięty. Urządzenie 2 usunęło rekord. Urządzenie 1 nie otrzyma powiadomienia. –

+1

Zgłosiło mi to –

Powiązane problemy