MakerBook/books_viewer/ios/Runner/AppDelegate.swift

94 lines
2.8 KiB
Swift

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
}
}