CALDAV编辑/删除ICLOUD中的多个事件

时间:2018-07-06 10:23:23

标签: c# ios icloud icalendar caldav

我已经实现了caldav api在icloud日历中添加,更新,删除事件,并且一切都按预期工作。当涉及到在一个api调用中添加,更新,删除多个事件时,添加工作不会出现很多问题。但是不确定如何在一个api调用中编辑和删除多个事件。

下面的代码将使我了解如何删除一个事件

public void DeleteEvent(CalendarToken authToken, string eventId, Action<APIResponse> callback)
    {
        var appleToken = GetAppleAuthToken(authToken);
        string url = @"https://" + appleToken.AppleCalendarDomainUrl + "/" + appleToken.AppleUserID + "/calendars/home/" + eventId + "_event.ics";
        string response = SendRequest(appleToken, url, string.Empty, "DELETE", "application/xml; charset=utf-8", "0");

    }
private string SendRequest(AppleCalendarToken appleToken, string destinationUrl, string requestData, string methodType, string contentType, string depthValue)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
            byte[] bytes;
            bytes = System.Text.Encoding.ASCII.GetBytes(requestData);
            request.Credentials = GetCredentials(appleToken, destinationUrl);
            request.PreAuthenticate = true;
            request.ContentType = contentType; //"application/xml; encoding='utf-8'";
            request.ContentLength = bytes.Length;
            request.Method = methodType;
            request.Headers.Add("Depth", depthValue);
            request.Accept = "*/*";
            request.UserAgent = "cURL based CalDAV client";
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            HttpWebResponse response;
            response = (HttpWebResponse)request.GetResponse();
            if ((int)response.StatusCode == 207 || (int)response.StatusCode == 201)
            {
                Stream responseStream = response.GetResponseStream();
                return new StreamReader(responseStream).ReadToEnd();

            }
        }
        catch
        {
            throw;
        }

        return string.Empty;
    }

下面的屏幕快照将显示如何在一个api调用中添加多个事件 enter image description here 我正在寻找在一个api调用中编辑/删除多个事件。 任何帮助,将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,该问题的答案很短:WebDAV / CalDAV中没有批量删除功能。您需要一个一个地删除它们。

(您可以使用单个DELETE删除整个日历集合,但这可能不是您想要的。)

更新/说明:标准CalDAV / WebDAV不支持任何批量更改操作。您可以使用多个连接,HTTP / 2复用或HTTP / 1.1流水线同时向服务器发送多个HTTP请求。如果服务器很聪明,它可以合并这些更改。至少可以使用HTTP / 2,这可以说消除了对BATCH操作的需要。

执行批量更改有两种非标准方式:

  • a)单个vCalendar实体的POST,其中包含到集合URL的多个事件
  • b)Apple Calendar Server和iCloud(可能还有其他)支持的calendarserver-bulk-change draft

对“ a)”中的集合的POST(有时甚至是PUT)允许您添加(有时通过使用匹配的UID)多个事件。实际上,许多服务器都以一种或另一种方式支持此功能。我建议不要使用它,因为语义非常不清楚/不规范。例如,如果一个子PUT失败等会发生什么情况。

Bulk-Change草稿描述了用于批量更改的POST,但是(AFAIK)并未广泛实施。它也从未成为RFC(并且由于带有HTTP / 2,所以有点多余,我不希望这样)。