我有一个包含音频的字符串和 URL,想通过 Sharelink 分享两者。
我已经写了一个可转让的:
struct TransferableTextAndAudio: Codable, Transferable {
let text: String
let audio: URL
static var transferRepresentation: some TransferRepresentation {
ProxyRepresentation(exporting: \.text)
FileRepresentation(exportedContentType: .audio) { item in
return SentTransferredFile(item.audio, allowAccessingOriginalFile: true)
}
}
}
与我分享:
ShareLink(item: TransferableTextAndAudio(text: "String to share", audio: audioUrl),
preview: SharePreview("Preview")) {
Label("Share text and audio", systemImage: "square.and.arrow.up")
}
但是,只有文本被共享。当我注释掉 ProxyRepresentation 行时,音频被共享。为什么会这样?我是不是对 Transferable 的工作原理有些不了解?
共享一个具有多种表示的可转让项目仍然只是共享一个项目。只会选择一个表示。由于您将文本表示放在首位,因此将优先考虑该表示。
您需要使用一个
ShareLink
接受多个项目的初始化器,例如这个。将文本和音频文件共享为两个单独的项目。令人讨厌的是,这两个项目需要是同一类型。您可以编写一个包含两个案例的枚举,如下所示:确保
exportingCondition
每个枚举案例都使用正确的表示形式。然后你可以写:
Mail.app 会将文本放在电子邮件正文中并附加音频文件,但最终由接收应用程序决定如何处理这两项。