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

如何在Flutter中通过Swift代码调用iOS相机视图以实现自动对焦等功能

不用重写!通过Flutter平台通道调用Swift原生相机功能

完全不需要用Swift重写整个应用!Flutter提供的**平台通道(Platform Channels)**机制,就是专门解决这类跨平台调用原生功能的场景的——你可以在现有Flutter代码基础上,通过它调用Swift实现的iOS原生相机高级功能(比如自动对焦),既保留跨平台的开发优势,又能充分利用iOS系统的原生API能力。

下面是具体的实现步骤:

1. Flutter端定义方法通道,发起调用

在Flutter代码里创建一个专属通道,用来和iOS原生端通信,封装调用原生功能的方法:

import 'package:flutter/services.dart';

class NativeCameraService {
  // 定义唯一的通道名称,要和iOS端完全一致
  static const MethodChannel _cameraChannel = MethodChannel('com.yourapp/native_camera');

  // 封装调用iOS原生自动对焦的方法
  static Future<void> enableContinuousAutoFocus() async {
    try {
      await _cameraChannel.invokeMethod('enableContinuousAutoFocus');
    } on PlatformException catch (e) {
      print("自动对焦调用失败: ${e.message}");
      // 这里可以添加用户可见的错误提示逻辑
    }
  }
}

之后在你的Flutter页面里,需要触发自动对焦时,直接调用NativeCameraService.enableContinuousAutoFocus()即可。

2. iOS端用Swift实现原生相机逻辑

打开Flutter项目的iOS模块(用Xcode打开ios/Runner.xcworkspace),实现处理通道调用的原生代码:

第一步:创建相机处理类

新建一个Swift文件(比如NativeCameraHandler.swift),实现Flutter插件协议,处理来自Flutter的方法调用:

import Flutter
import AVFoundation

class NativeCameraHandler: NSObject, FlutterPlugin {
    // 把插件注册到Flutter引擎
    static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "com.yourapp/native_camera", binaryMessenger: registrar.messenger())
        let instance = NativeCameraHandler()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    // 处理Flutter传来的方法调用
    func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "enableContinuousAutoFocus":
            setupAutoFocus(result: result)
        default:
            result(FlutterMethodNotImplemented)
        }
    }

    // 实现自动对焦的核心逻辑
    private func setupAutoFocus(result: FlutterResult) {
        // 获取后置摄像头设备
        guard let cameraDevice = AVCaptureDevice.default(
            .builtInWideAngleCamera,
            for: .video,
            position: .back
        ) else {
            result(FlutterError(
                code: "CAMERA_NOT_FOUND",
                message: "无法获取后置摄像头",
                details: nil
            ))
            return
        }

        do {
            // 锁定相机配置进行修改
            try cameraDevice.lockForConfiguration()
            
            if cameraDevice.isFocusModeSupported(.continuousAutoFocus) {
                // 设置为持续自动对焦模式
                cameraDevice.focusMode = .continuousAutoFocus
            }
            
            // 解锁配置
            cameraDevice.unlockForConfiguration()
            result(nil) // 通知Flutter调用成功
        } catch {
            result(FlutterError(
                code: "CONFIG_ERROR",
                message: "相机配置失败: \(error.localizedDescription)",
                details: nil
            ))
        }
    }
}

第二步:注册插件到AppDelegate

打开AppDelegate.swift,在didFinishLaunchingWithOptions方法里注册刚才创建的插件:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    // 注册NativeCameraHandler插件
    NativeCameraHandler.register(with: self.registrar(forPlugin: "NativeCameraHandler"))
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

3. 额外注意事项

  • 相机权限:务必在iOS的Info.plist里添加相机权限描述,否则应用会直接崩溃:
    <key>NSCameraUsageDescription</key>
    <string>需要访问相机来拍摄照片/视频</string>
    
  • 扩展现有插件:如果你已经在使用Flutter官方的Camera插件,也可以直接修改它的iOS原生代码,扩展自动对焦等功能,这样不需要额外编写通道逻辑
  • 兼容性测试:不同iOS设备的相机支持的模式可能有差异,记得在多台设备上验证功能是否正常

这样一来,你既可以保留现有的Flutter代码,又能利用iOS原生的AVFoundation框架实现自动对焦等高级相机功能,完全不需要重写整个应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:07:13