如何在UIActivityViewController中同时显示URL图标与分享文本
UIActivityViewController同时显示URL图标和文本的解决方法
问题复现
尝试多种方法在UIActivityViewController中同时展示URL图标和文本均未成功,测试代码如下:
示例1:同时传递文本和URL
let text = "I am text" let myWebsite = URL(string:"https://www.youtube.com/") let shareAll = [text, myWebsite] as [Any] let activityViewController = UIActivityViewController(activityItems: shareAll, applicationActivities: nil) self.present(activityViewController, animated: true, completion: nil)
效果:仅显示文本内容,无URL预览图标。
示例2:仅传递URL
let myWebsite = URL(string:"https://www.youtube.com/") let shareAll = [myWebsite] as [Any] let activityViewController = UIActivityViewController(activityItems: shareAll, applicationActivities: nil) self.present(activityViewController, animated: true, completion: nil)
效果:正常显示URL对应的预览图标。
问题原因
直接将文本和URL放在同一个数组中作为activityItems参数传入时,系统会默认将整体内容识别为文本类型,不会触发URL的预览渲染逻辑,只有纯URL传入的场景下才会拉取链接预览、展示对应图标。
解决方案
通过实现UIActivityItemSource协议自定义分享数据源,指定占位内容为URL,让系统提前触发链接预览逻辑,同时返回完整的文本+URL内容适配不同分享场景。
实现步骤
- 自定义遵守
UIActivityItemSource协议的分享数据源类
import UIKit import LinkPresentation class CustomShareItemSource: NSObject, UIActivityItemSource { private let shareText: String private let shareURL: URL private let linkMetadata: LPLinkMetadata init(text: String, url: URL) { self.shareText = text self.shareURL = url self.linkMetadata = LPLinkMetadata() super.init() // 提前配置链接元数据,iOS15+可直接用系统拉取的预览 linkMetadata.originalURL = url linkMetadata.url = url linkMetadata.title = text } func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { // 占位返回URL,触发系统预览渲染 return shareURL } func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? { // 实际分享时返回文本和URL的组合 return [shareText, shareURL] } func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? { // 返回自定义的链接元数据,控制预览展示效果 return linkMetadata } }
- 使用自定义数据源初始化UIActivityViewController
guard let targetURL = URL(string: "https://www.youtube.com/") else { return } let shareText = "I am text" let shareSource = CustomShareItemSource(text: shareText, url: targetURL) let activityVC = UIActivityViewController(activityItems: [shareSource], applicationActivities: nil) present(activityVC, animated: true)
效果说明
通过上述方式实现后,系统会优先识别到URL占位内容,渲染对应的链接预览图标,同时实际分享时会带上设置的自定义文本,适配微信、短信、邮件等不同分享渠道的内容展示规则。
内容的提问来源于stack exchange,提问作者Muhammad Faizan Naeem
相关产品推荐
相关产品推荐

