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

Swift 4中UIImage分享问题:生成二维码后报[ShareSheet]错误

解决分享二维码时出现"[ShareSheet] connection invalidate"的问题

我之前做二维码分享功能时也踩过这个坑,这个错误基本是因为你生成的二维码图片格式有问题——直接用UIImage(ciImage: output)创建的UIImage并没有真正的位图数据,它只是Core Image图像的一个引用,当分享Sheet尝试读取图片的实际数据时,就会因为数据缺失或者上下文问题导致连接失效。

问题根源

CIImage是Core Image框架中的对象,它本身不存储像素数据,只是描述图像的处理流程。用UIImage(ciImage:)初始化的UIImage并没有把CIImage的渲染结果转换成实际的位图,所以在分享这种UIImage时,系统无法正确获取到可分享的图片数据,从而抛出connection invalidate错误。

修复方案

我们需要修改二维码生成函数,把CIImage正确渲染成包含完整位图数据的UIImage:

func generateQRCode(string: String){ 
    // 建议用utf8编码,支持更多字符(比如中文)
    guard let data = string.data(using: .utf8) else {
        print("无法将字符串转换为数据")
        return
    }
    
    if let filter = CIFilter(name: "CIQRCodeGenerator") { 
        filter.setValue(data, forKey: "inputMessage")
        // 可以设置二维码纠错级别,可选:L/M/Q/H,默认是M
        filter.setValue("H", forKey: "inputCorrectionLevel")
        
        let transform = CGAffineTransform(scaleX: 3, y: 3) 
        if let output = filter.outputImage?.transformed(by: transform) { 
            // 用CIContext渲染CIImage为CGImage,再转成UIImage
            let context = CIContext(options: [.useSoftwareRenderer: false])
            guard let cgImage = context.createCGImage(output, from: output.extent) else {
                print("无法渲染CIImage为CGImage")
                return
            }
            let qrImage = UIImage(cgImage: cgImage)
            imageQRCode.image = qrImage
            self.qrImage = qrImage
            self.tableView.reloadData()
        } 
    } 
}

额外的分享流程优化

另外,为了兼容iPad的分享Sheet(避免崩溃),可以在present分享控制器时添加popover的配置:

let shareText = NSLocalizedString("SHARE_QR_TITLE", comment: "") 
if let image = qrImage { 
    let vc = UIActivityViewController(activityItems: [shareText, image], applicationActivities: [])
    // iPad适配
    if let popoverController = vc.popoverPresentationController {
        // 设置popover的锚点,比如用按钮或者当前视图
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }
    present(vc, animated: true) 
}

这样修改后,生成的二维码图片是包含完整位图数据的UIImage,ShareSheet就能正常读取并处理分享请求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:47:55