CloudKit:删除CKSubscription不起作用

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

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

这是更改的代码:

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 Dashboard

我的日志订阅时:

 - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * 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 

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

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

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

 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) } }