Как однозначно идентифицировать EKEvent с помощью синхронизации на всех устройствах

Я пытаюсь создать функцию синхронизации событий для проекта. Мне нужно синхронизировать события с удаленным сервером.

  • Допустим, я установил приложение на устройство А.
  • Если я вхожу на другое устройство, позволяющее взять B, то события, синхронизированные с A, также должны отображаться на устройстве B, и события B также должны быть синхронизированы.
  • Теперь, если я снова войду в устройство A, события B должны быть добавлены. Но события, ранее полученные от A, не должны снова добавляться на устройство A. Для этого я решил сохранить его eventIdentifier в удаленной базе данных. .
  • Проблема теперь возникает, когда я снова возвращаюсь к устройству B, где события, ранее синхронизированные с устройства A, уже есть, поэтому эти события не следует добавлять снова. Но поскольку eventIdentifiers соответствовало устройству A, невозможно определить, добавлено ли событие уже на устройстве B или нет.

Может ли кто-нибудь предложить мне способ добиться такой кросс-платформенной синхронизации событий без дублирования события?

EKEvent имеет свойство eventIdentifier, но это только свойство readOnly, и я не могу где-то хранить удаленный идентификатор события.


person Mrug    schedule 26.11.2015    source источник


Ответы (1)


eventIdentifier не распределяется между устройствами — одно и то же событие, скорее всего, будет иметь разные eventIdentifier на разных устройствах.

Вместо этого вам нужно использовать calendarItemExternalIdentifier — это (как правило) одно и то же на разных устройствах.
Одно (относительно редкое) исключение — когда событие было недавно создано с помощью EventKit, и оно было еще не синхронизированы с сервером. Это приводит к тому, что calndarItemExternalIdentifier изменяется позже.

Используя calendarItemExternalIdentifier, вы можете проверить, было ли уже добавлено событие, запросив, есть ли уже запись с таким же calendarItemExternalIdentifier в вашей базе данных. Исключение, описанное выше, необходимо обрабатывать отдельно.

person alex-i    schedule 30.11.2015
comment
Будет ли это работать и для Andorid? потому что события будут синхронизироваться на телефоне Android, а также на iPhone - person Mrug; 01.12.2015
comment
EventKit недоступен на Android. Вы можете синхронизироваться, подключившись напрямую к серверам (CalDav, Exchange и т. д.), которые должны давать те же идентификаторы (предполагается, что calendarItemExternalIdentifier является идентификатором, хранящимся на серверах). В этом случае у вас будет меньше головной боли (меньше конфликтов), если вы будете выполнять синхронизацию с внешними серверами через свой сервер, а не с каждого устройства отдельно. - person alex-i; 01.12.2015