移动 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 不会下载日历邀请的主要内容,如果未能解决你的问题,请参考以下文章