移动 safari (iOS) 中的 javascript 不会下载日历邀请

Posted

技术标签:

【中文标题】移动 safari (iOS) 中的 javascript 不会下载日历邀请【英文标题】:javascript in mobile safari (iOS) won't download calendar invite 【发布时间】:2018-07-08 12:12:00 【问题描述】:

我有一个 js 客户端应用程序,我在其中创建了一个日历事件,并希望将其作为 ics 文件下载到客户端。这在桌面浏览器上运行良好,但 ios 上的移动 safari(和移动 chrome)拒绝下载它。

这是我用于该功能的代码:

let link = document.createElement('a')
// link.setAttribute('target', '_blank')
link.href = ics_string_from_indexedDB
link.download = 'Reminders.ics'
link.click()

当我使用上面的代码并单击我的链接时,移动 safari 会提示“该网站正在尝试向您显示日历邀请。您要允许这样做吗?”带有“忽略”和“允许”链接。但是点击“允许”链接会导致:

“Safari 无法下载此文件”。

我已尝试按照其他地方的建议(并在上面注释掉)添加目标,但这也不起作用,如果存在,单击我的链接根本没有任何作用。

我也尝试过创建一个 blob,但 safari 拒绝以完全相同的方式下载它。

我也尝试过 base64 编码,但 safari 再次拒绝(并给出 404)

有谁知道允许 iOS Safari(客户端)将此文件下载到日历的方法?

旁注:如果我从服务器发送 ical 流并设置各种标头,我可以让它工作,但我想在客户端做这一切,不明白为什么我需要一个服务器,所有存在正确的 ics 信息。

【问题讨论】:

【参考方案1】:

好吧,我自己解决了这个问题,这是我学到的:

Mobile Safari 对于它认为有效的 .ics 文件非常挑剔,它根本无法识别它不喜欢的文件。即使它是有效的,即使桌面上的 iCal 和其他应用程序(以及桌面上的 Safari!)也可以很好地识别和导入这些 ics 文件。

我在我的服务器上使用了我之前使用的相同的 php 生成器,因为它似乎以 Mobile Safari 喜欢的格式生成文件。我没有时间详尽地测试它需要和不需要哪些字段,但如果我不得不猜测查看源代码,它可能与时区相关,或者可能是 UID 的格式。如果我在这个项目之后有时间,我会尝试对此进行更具体的说明。

一旦我的格式一切正常,从我的本地 indexedDB 下载 blob 现在就可以正常工作了:

let blob = new Blob([ics_string_from_indexedDB],  type: 'text/calendar' )
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Reminders.ics'
link.click()

【讨论】:

我使用了相同的方法,它有效,但有一个烦人的问题。该文件已正确下载,但未自动添加到日历中。它发生在 iPhone 上,但不会发生在其他设备上。【参考方案2】:

我遇到了类似的问题,iPhone 不想识别 .ics 文件。问题出在 charset=utf-8

let blob = new Blob([ics_string_from_indexedDB], type: 'text/calendar;charset=utf-8' )

当我删除它时

let blob = new Blob([ics_string_from_indexedDB], type: 'text/calendar' )

它开始工作了。

【讨论】:

以上是关于移动 safari (iOS) 中的 javascript 不会下载日历邀请的主要内容,如果未能解决你的问题,请参考以下文章

移动端 ios Safari 问题及 一般解决方法

移动 Safari 独立模式中的可见性更改

如何检测移动到 Mobile Safari 中的新选项卡

防止 iOS 移动 Safari 闲置/自动锁定/休眠?

是否可以通过单击应用程序 WebView 中的 URL 来打开移动 Safari?

Safari(移动)IOS - 单击外部时输入不会失去焦点