2016-03-15 60 views
1

您好,我尝试取消CloudKit上的订阅。 到目前为止,我已经通过publicDB?.deleteSubscriptionWithID尝试了CKModifySubscriptionsOperation和single removement。我的completionHandler给了我没有错误和一个已删除订阅ID的数组。所以一切似乎都没问题。CloudKit:删除CKSubscription不起作用

但是,当我改变记录我仍然得到推送通知。 如何删除订阅?

这里是改变的代码:订阅时 CloudKit Dashboard

我的日志:

func cancelCubscription(subscription:Subscriptions){ 
    self._animationDelegate?.beginAnimation() 
    var subs = [String]() 
    subs.append(subscription.daySubSignature!) 
    subs.append(subscription.hdpSubSignature!) 
    subs.append(subscription.noteSubSignature!) 
    subs.append(subscription.planerSubSignature!) 
    subs.append(subscription.subjectSubSugnature!) 
    subs.append(subscription.teacherSubSignature!) 
    subs.append(subscription.tldSubSignature!) 

    // Create a CKModifyRecordsOperation operation 
    let subscriptionOperation = CKModifySubscriptionsOperation(subscriptionsToSave: nil, subscriptionIDsToDelete: subs) 

    subscriptionOperation.modifySubscriptionsCompletionBlock = { (modifiedSubscriptions: [CKSubscription]?, deletedSubscriptionIDs: [String]?, error: NSError?) -> Void in 
     guard error==nil else { 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self._animationDelegate?.endAnimation() 
       print(error!.localizedDescription) 

       let title:String = "Alert_Cancel_CloudKit_Subscription_Error_Title".localized 
       let message:String = error!.localizedDescription 

       self._alertDelegate?.showAlert(title, message: message) 
      }) 
      return 
     } 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self._animationDelegate?.endAnimation() 
      print("") 
      print("- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *") 
      print("Unscribe to CloudKit subscription success!") 

      let title:String = "Alert_Cancel_CloudKit_Subscription_Success_Title".localized 
      let message:String = "Alert_Cancel_CloudKit_Subscription_Success_Message".localized 

      self._alertDelegate?.showAlert(title, message: message) 

      for sub in deletedSubscriptionIDs!{ 
       print("Deleted Subscription: \(sub)") 
      } 

      subscription.tldSubSignature = "null" 
      subscription.daySubSignature = "null" 
      subscription.hdpSubSignature = "null" 
      subscription.noteSubSignature = "null" 
      subscription.planerSubSignature = "null" 
      subscription.subjectSubSugnature = "null" 
      subscription.teacherSubSignature = "null" 
      subscription.subscribed = false 
      Subscriptions.editSubsripction(subscription, context: self.appDel.managedObjectContext) 
     }) 
    } 

    // Add the operation to an operation queue to execute it 
    self._publicDB!.addOperation(subscriptionOperation) 
} 

我的租约仍然有效

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * 
CloudKit subscription success 
teacherSubSignature = DE49AAFB-373C-49E5-8DC8-E81A977E7628 
subjectSubSugnature = 3F06E054-D1B9-441E-AED3-CA947820D90C 
daySubSignature = 8FF9AC02-F177-4381-AA8D-08AFFDB0A578 
hdpSubSignature = 811ABA9A-D31B-4661-B783-B5DF033FC5F4 
tldSubSignature = 1C07C661-02A9-48F3-9B92-08F41433E179 
planerSubSignature = 1C32F1F0-3647-4F57-BDEF-215A28F69039 
hdpSubSignature = 59216B52-1A21-4666-950A-F8CDE44591D2 
Subscription Edited in Core Data 

和删除订阅: 误差=零

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * 
Unscribe to CloudKit subscription success! 

Deleted Subscription: 8FF9AC02-F177-4381-AA8D-08AFFDB0A578 
Deleted Subscription: 59216B52-1A21-4666-950A-F8CDE44591D2 
Deleted Subscription: 811ABA9A-D31B-4661-B783-B5DF033FC5F4 
Deleted Subscription: 1C32F1F0-3647-4F57-BDEF-215A28F69039 
Deleted Subscription: 3F06E054-D1B9-441E-AED3-CA947820D90C 
Deleted Subscription: DE49AAFB-373C-49E5-8DC8-E81A977E7628 
Deleted Subscription: 1C07C661-02A9-48F3-9B92-08F41433E179 
Subscription Edited in Core Data 
+0

你是如何得到订阅删除?你有没有检查你有多少订阅(重复)? – Wain

+0

我没有重复项,我的CloudKit仪表板只显示正确的类型和数量。但仍然在删除操作之后。 – SharpDev

+0

您是否检查并确认没有待处理的通知?你确定,看到答案。 – user3069232

回答

0

好吧,这不是确定的答案,但需要放下一些代码,并且评论太短。这是什么意思呢;第一种方法可以获取任何未完成的通知,第二种方法可以确保您的页面与他们的注意力相同。

在理想情况下删除订阅之前,您需要确保您有类似的地方。

声明这是演示代码;我还没有广泛的测试它。但它应该工作。

func fetchSubsInPlace() { 
    let container = CKContainer(identifier: "iCloud.ch") 
    let publicDB = container.publicCloudDatabase 

    publicDB.fetchAllSubscriptionsWithCompletionHandler({subscriptions, error in 
     for subscriptionObject in subscriptions! { 
      let subscription: CKSubscription = subscriptionObject as CKSubscription 
      print("subscription \(subscription)") 
     } 
    }) 
} 

func fetchNotificationChanges() { 
    let operation = CKFetchNotificationChangesOperation(previousServerChangeToken: nil) 

    var notificationIDsToMarkRead = [CKNotificationID]() 

    operation.notificationChangedBlock = { (notification: CKNotification) -> Void in 
     // Process each notification received 
     if notification.notificationType == .Query { 
      let queryNotification = notification as! CKQueryNotification 
      let reason = queryNotification.queryNotificationReason 
      let recordID = queryNotification.recordID 

      print("reason \(reason)") 
      print("recordID \(recordID)") 
      // Do your process here depending on the reason of the change 

      // Add the notification id to the array of processed notifications to mark them as read 
      notificationIDsToMarkRead.append(queryNotification.notificationID!) 
     } 
    } 

    operation.fetchNotificationChangesCompletionBlock = { (serverChangeToken: CKServerChangeToken?, operationError: NSError?) -> Void in 
     guard operationError == nil else { 
      // Handle the error here 
      return 
     } 

     // Mark the notifications as read to avoid processing them again 
     let markOperation = CKMarkNotificationsReadOperation(notificationIDsToMarkRead: notificationIDsToMarkRead) 
     markOperation.markNotificationsReadCompletionBlock = { (notificationIDsMarkedRead: [CKNotificationID]?, operationError: NSError?) -> Void in 
      guard operationError == nil else { 
       // Handle the error here 
       return 
      } 
     } 

     let operationQueue = NSOperationQueue() 
     operationQueue.addOperation(markOperation) 
    } 

    let operationQueue = NSOperationQueue() 
    operationQueue.addOperation(operation) 
} 


} 
+0

这听起来不错。因为我观察到我有时会得到更多的推动力。似乎我已经出现了 – SharpDev

+0

好吧,现在看起来好了。我不知道我在测试设置过程中做了多少订阅,但是在重置部署环境之后,它似乎也可以正常工作,而不需要标记要读取的通知。 THX适用于所有的窒息 – SharpDev