javascript 在移动版 Safari (iOS) 中不会下载日历邀请
javascript in mobile safari (iOS) won't download calendar invite
我有一个 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()
当我使用上面的代码并点击我的 link 时,移动版 Safari 会用 "Ignore" 和 "Allow" link 告诉 "This website is trying to show you a calendar invite. Do you want to allow this?"。但是点击 "Allow" link 结果:
"Safari cannot download this file".
我已经尝试按照其他地方的建议添加一个目标(并在上面注释掉),但这也不起作用,如果存在,点击我的 link 根本没有任何作用。
我也试过创建一个 blob,但 safari 拒绝以完全相同的方式下载它。
我也尝试过 base64 编码,但 safari 再次拒绝(并给出 404)
有人知道允许 iOS safari(客户端)将此文件下载到日历的方法吗?
旁注:如果我改为从服务器发送 ical 流并设置各种 headers,我可以使它工作,但我想在客户端完成这一切,但不明白为什么我应该需要一个服务器,所有正确的 ics 信息都存在。
好吧,我自己解决了这个问题,这是我学到的:
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 不想识别 .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' })
它开始工作了。
我有一个 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()
当我使用上面的代码并点击我的 link 时,移动版 Safari 会用 "Ignore" 和 "Allow" link 告诉 "This website is trying to show you a calendar invite. Do you want to allow this?"。但是点击 "Allow" link 结果:
"Safari cannot download this file".
我已经尝试按照其他地方的建议添加一个目标(并在上面注释掉),但这也不起作用,如果存在,点击我的 link 根本没有任何作用。
我也试过创建一个 blob,但 safari 拒绝以完全相同的方式下载它。
我也尝试过 base64 编码,但 safari 再次拒绝(并给出 404)
有人知道允许 iOS safari(客户端)将此文件下载到日历的方法吗?
旁注:如果我改为从服务器发送 ical 流并设置各种 headers,我可以使它工作,但我想在客户端完成这一切,但不明白为什么我应该需要一个服务器,所有正确的 ics 信息都存在。
好吧,我自己解决了这个问题,这是我学到的:
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 不想识别 .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' })
它开始工作了。