2014-09-13 119 views
8

CKSubscription醫生說:當記錄修改會導致訂閱火,服務器發送推送通知到所有設備與訂閱除外做出原型改變到一記錄。觀察CKRecord刪除不起作用

假設我有兩個設備:device 1device 2從不同的iCloud帳戶登錄。假設兩個設備都訂閱了某個記錄類型的記錄刪除。

  1. 如果device 1創建一個記錄,然後device 1刪除它,然後device 2得到通知 - 這是根據DOC,但..
  2. 如果device 1創建一個記錄,然後device 2刪除它,然後device 2得到通知 - 我不要以爲這是根據DOC,和它沒有任何意義,device 2刪除它,以便device 1應通知

設置預訂ON設備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 
} 

創建記錄在設備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 – 2014-10-29 15:46:43

回答

9

我仍然認爲這並沒有什麼意義如何CKSubscription的作品,但作爲一個臨時的解決辦法,我建議改變的第一CKRecordlastModifiedUserRecordID誰想要刪除記錄的用戶,以及事後才刪除記錄。

要更改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

噢,我的上帝......這個錯誤是否被報道?雷達? – 2014-10-29 14:58:59

+0

遇到了麻煩,你的解決方法幫助了我。在我的情況下是以下問題:設備1創建了一條記錄並訂閱記錄被刪除。設備2刪除了該記錄。設備1沒有得到通知。 – 2014-10-29 15:14:28

+1

我舉報了 – 2014-10-29 15:51:08