CloudKit Ошибка: изменение токена истекло, требуется сброс

Swift 3.1, Xcode 8.3.3

Я получаю сообщение об ошибке от CloudKit и не знаю, что с этим делать.

Я отслеживаю уведомления от CloudKit следующим образом:

let operation = CKFetchNotificationChangesOperation(previousServerChangeToken: previousChangeToken)

//Hold the notification IDs we processed so we can tell CloudKit to never send them to us again
var notificationIDs = [CKNotificationID]()

operation.notificationChangedBlock = { [weak self] notification in
  guard let notification = notification as? CKQueryNotification else { return }
  if let id = notification.notificationID {
    notificationIDs.append(id)
  }
}

operation.fetchNotificationChangesCompletionBlock = { [weak self] newToken, error in
  if let error = error{
    print(error) //<-- <!> This is the error <!>
  }else{
    self?.previousChangeToken = newToken

    //All records are in, now save the data locally
    let fetchOperation = CKFetchRecordsOperation(recordIDs: recordIDs)

    fetchOperation.fetchRecordsCompletionBlock = { [weak self] records, error in
      if let e = error {
        print("fetchRecordsCompletionBlock Error fetching: \(e)")
      }
      //Save records to local persistence...
    }

    self?.privateDB.add(fetchOperation)

    //Tell CloudKit we've read the notifications
    let operationRead = CKMarkNotificationsReadOperation(notificationIDsToMarkRead: notificationIDs)
    self?.container.add(operationRead)
  }
}

container.add(operation)

И ошибка говорит:

CKServerChangeToken в документации ничего не говорится о сбросе токена, а на панели инструментов CloudKit такой опции нет.

Есть идеи, что я должен делать?

1 ответ

Решение

Этот код ошибки CKErrorCodeChangeTokenExpiredи это указывает на то, что вам нужно повторно синхронизировать ваши изменения.

https://developer.apple.com/documentation/cloudkit/ckerror/2325216-changetokenexpired

Этот код ошибки возвращается, когда токен изменения слишком старый или контейнер был сброшен (сброс контейнера делает недействительными старые токены изменения).

Комментарии, связанные с этим кодом ошибки:

(Описание самого кода):

Значение предыдущего ServerChangeToken слишком старое, и клиент должен выполнить повторную синхронизацию с нуля

(При выполнении различных операций извлечения / обновления блоков):

Если сервер возвращает ошибку CKErrorChangeTokenExpired, serverChangeToken, используемый для этой зоны записи, когда инициирование этой операции было слишком старым, и клиент должен сбросить свой локальный кэш и повторно получить изменения в этой зоне записи, начиная с nil serverChangeToken.

Другие вопросы по тегам