【问题标题】:How to push events to IPhone calendar如何将事件推送到 iPhone 日历
【发布时间】:2016-01-26 10:59:27
【问题描述】:

我正在尝试将我的应用程序(Windows 桌面应用程序和 Web 应用程序)与移动日历集成。

我的应用程序应该是

  • 将新事件推送到移动日历
  • 从移动日历中获取事件

到目前为止,我设法与 Google 日历集成(非常简单,simple library + OAuth)

现在我想对 iCloud 日历做同样的事情,但这并不容易。

  • 在 iCould 设置中,我可以公开日历。我可以获取事件(作为 iCalendar 文件),但我无法推送事件。
  • 找不到任何用于 iCould 日历集成的重要库。我尝试了CalDav.Client,但需要提供 CalDAV 服务器 url。根据this 应该看起来像“https://pXX-caldav.icloud.com/USER_ID/calendars/CALENDAR_ID。我不知道USER_IDCALENDAR_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 错误请求

【问题讨论】:

  • 什么是“您的应用程序”?它是一个iOS应用程序吗?还是网络服务?
  • @hnh 这是一个 Windows 桌面应用程序,或者是一个 Web 应用程序(最好是桌面,但 Web 也可​​以)。
  • 编辑 2:很可能 URL 是错误的。仔细(重新)阅读Building a CalDAV Client
  • @gisek,你写了一个成功连接icloud日历的代码吗?
  • @Beetlejuice 不,但老实说我很快就放弃了

标签: c# ios iphone calendar caldav


【解决方案1】:

这是一个很好的介绍:Building a CalDAV client。它还描述了日历发现过程的工作原理(您如何找到日历主页 URL)。

许多 CalDAV 服务器不支持 OAuth,您通常需要向用户询问登录名/密码。

似乎没有用于 CalDAV 的 .NET 库。您可以在此处找到实现列表:http://caldav.calconnect.org/implementations/librariestools.html

总结:可能不像您在 Google 上所做的那样简单,但也没有那么难。一旦拥有它,您就可以连接到许多不同的服务器,因为 CalDAV 是一个标准......(包括 Google,您也可以使用 CalDAV 连接到它)。

编辑问题后更新:

401 是一个通用的HTTP 响应。这意味着您需要提供凭据才能继续请求。客户端通常会提示用户输入登录名/密码,然后重新运行请求。基本身份验证在 Wikipedia article on Basic auth 中有详细描述。

另一个错误是使用p42-caldav.icloud.com 作为入口点URL。使用caldav.icloud.com,因为您不知道用户在哪个分区。您需要使用Building a CalDAV client 中描述的发现过程来查找托管用户日历的实际 URL。

【讨论】:

  • 这部分呢? “我需要提供给 CalDAV 服务器 url。根据这个应该看起来像“pXX-caldav.icloud.com/USER_ID/calendars/CALENDAR_ID。”我在哪里可以找到 USER_ID 和 CALENDAR_ID 值?
  • 发现过程不适用于 iCloud。它需要授权。我什至不确定我是否点击了正确的网址。 ;/ 请查看编辑。
  • 我看了你的回答。我只是觉得提供的链接太笼统了。我现在没有尝试使用 OAuth 做任何事情。问题是我找不到特定于 iCloud 的文档,知道 CalDAV 内部结构对我没有多大帮助。
  • 链接是通用的,因为 CalDAV 是通用的。 iCloud 是一个 CalDAV 服务器,您需要实现它才能可靠地连接到它。例如。您必须实现 Discovery,因为 URL 结构可能会发生变化,而且过去也这样做过。
  • 好的,我同意,但我仍然无法在网上找到任何关于 iCloud 发现规范的说明(即,它们似乎需要某种授权,但我不知道哪一个)甚至没有指定他们的发现服务 URL 是什么。也许我打错了,因此我得到了 401。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多