移动浏览器(iOS)中的javascript无法下载日历邀请

时间:2018-07-08 12:12:00

标签: javascript ios mobile-safari

我有一个js客户端应用程序,其中创建了一个日历事件,并希望将其作为ics文件下载到客户端。在桌面浏览器上可以正常使用,但iOS上的移动浏览器(和移动chrome)拒绝下载。

这是我用于该函数的代码:

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

当我使用上面的代码并单击我的链接时,移动浏览器会告诉“该网站正试图向您显示日历邀请。您要允许吗?”带有“忽略”和“允许”链接。但是,单击“允许”链接会导致:

“ Safari无法下载此文件”。

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

我也尝试过创建一个Blob,但野生动物园拒绝以完全相同的方式下载该Blob。

我也尝试过base64编码,但野生动物园再次拒绝(并给出404)

有人知道允许iOS野生动物园(客户端)将此文件下载到日历的方法吗?

旁注:如果我改为从服务器发送ical流,并设置各种标头,则可以正常工作,但是我想在客户端完成所有操作,却看不到为什么需要服务器,全部存在正确的ics信息。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

我有类似的问题,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' })

它开始工作。