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

如何在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内容适配不同分享场景。

实现步骤

  1. 自定义遵守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
    }
}
  1. 使用自定义数据源初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:54:02