import UIKit import Flutter @main @objc class AppDelegate: FlutterAppDelegate { // 动态方向掩码(默认竖屏) static var orientationMask: UIInterfaceOrientationMask = .portrait override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller = window?.rootViewController as! FlutterViewController let channel = FlutterMethodChannel(name: "app.orientation", binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler { [weak self] call, result in guard let self = self else { return } if call.method == "setOrientation" { guard let arg = call.arguments as? String else { result(FlutterError(code: "BAD_ARGS", message: "need 'landscape' | 'portrait'", details: nil)) return } // 先更新允许的方向掩码 if arg == "landscape" { AppDelegate.orientationMask = .landscape } else if arg == "portrait" { AppDelegate.orientationMask = .portrait } else { result(FlutterError(code: "BAD_ARGS", message: "unknown arg", details: nil)) return } // 再请求实际旋转 if #available(iOS 16.0, *) { // 通知顶层 VC:其 supportedInterfaceOrientations 需要刷新 self.window?.rootViewController?.setNeedsUpdateOfSupportedInterfaceOrientations() if let scene = self.window?.windowScene { let orientations: UIInterfaceOrientationMask = (arg == "landscape") ? .landscape : .portrait do { try scene.requestGeometryUpdate(.iOS(interfaceOrientations: orientations)) } catch { result(FlutterError(code: "GEOMETRY_UPDATE_FAILED", message: error.localizedDescription, details: nil)) return } } } else { let target: UIInterfaceOrientation = (arg == "landscape") ? .landscapeLeft : .portrait UIDevice.current.setValue(target.rawValue, forKey: "orientation") UIViewController.attemptRotationToDeviceOrientation() } result(true) } else { result(FlutterMethodNotImplemented) } } GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // 关键:把当前的掩码提供给系统 override func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return AppDelegate.orientationMask } }