Уникальный идентификатор встречи в Outlook при использовании разных компьютеров через синхронизированную учетную запись

Наткнулся на легкое раздражение. Приложение, которое я разрабатываю, имеет встроенную систему календаря, которая передает встречи в календарь icloud в Outlook с целью синхронизации с телефонами, распределенными по нескольким календарям icloud (по одному для каждого человека)

Моя проблема заключается в обновлении этих встреч при внесении изменений в основное приложение. Я уже знаю, что могу использовать AppointmentItem.GlobalAppointmentID для получения идентификатора записи, размещенной в календаре на компьютере, на котором она была создана, однако я склонен полагать, что это уникально только для этой системы (т. е. другой пользователь на другом компьютере с синхронизированным календарем будет другой набор глобальных идентификационных номеров)

Поскольку этот номер отличается для каждого элемента, простое сохранение GlobalAppointmentID в базе данных и обращение к нему при добавлении/удалении/изменении встречи не будет работать в качестве ориентира.

В идеальном мире я бы использовал сервер обмена для обработки всего этого или напрямую изменял встречи в icloud с помощью С# (несмотря на все мои усилия, я не смог найти простой метод для реализации этого)

Я что-то упустил или нет способа идентифицировать уникальную запись о встрече в календаре после ее синхронизации?


person Takarii    schedule 15.03.2016    source источник
comment
Пожалуйста, улучшите свой вопрос. Вы используете панель управления iCloud для Windows для синхронизации элементов с Outlook? Как ваше другое приложение получает доступ к элементам, EventKit? Кроме того, если Exchange — это ваш «идеальный мир», почему бы вам не использовать его, кроме iCloud? Все события iCloud/CalDAV имеют уникальный UID, UID. И то же самое верно для Exchange/Outlook — и вы получаете это по GlobalAppointmentID, как следует из названия. Как вы думаете, почему он уникален для системы, он явно говорит «глобальный» :-) Доступ к быстрому локальному идентификатору осуществляется с помощью свойства EntryID.   -  person hnh    schedule 15.03.2016
comment
EntryID уникален для одного календаря, поэтому у вас может быть 2 встречи с одним и тем же EntryID, но в разных календарях. На основании этот пост MSDN у меня сложилось впечатление, что глобальный идентификатор, который Outlook предоставляет при доступе к атрибуту, по-прежнему локализован, но не изменяется при перемещении встреч между календарями. Использование Panel для синхронизации, но, как уже упоминалось, я изо всех сил пытаюсь найти простой метод для внедрения CalDAV в мою программу на C#.   -  person Takarii    schedule 15.03.2016
comment
Связанный пост явно говорит об этом: глобальный идентификатор объекта одинаков для всех копий элемента. Это особенно верно для iCP, который сопоставляет CalDAV UID с GlobalObjectID (необработанный CalDAV UID также должен быть доступен через свойство MAPI, проверьте OutlookSpy). Кстати: EntryID также обычно не меняется во время перемещений, только если вы оставляете определенный файл данных Outlook (или делаете копию, в этом случае будет создан новый).   -  person hnh    schedule 15.03.2016
comment
Значит, уникальный идентификатор, который я искал — тот самый, который использует icloud и к которому я очень хотел получить доступ — все это время сидел прямо передо мной? Я не знал, что icloud будет сопоставлять указанный идентификационный номер с собственностью.   -  person Takarii    schedule 15.03.2016
comment
Это не совсем то же самое (GID — это двоичная структура, UID — просто строка), но Outlook GlobalObjectID в iCP является производным от CalDAV UID. И, как уже упоминалось, вы также должны иметь доступ к необработанному UID, используя пользовательское свойство Apple. Конечно, реализация этого может измениться. Кстати: я думаю, то же самое верно, если сам Outlook импортирует приглашения на встречи iCalendar и т. Д. Больше не помню всех деталей.   -  person hnh    schedule 15.03.2016


Ответы (1)


Ваш подход правильный. GlobalAppointmentID — правильный способ получить глобальный идентификатор для Элемент календаря Outlook:

Глобальный идентификатор объекта одинаков для всех копий элемента.

Подробную информацию о связанных с этим свойствах можно найти в MS-OXOCAL< /а>.

В случае панели управления iCloud GlobalAppointmentID будет производным от UID свойство iCalendar. Он также должен иметь необработанный iCalendar UID, доступный в отдельном свойстве MAPI (вы можете найти его с помощью такого инструмента, как OutlookSpy — инструмент, который стоит купить, если вы действительно хотите серьезно заняться разработкой MAPI).

Обратите внимание, что вы должны использовать GlobalAppointmentID только для операций, которые являются кросс-папками. Локальным идентификационным свойством является EntryID, который подобен первичному ключу в реляционной базе данных.

P.S.: Этот вопрос содержит некоторую информацию о создании Клиент CalDAV. В зависимости от того, что именно вы хотите сделать, это может быть не так сложно — это просто HTTP-протокол с текстовой полезной нагрузкой (iCalendar).

person hnh    schedule 15.03.2016
comment
Замечательно. Мне нужно было проверить это должным образом, но это отлично отвечает на мой вопрос. Спасибо - person Takarii; 16.03.2016