Как перенести события в календарь iPhone

Я пытаюсь интегрировать свое приложение (настольное приложение Windows и веб-приложение) с мобильными календарями.

Мое приложение должно

  • помещать новые события в мобильные календари
  • получать события из мобильных календарей

Пока мне удалось интегрировать с календарем Google (очень просто, простая библиотека + OAuth)

Теперь я хочу сделать то же самое с календарем iCloud, но это не так просто.

  • В настройках iCould я могу сделать календарь общедоступным. Затем я могу получать события (как файл iCalendar), но не могу отправлять события.
  • Не удалось найти никаких серьезных библиотек для интеграции календаря iCould. Я попробовал CalDav.Client, но мне нужно предоставить CalDAV URL-адрес сервера. согласно это должно выглядеть как "https://pXX-caldav.icloud.com/USER_ID/calendars/CALENDAR_ID. I понятия не имею, что такое USER_ID и CALENDAR_ID и где их найти.

Любые идеи?

PS

Есть обходной путь. Я могу попросить пользователя создать аккаунт Google вместе с календарем и использовать его в качестве прокси. Интегрируйте iPhone с календарем Google и с другого сайта интегрируйте мое приложение с календарем Google. Это работает, но настройка утомительна для пользователя.

ИЗМЕНИТЬ

Я пробовал следовать инструкциям @hnh и обнаружил CalDAV следующим образом:

PROPFIND https://p42-caldav.icloud.com/ HTTP/1.1
Depth: 0
Prefer: return-minimal
Content-Type: application/xml; charset=utf-8
Host: p42-caldav.icloud.com
Content-Length: 102

<d:propfind xmlns:d="DAV:">
  <d:prop>
     <d:current-user-principal />
  </d:prop>
</d:propfind>

Результат был 401:

HTTP/1.1 401 Unauthorized
Content-Type: text/html;charset=utf-8
WWW-Authenticate: x-mobileme-authtoken realm="MMCalDav"
WWW-Authenticate: basic realm="MMCalDav"
Server: iCloudCalendarServer 15G33
Date: Tue, 26 Jan 2016 12:46:14 GMT
X-Responding-Server: mr26p42ic-ztdg05101801 17 a63660a6f7d1a25b5a7ed66dab0da843
X-Transaction-Id: c8dc19d4-c42a-11e5-8381-008cfaeb448c
Content-Length: 141
Strict-Transport-Security: max-age=31536000; includeSubDomains

<html><head><title>Unauthorized</title></head><body><h1>Unauthorized</h1><p>You are not authorized to access this resource.</p></body></html>

ИЗМЕНИТЬ 2

Следуя дальнейшим инструкциям, мне удалось пройти аутентификацию, но все еще есть проблемы с запросами из статьи:

Для:

<d:propfind xmlns:d="DAV:" xmlns:cs="http://calendarserver.org/ns/">
  <d:prop>
     <d:displayname />
     <cs:getctag />
  </d:prop>
</d:propfind>

Я получаю: (ctag не найдено, и displayName со значением "tmp", которое я не узнаю)

<?xml version='1.0' encoding='UTF-8'?>
<multistatus xmlns='DAV:'>
  <response>
    <href>/</href>
    <propstat>
      <prop>
        <displayname>tmp</displayname>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
    <propstat>
      <prop>
        <getctag xmlns='http://calendarserver.org/ns/'/>
      </prop>
      <status>HTTP/1.1 404 Not Found</status>
    </propstat>
  </response>
</multistatus>

И для этого:

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
    <d:prop>
        <d:getetag />
        <c:calendar-data />
    </d:prop>
    <c:filter>
        <c:comp-filter name="VCALENDAR" />
    </c:filter>
</c:calendar-query>

Я получаю 400 неверных запросов


person Andrzej Gis    schedule 26.01.2016    source источник
comment
Что такое «ваше приложение»? Это приложение для iOS? Или веб-сервис?   -  person hnh    schedule 26.01.2016
comment
@hnh Это настольное приложение Windows или веб-приложение (желательно настольное, но подойдет и веб).   -  person Andrzej Gis    schedule 26.01.2016
comment
Изменить 2: вполне вероятно, что URL-адреса неверны. Внимательно (повторно) прочтите Создание клиента CalDAV.   -  person hnh    schedule 27.01.2016
comment
@gisek, вы написали код, который успешно подключается к календарю icloud?   -  person Beetlejuice    schedule 19.11.2017
comment
@Beetlejuice Нет, но, честно говоря, я довольно быстро сдался   -  person Andrzej Gis    schedule 19.11.2017


Ответы (1)


Это хорошее введение: Создание клиента CalDAV. Он также описывает, как работает процесс обнаружения календаря (как найти URL-адрес домашнего набора календаря).

Многие серверы CalDAV не поддерживают OAuth, обычно вам придется запрашивать у пользователя логин / пароль.

Похоже, что для CalDAV нет библиотеки .NET. Вы можете найти список реализаций здесь: http://caldav.calconnect.org/implementations/librariestools.html.

Резюме: Наверное, не так просто, как то, что вы сделали с Google, но и не очень сложно. И как только он у вас есть, вы можете подключаться ко многим различным серверам, учитывая, что CalDAV является стандартом ... (включая Google, вы также можете подключиться к нему с помощью CalDAV).

Обновление после РЕДАКТИРОВАНИЯ вопроса:

401 - это общий ответ HTTP. Это означает, что вам необходимо предоставить учетные данные, чтобы продолжить выполнение запроса. Клиент обычно запрашивает у пользователя логин / пароль, а затем повторно запускает запрос. Базовая аутентификация хорошо описана в статье о базовой аутентификации Википедии.

Другая ошибка - использовать p42-caldav.icloud.com в качестве URL-адреса точки входа. Используйте caldav.icloud.com, поскольку вы не знаете, в каком разделе находится пользователь. Чтобы найти фактический URL-адрес, на котором размещен календарь пользователя.

person hnh    schedule 26.01.2016
comment
Что насчет этой части? Мне нужно предоставить URL-адрес сервера CalDAV. который в соответствии с этим должен выглядеть как pXX-caldav.icloud.com/USER_ID/calendars/CALENDAR_ID. Где я могу найти значения USER_ID и CALENDAR_ID? - person Andrzej Gis; 26.01.2016
comment
Процесс обнаружения не работает с iCloud. Требуется авторизация. Я даже не уверен, что попал по правильному URL-адресу. ; / См. Редактирование, пожалуйста. - person Andrzej Gis; 26.01.2016
comment
Я прочитал твой ответ. Я просто считаю предоставленную ссылку слишком общей. Я сейчас ничего не пытаюсь делать с помощью OAuth. Проблема в том, что я не могу найти документацию, относящуюся к iCloud, и знание внутреннего устройства CalDAV мне не очень помогает. - person Andrzej Gis; 26.01.2016
comment
Ссылка является общей, поскольку CalDAV является универсальным. iCloud - это сервер CalDAV, вам необходимо реализовать его, чтобы надежно подключаться к нему. Например. вы должны реализовать Discovery, поскольку структура URL-адреса может измениться, и это было в прошлом. - person hnh; 26.01.2016
comment
Хорошо, я согласен, но все же я не могу найти никаких инструкций в Интернете о том, каковы спецификации iCloud для обнаружения (т.е. кажется, что они требуют какой-то авторизации, но я не знаю, какая). URL их службы обнаружения. Может, я ошибся и получил 401. - person Andrzej Gis; 26.01.2016
comment
iCloud работает точно так, как описано в опубликованной мной ссылке. Вы не сможете обнаружить домашний URL-адрес пользователя, если не предоставите ему учетные данные. 401 является частью общего HTTP и определено в RFC2616. . Я уже упоминал, какой из них вам нужен: базовый. Об этом говорится в ответе (WWW-Authenticate: basic.). - person hnh; 26.01.2016
comment
Спасибо. Это подтолкнуло меня немного дальше, но не намного. Не могли бы вы взглянуть на EDIT2? - person Andrzej Gis; 26.01.2016
comment
Вы получаете tmp, потому что вы нажимаете / (root) вместо правильной коллекции CalDAV. Выполните процесс обнаружения, как описано в Building a CalDAV client. Здесь есть все необходимые детали. - person hnh; 17.11.2017
comment
Привет, @hnh, у меня проблема с созданием нового события для календаря iCloud. Каким-то образом это всегда приводит к 400 Bad Request. Я установил PUT для метода, установил If-None-Match: * для заголовка, использовал пример содержимого отсюда https://tools.ietf.org/html/rfc4791#section-5.3.2 и установил этот https://p46-caldav.icloud.com/[USER_ID]/calendars/work/dfsfsdfsfsfsfsdfsdfsdf.ics как адрес назначения uri. Вы хоть представляете, что может быть не так? - person Yusril Maulidan Raji; 06.06.2018
comment
на случай, если кому-то понадобится более подробная информация по моему вопросу: stackoverflow.com/questions/50720196/ - person Yusril Maulidan Raji; 06.06.2018