import Flutter import UIKit @main @objc class AppDelegate: FlutterAppDelegate { private var secureField: UITextField? private var secureContainer: UIView? override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller = window?.rootViewController as! FlutterViewController let channel = FlutterMethodChannel(name: "ios_secure_screen", binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler { [weak self] call, result in guard let self = self else { return } switch call.method { case "enable": self.enableSecureMode() result(nil) case "disable": self.disableSecureMode() result(nil) default: result(FlutterMethodNotImplemented) } } GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } private func enableSecureMode() { guard let window = self.window else { return } guard let flutterVC = window.rootViewController else { return } let flutterView = flutterVC.view! if secureContainer != nil { return } let field = UITextField(frame: window.bounds) field.isSecureTextEntry = true // IMPORTANTE: precisa ficar interativo, senão mata os toques do FlutterView field.isUserInteractionEnabled = true field.isEnabled = true field.textColor = .clear field.tintColor = .clear field.backgroundColor = .clear field.borderStyle = .none field.autocorrectionType = .no field.spellCheckingType = .no guard let container = field.subviews.first else { return } container.frame = window.bounds container.isUserInteractionEnabled = true flutterView.removeFromSuperview() container.addSubview(flutterView) flutterView.frame = container.bounds flutterView.autoresizingMask = [.flexibleWidth, .flexibleHeight] window.addSubview(field) field.frame = window.bounds field.autoresizingMask = [.flexibleWidth, .flexibleHeight] self.secureField = field self.secureContainer = container } private func disableSecureMode() { guard let window = self.window else { return } guard let flutterVC = window.rootViewController else { return } let flutterView = flutterVC.view! // Se não está habilitado, sai guard let field = secureField else { return } // Remove flutter do container e volta pra window flutterView.removeFromSuperview() window.insertSubview(flutterView, belowSubview: field) flutterView.frame = window.bounds flutterView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // Remove o campo seguro field.removeFromSuperview() self.secureField = nil self.secureContainer = nil } }