2014-09-13 12 views
8

CKSubscription doc dice: Quando una modifica registrazione causa di un abbonamento al fuoco, il server invia le notifiche push a tutti i dispositivi con tale sottoscrizione ad eccezione di quello che ha effettuato la modifica originale al disco.Osservare CKRecord eliminazione tramite CKSubscription non funziona

Let assumere Ho due dispositivi: device 1 e device 2 loggato da diversi account iCloud. Supponiamo che entrambi i dispositivi siano registrati per la cancellazione dei record per un determinato tipo di record.

  1. Se device 1 crea un record e quindi device 1 cancella poi device 2 ricevere una notifica - che è secondo il doc, MA ..
  2. Se device 1 crea un record e quindi device 2 cancella poi device 2 ricevere una notifica - I Non credo che è secondo la DOC, e non ha alcun senso, device 2 cancellati in modo device 1 deve essere informato

SET UP ABBONAMENTO ON DISPOSITIVO 1, nel DISPOSITIVO 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 
} 

Crea record nel dispositivo 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 RECORD SUL DISPOSITIVO 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

ho radared il rdar bug: // 18.810.914 –

risposta

9

io continuo a pensare che l'IT non hanno senso come CKSubscription opere, ma come una correzione temporanea vi consiglio di s' cambiato prima CKRecordlastModifiedUserRecordID per l'utente che vuole eliminare il record, e solo in seguito per cancellare record.

Per cambiare lastModifiedUserRecordID bisogna prenderlo e senza fare nulla su di esso salvarlo indietro, e quindi la cancellazione può venire:

@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 mio dio ... Questo bug è stato segnalato? Radar? –

+0

ha avuto problemi familiari e la tua soluzione alternativa mi ha aiutato. Nel mio caso stava seguendo il problema: Dispositivo 1 creato un record e sottoscritto per il record viene eliminato. Il dispositivo 2 ha cancellato il record. Il dispositivo 1 non viene avvisato. –

+1

lo ho segnalato –