From 76a0649890d98c5e8cb77255f760b8c2e4ee5659 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 3 Feb 2026 17:32:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(ios):=20=E4=BF=AE=E5=A4=8DPiP=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E4=BC=9A=E8=AF=9D=E9=85=8D=E7=BD=AE=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=90=8E=E5=8F=B0=E6=B7=B7=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在iOS 14.5以下版本中,PiP功能缺少.mixWithOthers选项,可能导致音频中断。现在统一为所有支持的iOS版本添加此选项,确保PiP音频在后台能与其他音频混合播放。同时将音频会话初始化时机从插件注册时延迟到实际创建PiP视图时,避免不必要的音频会话激活。 --- .../ios/Classes/NativePlugin.swift | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/local_plugins/floating_ui_plugin/ios/Classes/NativePlugin.swift b/local_plugins/floating_ui_plugin/ios/Classes/NativePlugin.swift index 9dc4a1fad..ac1d71522 100644 --- a/local_plugins/floating_ui_plugin/ios/Classes/NativePlugin.swift +++ b/local_plugins/floating_ui_plugin/ios/Classes/NativePlugin.swift @@ -6,11 +6,19 @@ import UIKit public class FloatingUiPlugin: NSObject, FlutterPlugin { private var pipContentViewArray: [PlayerView] = [] + /** + * 更新音频会话配置,保证 PiP 播放场景的音频行为符合预期 + * - Parameters: 无 + * - Returns: 无 + * - Throws: 无(内部捕获并记录 setCategory/setActive 可能抛出的异常) + */ private static func updateAudioSession() { let audioSession = AVAudioSession.sharedInstance() do { if #available(iOS 14.5, *) { - try audioSession.setCategory(.playback, mode: .moviePlayback, options: [.overrideMutedMicrophoneInterruption]) + try audioSession.setCategory(.playback, mode: .moviePlayback, options: [.overrideMutedMicrophoneInterruption, .mixWithOthers]) + } else { + try audioSession.setCategory(.playback, mode: .moviePlayback, options: [.mixWithOthers]) } try audioSession.setActive(true) } catch { @@ -18,10 +26,14 @@ public class FloatingUiPlugin: NSObject, FlutterPlugin { } } + /** + * Flutter 插件注册入口 + * - Parameters: + * - registrar: FlutterPluginRegistrar 实例,用于注册通道与原生视图 + * - Returns: 无 + * - Throws: 无(注册流程不抛出异常) + */ public static func register(with registrar: FlutterPluginRegistrar) { - // 保证 PiP 能正常工作 - Self.updateAudioSession() - let channel = FlutterMethodChannel(name: "native_plugin", binaryMessenger: registrar.messenger()) let instance = FloatingUiPlugin() registrar.addMethodCallDelegate(instance, channel: channel) @@ -30,12 +42,21 @@ public class FloatingUiPlugin: NSObject, FlutterPlugin { registrar.register(factory, withId: "native_view") } + /** + * Flutter MethodChannel 调用处理入口 + * - Parameters: + * - call: Flutter 发起的方法调用(方法名与参数) + * - result: 用于向 Flutter 回传结果的回调 + * - Returns: 无 + * - Throws: 无(内部逻辑不抛出异常,异常通过 result 或日志处理) + */ public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "getPlatformVersion": result("iOS " + UIDevice.current.systemVersion) case "createPipContentView": + Self.updateAudioSession() let playerView = PlayerView() // 这里未来可以根据 PiP 的事件来控制播放状态 playerView.play()