import Flutter import UIKit import AVFoundation /// 代理服务插件,负责连接Flutter端与原生服务 public class AgentServicePlugin: NSObject, FlutterPlugin { private let TAG = "AgentServicePlugin" private var eventSink: FlutterEventSink? // MARK: - 插件注册 /// 插件注册方法 public static func register(with registrar: FlutterPluginRegistrar) { let methodChannel = FlutterMethodChannel(name: "com.yunqiinnovation.agent_service", binaryMessenger: registrar.messenger()) let eventChannel = FlutterEventChannel(name: "com.yunqiinnovation.agent_service/events", binaryMessenger: registrar.messenger()) let instance = AgentServicePlugin() registrar.addMethodCallDelegate(instance, channel: methodChannel) eventChannel.setStreamHandler(instance) // 添加监听器 AgentServiceImpl.shared.addListener(instance) NSLog("\(instance.TAG): 插件已加载") } // MARK: - 方法处理 /// 处理来自Flutter的方法调用 public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { NSLog("\(TAG): 收到方法调用 - \(call.method)") switch call.method { case "initialize": handleInitialize(call, result: result) case "startAgentService": handleStartAgentService(call, result: result) case "stopAgentService": handleStopAgentService(result: result) case "startConversation": handleStartConversation(result: result) case "stopConversation": handleStopConversation(result: result) case "processTextInput": handleProcessTextInput(call, result: result) case "speakText": handleSpeakText(call, result: result) case "stopTts": handleStopTts(result: result) case "clearChatHistory": handleClearChatHistory(result: result) case "interruptCurrentResponse": handleInterruptCurrentResponse(result: result) case "processImageInput": handleProcessImageInput(call, result: result) case "dispose": handleDispose(result: result) default: result(FlutterMethodNotImplemented) } } // MARK: - 方法实现 private func handleInitialize(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let args = call.arguments as? [String: Any], let config = args["config"] as? [String: Any] else { result(FlutterError(code: "INVALID_ARGUMENTS", message: "参数无效", details: nil)) return } // 初始化AgentServiceImpl let success = AgentServiceImpl.shared.initialize(config: config) result(success) } private func handleStartAgentService(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let args = call.arguments as? [String: Any], let config = args["config"] as? [String: Any] else { result(FlutterError(code: "INVALID_ARGUMENTS", message: "参数无效", details: nil)) return } NSLog("\(TAG): 启动AgentService,配置参数: \(config)") // 初始化AgentServiceImpl let success = AgentServiceImpl.shared.initialize(config: config) if success { result(true) } else { result(FlutterError(code: "SERVICE_START_ERROR", message: "AgentService启动失败", details: nil)) } } private func handleStopAgentService(result: @escaping FlutterResult) { NSLog("\(TAG): 停止AgentService") let success = AgentServiceImpl.shared.dispose() result(success) } private func handleStartConversation(result: @escaping FlutterResult) { NSLog("\(TAG): 开始对话") let success = AgentServiceImpl.shared.startRecognition() result(success) } private func handleStopConversation(result: @escaping FlutterResult) { NSLog("\(TAG): 停止对话") let success = AgentServiceImpl.shared.stopRecognition() result(success) } private func handleProcessTextInput(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let args = call.arguments as? [String: Any], let text = args["text"] as? String else { result(FlutterError(code: "INVALID_ARGUMENTS", message: "文本不能为空", details: nil)) return } let speakResponse = args["speakResponse"] as? Bool ?? false NSLog("\(TAG): 处理文本输入 - \(text)") let success = AgentServiceImpl.shared.processTextInput(text, speakResponse: speakResponse) result(success) } private func handleSpeakText(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let args = call.arguments as? [String: Any], let text = args["text"] as? String else { result(FlutterError(code: "INVALID_ARGUMENTS", message: "文本不能为空", details: nil)) return } NSLog("\(TAG): 语音合成 - \(text)") let success = AgentServiceImpl.shared.speakText(text) result(success) } private func handleStopTts(result: @escaping FlutterResult) { NSLog("\(TAG): 停止语音合成") let success = AgentServiceImpl.shared.stopTts() result(success) } private func handleClearChatHistory(result: @escaping FlutterResult) { NSLog("\(TAG): 清除聊天历史") let success = AgentServiceImpl.shared.clearChatHistory() result(success) } private func handleInterruptCurrentResponse(result: @escaping FlutterResult) { NSLog("\(TAG): 中断当前响应") let success = AgentServiceImpl.shared.interruptCurrentResponse() result(success) } private func handleProcessImageInput(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let args = call.arguments as? [String: Any], let imagePath = args["imagePath"] as? String else { result(FlutterError(code: "INVALID_ARGUMENTS", message: "图片路径不能为空", details: nil)) return } let text = args["text"] as? String ?? "" let speakResponse = args["speakResponse"] as? Bool ?? false NSLog("\(TAG): 处理图片输入 - \(imagePath)") let success = AgentServiceImpl.shared.processImageInput(imagePath: imagePath, text: text, speakResponse: speakResponse) result(success) } private func handleDispose(result: @escaping FlutterResult) { NSLog("\(TAG): 释放资源") // 移除监听器并释放资源 AgentServiceImpl.shared.removeListener(self) let success = AgentServiceImpl.shared.dispose() result(success) } // MARK: - 实例析构 deinit { // 确保在实例销毁时移除监听器 AgentServiceImpl.shared.removeListener(self) NSLog("\(TAG): 插件已卸载") } } // MARK: - AgentServiceListener 实现 extension AgentServicePlugin: AgentServiceListener { public func onEvent(eventName: String, data: [String: Any]) { guard let eventSink = eventSink else { return } // 将事件转换为JSON字符串 let eventData: [String: Any] = [ "event": eventName, "data": data ] do { let jsonData = try JSONSerialization.data(withJSONObject: eventData, options: []) if let jsonString = String(data: jsonData, encoding: .utf8) { // 确保在主线程发送事件到Flutter DispatchQueue.main.async { eventSink(jsonString) } } } catch { NSLog("\(TAG): 错误 - 事件数据序列化失败: \(error.localizedDescription)") } } } // MARK: - FlutterStreamHandler 实现 extension AgentServicePlugin: FlutterStreamHandler { public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { self.eventSink = events return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { self.eventSink = nil return nil } }