Tenho uma String e uma URL contendo áudio e quero compartilhar ambas por meio de um Sharelink.
Eu escrevi um Transferível:
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)
}
}
}
e compartilho com:
ShareLink(item: TransferableTextAndAudio(text: "String to share", audio: audioUrl),
preview: SharePreview("Preview")) {
Label("Share text and audio", systemImage: "square.and.arrow.up")
}
No entanto, apenas o texto é compartilhado. Quando eu comento a linha ProxyRepresentation, então o áudio é compartilhado. Por que isso? Eu perco algum entendimento de como o Transferable funciona?
Compartilhar um item transferível com múltiplas representações ainda é compartilhar apenas um item. Apenas uma representação será escolhida. Como você coloca a representação de texto primeiro, essa é a que será priorizada.
Você precisa usar um dos
ShareLink
inicializadores que pegam vários itens, como este . Compartilhe o texto e o arquivo de áudio como dois itens separados. Os dois itens irritantemente precisam ser do mesmo tipo. Você pode escrever um enum com dois casos como este:Os
exportingCondition
s garantem que a representação correta seja usada para cada caso de enumeração.Então você pode escrever:
O Mail.app colocará o texto no corpo do e-mail e anexará o arquivo de áudio, mas, em última análise, cabe ao aplicativo receptor decidir o que fazer com esses dois itens.