You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:57:17