Flutter中如何防范半/全覆盖窗口下的Tapjacking(点击劫持)
Flutter 点击劫持(Tapjacking)防范方案
Android 端实现
你找到的原生代码确实能解决问题,具体使用位置和方式如下:
- 打开项目的
android/app/src/main/kotlin/[你的包名]/MainActivity.kt文件 - 在
onCreate方法内添加这段代码:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val view = findViewById<View>(android.R.id.content).rootView view.filterTouchesWhenObscured = true }
这段代码的作用是:当应用窗口被其他窗口(半覆盖/全覆盖)遮挡时,直接过滤掉所有触摸事件,避免用户点击被劫持。
更简洁的方式是直接在 AndroidManifest.xml 里配置:
<activity android:name=".MainActivity" android:filterTouchesWhenObscured="true"> <!-- 其他原有配置 --> </activity>
这样无需修改 Kotlin 代码,就能开启相同的防护效果。
iOS 端实现
iOS 平台也有对应的原生防护手段,修改 ios/Runner/AppDelegate.swift 文件:
import UIKit import Flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) // 开启窗口安全防护,防范点击劫持与内容泄露 self.window?.isSecure = true return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
window.isSecure = true 会阻止应用窗口被其他应用截图、录屏,同时也能拦截遮挡窗口的触摸劫持行为。
Flutter 层辅助防护
除了原生层的核心防护,还可以在 Flutter 代码里做补充:
- 用
WidgetsBindingObserver监听应用生命周期,当应用从后台回到前台时,通过原生通道调用 Android 的View.isObscured方法,检测窗口是否被遮挡 - 对支付、确认类敏感操作按钮,在检测到窗口被遮挡时暂时禁用,或添加二次确认步骤
注:Flutter 本身没有直接处理 Tapjacking 的 API,必须依赖原生平台的能力实现核心防护。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

