如何通过ShareLink共享日历事件?Swift Transferable实现问题
自定义Transferable结构体实现日历事件分享问题
我需要让自定义的Event结构体实现Transferable协议,从而能在ShareLink中使用:
ShareLink(item: event, preview: SharePreview(event.name))
我做了以下三次尝试,均未达到预期效果:
尝试1:生成VCalendar字符串并转换为Data
通过拼接VCalendar格式字符串生成Data,代码如下:
struct Event: Transferable, ... { ... let uuid: String let name: String var isoDate: String { ... } // 格式为yyyymmddThhmmssZ ... static var transferRepresentation: some TransferRepresentation { DataRepresentation(exportedContentType: .calendarEvent) { event in return "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:\(event.uuid)\nDTSTAMP:\(event.isoDate)\nDTSTART:\(event.isoDate)\nDTEND:\(event.isoDate)\nSUMMARY:\(event.name)\nEND:VEVENT\nEND:VCALENDAR".data(using: .utf8) ?? Data() } } }
问题:此时ShareLink仅显示AirDrop选项,且AirDrop传输始终失败;但如果将exportedContentType改为UTType.plainText,导出的.txt文件重命名为.ics后可以正常导入日历。
尝试2:创建EKEvent并转换为Data
尝试通过EKEvent生成日历数据,代码框架如下:
struct Event: Transferable, ... { ... let uuid: String let name: String var isoDate: String { ... } ... static var transferRepresentation: some TransferRepresentation { DataRepresentation(exportedContentType: .calendarEvent) { event in let ekevent = EKEvent() // 配置EKEvent属性 ... // 尝试转换为Data失败 return ... } } }
问题:ekevent as Data和Data(ekevent)两种方式都无法完成EKEvent到Data的转换。
尝试3:直接在ShareLink中使用EKEvent
直接用EKEvent作为ShareLink的item,但EKEvent并未实现Transferable协议,无法直接使用。
内容的提问来源于stack exchange,提问作者AlexR28
相关产品推荐
相关产品推荐

