You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter iOS端如何为特定页面禁用截图?

Flutter iOS端特定页面禁用截图的实现方案

你当前Android端通过flutter_windowmanager包实现了特定页面禁用截图,但iOS端现有全局禁用方案无法满足特定页面需求,可通过**Flutter与iOS原生通信(MethodChannel)**的方式实现仅目标页面禁用截图,具体步骤如下:

一、Flutter端代码实现

在需要禁用截图的页面中,通过MethodChannel向iOS原生发送启用/关闭截图保护的指令,利用页面生命周期确保进入时开启、退出时关闭:

import 'package:flutter/services.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class SecureScreenPage extends StatefulWidget {
  const SecureScreenPage({super.key});

  @override
  State<SecureScreenPage> createState() => _SecureScreenPageState();
}

class _SecureScreenPageState extends State<SecureScreenPage> {
  // 定义MethodChannel,名称需与iOS端保持一致
  static const _secureChannel = MethodChannel('your_app/secure_screen');

  @override
  void initState() {
    super.initState();
    // 仅iOS端执行开启截图保护
    if (defaultTargetPlatform == TargetPlatform.iOS) {
      _enableSecureProtection();
    }
  }

  @override
  void dispose() {
    // 页面销毁时关闭截图保护
    if (defaultTargetPlatform == TargetPlatform.iOS) {
      _disableSecureProtection();
    }
    super.dispose();
  }

  // 通知iOS开启截图保护
  Future<void> _enableSecureProtection() async {
    try {
      await _secureChannel.invokeMethod('enableSecure');
    } on PlatformException catch (e) {
      print('开启截图保护失败: ${e.message}');
    }
  }

  // 通知iOS关闭截图保护
  Future<void> _disableSecureProtection() async {
    try {
      await _secureChannel.invokeMethod('disableSecure');
    } on PlatformException catch (e) {
      print('关闭截图保护失败: ${e.message}');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('禁止截图页面')),
      body: const Center(
        child: Text('此页面iOS端无法进行截图操作'),
      ),
    );
  }
}

二、iOS原生代码修改

修改AppDelegate.swift,移除之前的全局窗口隐藏逻辑,改为通过MethodChannel接收Flutter指令,仅在标记开启截图保护时,才在应用进入后台时隐藏窗口:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    // 标记当前是否需要开启截图保护
    private var isSecureModeEnabled = false
    
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        guard let controller = window?.rootViewController as? FlutterViewController else {
            return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
        
        // 初始化MethodChannel,名称需与Flutter端一致
        let secureChannel = FlutterMethodChannel(name: "your_app/secure_screen", binaryMessenger: controller.binaryMessenger)
        
        // 处理Flutter发送的指令
        secureChannel.setMethodCallHandler { [weak self] call, result in
            guard let self = self else {
                result(FlutterMethodNotImplemented)
                return
            }
            
            switch call.method {
            case "enableSecure":
                self.isSecureModeEnabled = true
                result(nil)
            case "disableSecure":
                self.isSecureModeEnabled = false
                // 立即恢复窗口显示,避免退出页面后窗口仍隐藏
                self.window?.isHidden = false
                result(nil)
            default:
                result(FlutterMethodNotImplemented)
            }
        }
        
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    override func applicationWillResignActive(_ application: UIApplication) {
        super.applicationWillResignActive(application)
        // 仅在开启保护模式时,隐藏窗口避免被截图
        if isSecureModeEnabled {
            window?.isHidden = true
        }
    }
    
    override func applicationDidBecomeActive(_ application: UIApplication) {
        super.applicationDidBecomeActive(application)
        // 应用回到前台时,始终恢复窗口显示
        window?.isHidden = false
    }
}

方案说明

  • 核心逻辑:iOS系统触发截图时,应用会进入applicationWillResignActive状态,此时隐藏窗口就能避免页面内容被捕获;应用回到前台时再恢复窗口显示。
  • 通过MethodChannel实现Flutter页面与iOS原生的状态同步,仅当目标页面处于活跃状态时,才开启截图保护标记,从而实现仅特定页面禁用截图。

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:46:05