2017-03-11 3 views
0

最初のデバイスで変更(たとえば40レコード追加)を実行すると、2番目のデバイスに40 CKQueryNotificationsが表示されることがあります。CloudKitのCKNotificationとCKQueryNotificationの違いは何ですか?

私はCKQueryNotificationsと読むことができますが、私は読むとしてCKNotificationsとマークすることはできません。どうして?すべての起動後、常にデバイスに戻ってきます。どうして?

どのように保留中の通知を取得しますか?私は、読み取りとして通知をマークするにはどうすればよい

var serverChangeToken: CKServerChangeToken? { 
    return UserDefaults(suiteName: SharedGroupName)?.object(forKey: "a") as? CKServerChangeToken 
} 

func fetchPendingNotifications(notifications: [CKNotification] = [], completion: ErrorHandler? = nil) { 

    var queryNotifications = notifications 

    let operation = CKFetchNotificationChangesOperation(previousServerChangeToken: serverChangeToken) 
    let operationQueue = OperationQueue() 

    operation.notificationChangedBlock = { notification in 

     print("+++++ \(notification)") 
     queryNotifications.append(notification) 
    } 

    operation.fetchNotificationChangesCompletionBlock = { token, error in 

     if let token = token { 

      UserDefaults(suiteName: SharedGroupName)?.set(NSKeyedArchiver.archivedData(withRootObject: token), forKey: "a") 
      UserDefaults(suiteName: SharedGroupName)?.synchronize() 
     } 

     if error == nil && operation.moreComing { 
      self.fetchPendingNotifications(notifications: queryNotifications, completion: completion) 
     } else { 
      self.perform(queryNotifications: queryNotifications, completion: completion) 
     } 
    } 

    operationQueue.addOperation(operation) 
} 

func perform(queryNotifications: [CKNotification], completion: ErrorHandler? = nil) { 

    var currentQueryNotifications = queryNotifications 

    if let queryNotification = currentQueryNotifications.first { 

     currentQueryNotifications.removeFirst() 

     let operation = CKMarkNotificationsReadOperation(notificationIDsToMarkRead: [queryNotification.notificationID!]) 
     operation.markNotificationsReadCompletionBlock = { _, _ in 

      print("marked as read") 
      self.perform(queryNotifications: currentQueryNotifications, completion: completion) 
     } 

     OperationQueue().addOperation(operation) 

    } else { 

     completion?(nil) 
    } 
} 

コンソールの出力は何ですか?

+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0> 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
marked as read 
+0

あなたのコードを読んだものとしてマークした場所で共有することはできますか? –

+0

@DaveWeston私は質問 –

答えて

1

読み取り通知が表示され続ける理由については、マニュアルがWWDCビデオと直接矛盾します。 Apple Docsは明らかに(強調追加)言う:

CKMarkNotificationsReadOperationオブジェクトを使用して読み取るとして使用すると、1つのまたは複数の通知をマークすると、これらの通知は ではありませんあなたはpreviousServerChangeTokenのためにnilを指定した場合でも、を返しました。しかし

、WWDC 2014のビデオ231(アドバンストCloudkit)、明らかに削除通知がではありません読んで、常にであることを述べているが、ユーザーの他のデバイスがまだそれらを見ることができるので、戻りました。プレゼンターは、すべてのデバイスで大規模なトランザクションをハイライトするアプリケーションを引用した例も示しています。デバイスが通知を読み取り済みとマークすると、他のデバイスはその「読み取り」通知を見て、ハイライトを無効にする必要があります。これを行うには、「読んだ」とマークされた通知を閲覧できる必要があります。ユーザーのデバイスのいずれかが、この通知を見ている場合は教えてくれる:

  • 既読/未読の状態:

    そこで、我々は、通知の二つの別々の属性を考慮しなければなりません。

  • サーバー変更トークン:各特定のデバイスでどの通知が表示されたかを示します。

受信した変更トークンをフェッチの完了ブロックに保存し、それを後続のフェッチに渡します。これは、デバイスに「新しい」通知のみが表示されるようにする唯一の方法です。ユーザーが別のデバイスのイベントに既に対応しているかどうかを確認するには、読み取り/未読ステータスを使用します。

+0

を更新しました。これは明確にするために、「読んだ」通知です。そして、すべてのデバイスで通知が表示される場合にのみ表示されます。 –

+0

そして、私はどのように読み取り/未読の状態を使用しますか? readNotification型があります。タイプやステータスを意味しますか? –

+0

どれくらいのデバイスがそれを見ていても、決して遠ざかることはありません。 IMAPメールボックスのように考えてください。メッセージが開かれると、そのメールボックスに接続されているすべてのメールリーダーは、そのメッセージを読み取ったものとして表示します。しかし、メッセージ(またはこの場合は通知)はまだ存在し、常にすべてのメールリーダーに表示されます。あなたのシナリオに応じて、あなたは読んだ/未読の状態を気にするかもしれません。特定のデバイスですでに処理した通知を表示しないようにするには、変更トークンをキャッシュし、その後のフェッチにその時点以降の開始を指示します。 – Thunk

関連する問題