Как обнаружить изменения в визитных карточках?

Я разрабатываю библиотеку для редактирования контактов на сервере CardDAV, и мне интересно, как правильно синхронизировать контакты.

Поэтому, когда я обнаруживаю, что etag для определенного контакта изменился: как мне синхронизировать оба?

Я просто комбинирую измененные данные, например. телефонные номера? Или должна победить одна сторона (сервер или клиент)? И как мне определить, изменился ли номер или был добавлен?


person beseder    schedule 02.06.2018    source источник


Ответы (1)


В документе Создание клиента CardDAV все это очень хорошо объясняется.

Но чтобы ответить на ваши вопросы:

Поэтому, когда я обнаруживаю, что etag для определенного контакта изменился: как мне синхронизировать оба?

Вы загружаете vCard с сервера. Дальше все зависит от логики вашего клиента. Вы хотите автоматически объединить? Вы хотите подсказать пользователю, хочет ли он выполнить слияние? И т.п.

Обычно требуется автоматическое слияние. Так что сделай это. После того, как у вас есть объединенная визитная карточка, поместите ее снова на сервер, но обязательно используйте заголовок If-Match, чтобы убедиться, что он не изменился снова на стороне сервера.

Я просто комбинирую измененные данные, например. телефонные номера?

То, что вы считаете полезным, полностью зависит от вашего приложения. Но просто объединение полей может быть не тем, что вам нужно. Например, вы не сможете обнаружить удаления. Таким образом, в большинстве случаев это будет трехстороннее слияние:

  • старая версия сервера (хранится локально)
  • новая версия сервера (которую вы только что скачали)
  • текущая версия локального приложения

Или должна победить одна сторона (сервер или клиент)?

Некоторые клиенты так и делают, но это не обязательно. Однако, если вы модифицируете после изменения, вам нужно быть ОЧЕНЬ осторожным с циклами синхронизации!

И как мне определить, изменился ли номер или был добавлен?

Вы сохраняете старую копию, которую знаете, и diff.

В общем, рекомендуется хранить (последнюю известную) непрозрачную копию сервера локально и просто выбирать поля, которые интересуют вашего клиента. Затем при повторной загрузке элемента вы просто снова исправляете их. (и сохраните остальное, что вам прислал сервер).

Резюме: правильное сравнение vCard и локальный кеш нетривиальны. Многие клиенты терпят неудачу в этом и теряют или обманывают пользовательские данные. Поэтому, если вы не планируете вкладывать в это необходимую работу и тестирование, более простой способ - обнаружить изменения и спросить пользователя, что он хочет сделать (позволить серверу выиграть, заставить пользователя скопировать, объединить).

person hnh    schedule 02.06.2018