iOS端如何使用UIActivityViewController实现WhatsApp图文同时分享
问题原因分析
你当前遇到的分享失效主要有两个核心原因:
- 代码里传入的
imageNmae大概率是图片名字符串,不是UIImage实例,系统会直接识别为文本内容,WhatsApp会优先加载文本不会解析图片 - 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
相关产品推荐
相关产品推荐

