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

SwiftUI中无法调用硬件方法 如何实现iOS手电筒控制

报错核心原因

出现「not in scope」报错是两个基础问题导致的:

  • 未导入AVFoundation框架:你调用的lockForConfiguration()、setTorchModeOn()、unlockForConfiguration()都不是系统全局方法,属于AVFoundation框架下AVCaptureDevice类的实例方法,不导入框架无法识别相关API。
  • 调用方式错误:这三个方法必须绑定AVCaptureDevice类的实例才能调用,不能像全局函数一样直接在View结构体里裸写调用。AVCaptureDevice从iOS早期版本就完全支持Swift调用,不存在仅支持Objective-C的情况。
Swift环境下正确实现方式

前置准备

在代码文件顶部导入AVFoundation依赖:
import AVFoundation

完整可运行代码

实现手电筒开关需要先获取对应硬件的设备实例,加配置锁后修改手电筒状态,操作完成释放锁,同时做好异常判断,避免不支持硬件的设备触发崩溃。

import SwiftUI
import AVFoundation

struct ContentView: View {
    @State private var isTorchActive = false
    
    var body: some View {
        VStack(spacing: 24) {
            Text(isTorchActive ? "手电筒:开启" : "手电筒:关闭")
                .font(.title2)
            Button {
                switchTorchStatus()
            } label: {
                Text("切换手电筒")
                    .padding()
                    .background(.tint)
                    .foregroundColor(.white)
                    .cornerRadius(8)
            }
        }
    }
    
    private func switchTorchStatus() {
        // 获取带手电筒的后置视频设备实例
        guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
        // 判断当前设备是否支持手电筒功能
        guard captureDevice.hasTorch else { return }
        
        do {
            // 修改硬件配置前必须先获取配置锁
            try captureDevice.lockForConfiguration()
            if isTorchActive {
                captureDevice.torchMode = .off
                isTorchActive = false
            } else {
                // setTorchModeOn的level参数为亮度值,范围0.0~1.0
                try captureDevice.setTorchModeOn(level: 1.0)
                isTorchActive = true
            }
            // 配置完成后释放锁
            captureDevice.unlockForConfiguration()
        } catch {
            print("手电筒操作失败:\(error.localizedDescription)")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
注意事项
  • 手电筒属于硬件功能,必须在真机上运行测试,iOS模拟器无对应硬件,调用相关API不会生效。
  • 修改AVCaptureDevice的硬件属性前必须调用lockForConfiguration()拿锁,未拿锁直接修改属性会触发运行时崩溃。
  • 不要强制解包AVCaptureDevice实例,部分无后置摄像头的设备无法获取视频设备实例,需要用可选绑定做安全判断。

内容的提问来源于stack exchange,提问作者mr.r

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:42:20