使用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
相关产品推荐
相关产品推荐

