94 lines
2.8 KiB
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
|
|
}
|
|
|
|
}
|