iOS Flutter如何禁止截屏

在iOS平台上使用Flutter开发应用时,如何实现禁止用户截屏的功能?是否有特定的插件或原生代码可以实现这个需求?希望了解具体实现方法,包括代码示例和注意事项。

2 回复

在Flutter中,可通过flutter_windowmanager插件实现禁止截屏。在iOS端,使用以下代码:

import 'package:flutter_windowmanager/flutter_windowmanager.dart';

Future<void> secureScreen() async {
  await FlutterWindowManager.addFlags(FlutterWindowManager.FLAG_SECURE);
}

调用此方法即可禁止截屏和录屏。

更多关于iOS Flutter如何禁止截屏的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 iOS 平台上,Flutter 应用可以通过集成原生代码来禁止截屏。以下是具体实现步骤:

  1. 在 Flutter 项目中创建平台通道
    使用 MethodChannel 调用原生 iOS 代码。

  2. iOS 原生代码实现
    AppDelegate.swift 中添加以下代码:

import Flutter
import UIKit

public class AppDelegate: FlutterAppDelegate {
    override public func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "screenshot_channel", binaryMessenger: controller.binaryMessenger)
        
        channel.setMethodCallHandler { (call, result) in
            if call.method == "disableScreenshot" {
                // 添加截屏监听
                NotificationCenter.default.addObserver(
                    self,
                    selector: #selector(self.didTakeScreenshot),
                    name: UIApplication.userDidTakeScreenshotNotification,
                    object: nil
                )
                result(nil)
            }
        }
        
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    @objc func didTakeScreenshot() {
        // 检测到截屏时执行操作
        DispatchQueue.main.async {
            if let window = UIApplication.shared.windows.first {
                let alert = UIAlertController(
                    title: "禁止截屏",
                    message: "本页面不允许截屏",
                    preferredStyle: .alert
                )
                alert.addAction(UIAlertAction(title: "确定", style: .default))
                window.rootViewController?.present(alert, animated: true)
            }
        }
    }
}
  1. Flutter 中调用
    在需要禁用截屏的页面初始化时调用:
import 'package:flutter/services.dart';

class ProtectedPage extends StatefulWidget {
  @override
  _ProtectedPageState createState() => _ProtectedPageState();
}

class _ProtectedPageState extends State<ProtectedPage> {
  static const platform = MethodChannel('screenshot_channel');

  @override
  void initState() {
    super.initState();
    _disableScreenshot();
  }

  Future<void> _disableScreenshot() async {
    try {
      await platform.invokeMethod('disableScreenshot');
    } on PlatformException catch (e) {
      print("调用失败: '${e.message}'");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text('受保护页面')),
    );
  }
}

注意事项

  • 此方法只能检测截屏并响应,无法完全阻止截屏操作
  • 需要处理页面销毁时移除监听(iOS 端需在适当位置调用 NotificationCenter.default.removeObserver
  • 无法阻止录屏,如需防录屏需要额外实现

建议在涉及敏感信息的页面使用此功能,并配合其他安全措施。

回到顶部