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.