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

iOS端如何使用UIActivityViewController实现WhatsApp图文同时分享

问题原因分析

你当前遇到的分享失效主要有两个核心原因:

  1. 代码里传入的imageNmae大概率是图片名字符串,不是UIImage实例,系统会直接识别为文本内容,WhatsApp会优先加载文本不会解析图片
  2. WhatsApp iOS端原生规则默认不支持直接同时接收独立的图片+文本两个分享项,会优先选择其中一类内容进行分享
解决方案

方案1:使用自定义UIActivityItemSource适配WhatsApp

通过实现UIActivityItemSource协议,可以针对不同的分享App返回对应支持的内容格式,适配大部分版本的WhatsApp图文分享需求:

// 先扩展添加WhatsApp的活动类型
extension UIActivity.ActivityType {
    static let whatsApp = UIActivity.ActivityType(rawValue: "net.whatsapp.WhatsApp.ShareExtension")
}

// 定义分享内容模型
class ShareItemSource: NSObject, UIActivityItemSource {
    let image: UIImage
    let text: String
    
    init(image: UIImage, text: String) {
        self.image = image
        self.text = text
        super.init()
    }
    
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return image
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        if activityType == .whatsApp {
            return [image, text]
        }
        return [image, text]
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        return text
    }
}

// 调用代码
guard let shareImage = UIImage(named: "你的实际图片名") else { return }
let itemSource = ShareItemSource(image: shareImage, text: "Share text")
let activityViewController = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view
activityViewController.excludedActivityTypes = [.airDrop]

activityViewController.completionWithItemsHandler = {(activityType: UIActivity.ActivityType?, completed: Bool, returnedItems:[Any]?, error: Error?) in
    self.shareMainView.isHidden = true
}
if let viewController = UIApplication.topMostViewController {
    viewController.present(activityViewController, animated: true)
}

方案2:通过带OG标签的链接实现图文展示

你观察到其他应用分享URL时的图文效果,本质是URL对应的网页配置了OpenGraph标签,WhatsApp会自动爬取页面的og:title、og:description、og:image内容自动生成图文卡片,这种方式兼容性最好,你只需要给activityItems传入对应的URL即可,不需要额外传图片和文本。

方案3:合并图文为单张图片

如果方案1不生效,可以将文字绘制到图片上生成合并后的单张图片再分享,兼容性最高:

// 图文合并方法
func combineTextToImage(image: UIImage, text: String) -> UIImage? {
    let textHeight: CGFloat = 60
    let newSize = CGSize(width: image.size.width, height: image.size.height + textHeight)
    UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale)
    
    // 绘制原图
    image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
    // 绘制文字背景
    UIColor.white.setFill()
    UIRectFill(CGRect(x: 0, y: image.size.height, width: newSize.width, height: textHeight))
    // 绘制文字
    let textAttr = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor.black]
    text.draw(in: CGRect(x: 16, y: image.size.height + 16, width: newSize.width - 32, height: textHeight - 32), withAttributes: textAttr)
    
    let resultImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return resultImage
}

使用时直接把合并后的图片传入UIActivityViewController即可。

注意事项
  • 确认传入的是有效UIImage实例,不要直接传图片名字符串
  • WhatsApp iOS端的分享规则会随版本更新调整,建议用正式版App测试
  • 图片过大会导致分享失败,分享前可以适当压缩图片体积

内容的提问来源于stack exchange,提问作者Ameret

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:09:00