when building highly secured apps, it can be essential to stop the user from taking screenshots, while this is quite straightforward on Android, it gets a little bit tricky on the iOS part. I remember facing this challenge some months ago and I scanned through a couple of StackOverflow answers for hours, I was at the point of getting frustrated when I stumbled on one that was the solution for the iOS part:
For Android:
- inside your mainActivity.(java/tk), import the following:
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import android.view.WindowManager.LayoutParams
- and you replace the content with:
class MainActivity: FlutterFragmentActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
window.addFlags(LayoutParams.FLAG_SECURE)
GeneratedPluginRegistrant.registerWith(flutterEngine)
}
}
this does it for Android.
For iOS:
- in your AppDelegate.swift you should create a window extension just like below:
extension UIWindow {
func makeSecure() {
let field = UITextField()
let view = UIView(frame: CGRect(x: 0, y: 0, width: field.frame.self.width, height: field.frame.self.height))
field.isSecureTextEntry = true
self.addSubview(field)
self.layer.superlayer?.addSublayer(field.layer)
field.layer.sublayers?.last!.addSublayer(self.layer)
field.leftView = view
field.leftViewMode = .always
}
}
then call the new window extension in your application function:
self.window.makeSecure()
your AppDelegate.swift should look like this:
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
self.window.makeSecure()
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
extension UIWindow {
func makeSecure() {
let field = UITextField()
field.isSecureTextEntry = true
self.addSubview(field)
field.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
field.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
self.layer.superlayer?.addSublayer(field.layer)
field.layer.sublayers?.first?.addSublayer(self.layer)
}
}
Source: stackoverflow answer
thank you for reading, I hope this was helpful.
Top comments (3)
Was looking for this article, thanks for sharing 😎
I am glad this was helpful
nice