如何防止iOS提示在线订阅ICS文件?

How to prevent iOS from suggesting to subscribe to an ICS file online?

我是 运行 一份有关某些活动的时事通讯,我想为其添加“添加到日历”link。

为此,我在 Linode 的 Object 存储(与 S3 兼容)上托管了一些 ICS 文件。这是日历事件的 URL 示例:https://app-statium.eu-central-1.linodeobjects.com/25782331-363c-4ba6-b255-b10f87a30895.ics.

我的问题是,当从 iOS 或 iPadOS 设备点击此 link 时,日历将提供订阅 URL 而不是仅添加来自日历中的文件。这是屏幕截图:

另一方面,在 macOS 上,行为符合预期:日历打开并显示事件。建议不要订阅 URL。

有什么方法可以让 iOS 与这些 link 的 macOS 一样?我调查了一些查询参数或 HTTP header 是否可以说“请不要订阅”但没有找到任何东西。

我找到了解决办法。

TL;DR

e-mail 不应该直接 link 到 ICS 资源。相反,它应该使用带有最终 ICS 资源位置的临时重定向 HTTP 状态代码(即 302、303 或 307)进行响应。

我是怎么到那里的

为了找到这个解决方案,我对 link 进行了逆向工程,它的行为符合我的要求(即添加事件,无订阅)。我发现工作行为和我的行为之间存在以下差异:

  1. 来自 e-mail 的 link 回复了 302
  2. 302 位置的 HTTP get 响应将包含额外的 HTTP headers;
  3. 最终的 ICS 资源将包含额外的元数据。

在尝试模仿这 3 种不同的行为后,只有 302 hack 最终以我想要的方式工作。

我最终回复了一个 better-suited 303,它的行为符合预期。