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

iOS Swift 4:二维码扫描成功后如何关闭相机?

解决二维码扫描后无法关闭相机的问题

嘿,我懂你现在的头疼——扫完二维码相机还一直亮着关不掉是吧?其实问题就出在扫描成功后,你没正确停止相机的捕获会话、清理相关资源。我给你一步步捋明白怎么解决:

首先,先写个专门用来停止相机、清理资源的方法,把操作封装起来方便调用:

func stopCameraSession() {
    // 注意:AVCaptureSession的操作务必放在主线程,避免线程冲突导致崩溃
    DispatchQueue.main.async {
        // 停止捕获会话,这是让相机硬件停止工作的核心步骤
        self.captureSession.stopRunning()
        // 把预览层从父视图移除,这样界面上就看不到相机画面了
        self.previewLayer.removeFromSuperlayer()
        // 置空对象,帮系统释放内存,避免不必要的泄漏
        self.captureSession = nil
        self.previewLayer = nil
    }
}

接下来,你要在扫描到二维码的回调方法里调用这个停止方法。比如你实现AVCaptureMetadataOutputObjectsDelegate的回调时,一旦成功拿到二维码内容,就立刻触发停止操作:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    guard let firstMetadata = metadataObjects.first as? AVMetadataMachineReadableCodeObject,
          let qrValue = firstMetadata.stringValue else {
        return
    }
    
    // 保存二维码内容
    self.qrCode = qrValue
    
    // 立刻停止相机
    self.stopCameraSession()
    
    // 这里可以加你自己的后续逻辑,比如弹提示、跳转页面
    let alert = UIAlertController(title: "扫描成功", message: qrValue, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "好的", style: .default))
    present(alert, animated: true)
}

另外给你加个保险:如果你的扫描页面是会被弹出或者推走的,最好在页面即将消失的时候也调用一次停止方法,防止页面关了相机还在后台偷偷运行:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    stopCameraSession()
}

核心逻辑就是:停止AVCaptureSession的运行(这会让相机硬件停止工作),然后移除预览层、清理对象,这样相机就彻底关闭啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:24:07