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

使用UIActivityViewController分享图片至WhatsApp时触发连接中断错误

问题:UIActivityViewController分享图片至WhatsApp时出现插件连接中断错误

错误信息

[u 3F6F03F6-805B-4DF3-B3C5-188EA72B9C0C:m (null)]
[net.whatsapp.WhatsApp.ShareExtension(24.15.79)] Connection to plugin interrupted while in use.

原实现代码

let shareButtonAction = UIAction { [weak self] _ in
    if let imageSource = self!.imageView.imageSource{
        let items = [imageSource as AnyObject]
        let ac = UIActivityViewController(activityItems: items, applicationActivities: nil)
        ac.excludedActivityTypes = [UIActivity.ActivityType.print, UIActivity.ActivityType.postToWeibo, UIActivity.ActivityType.copyToPasteboard, UIActivity.ActivityType.addToReadingList, UIActivity.ActivityType.postToVimeo]
            
        self!.present(ac, animated: true)
    }
}

可能的解决方案

1. 确保分享的是UIImage实例

你当前传入的imageSource可能不是直接的UIImage对象(比如可能是PHAsset、图片URL或其他数据源),WhatsApp的分享扩展只接受标准UIImage类型,类型不匹配会触发插件连接中断。

如果imageSource是PHAsset,需要先获取UIImage:

// 示例:从PHAsset获取可分享的UIImage
if let asset = imageSource as? PHAsset {
    let options = PHImageRequestOptions()
    options.isSynchronous = true
    PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), contentMode: .aspectFit, options: options) { image, _ in
        guard let shareImage = image, let self = self else { return }
        self.presentShareVC(with: shareImage)
    }
}

如果imageSource是其他类型,先转换为UIImage后再传入分享列表。

2. 修复强制解包问题

代码中self!.imageView和self!.present的强制解包可能引发潜在崩溃,同时影响分享流程稳定性,改为安全的可选绑定:

guard let self = self, let imageSource = self.imageView.imageSource else { return }

3. 清理WhatsApp插件缓存

  • 重启iOS设备
  • 卸载并重新安装WhatsApp(提前备份聊天记录)
  • 将WhatsApp更新至最新版本

4. 使用UIActivityItemProvider包装资源

如果直接传入UIImage仍有问题,用UIActivityItemProvider包装资源,确保分享扩展能正确识别:

class ImageShareProvider: UIActivityItemProvider {
    init(image: UIImage) {
        super.init(placeholderItem: image)
    }
    
    override var item: Any {
        return placeholderItem as! UIImage
    }
}

// 调用示例
let provider = ImageShareProvider(image: shareImage)
let ac = UIActivityViewController(activityItems: [provider], applicationActivities: nil)

修改后的完整示例代码

let shareButtonAction = UIAction { [weak self] _ in
    guard let self = self, let imageSource = self.imageView.imageSource else { return }
    
    // 假设imageSource是UIImage,若不是则先执行转换逻辑
    guard let shareImage = imageSource as? UIImage else {
        // 处理非UIImage类型的imageSource转换
        return
    }
    
    let ac = UIActivityViewController(activityItems: [shareImage], applicationActivities: nil)
    ac.excludedActivityTypes = [.print, .postToWeibo, .copyToPasteboard, .addToReadingList, .postToVimeo]
    
    self.present(ac, animated: true)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:57:20