Flutter数据安全保护插件snapshot_guard的使用

Flutter数据安全保护插件snapshot_guard的使用

snapshot_guard 是一个 Flutter 插件,用于防止用户截取应用界面的截图或屏幕录制。

Android iOS
支持 SDK 17+ iOS 12+

安装

在你的 Flutter 项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  snapshot_guard: <latest_version>

在你的库中添加以下导入:

import 'package:snapshot_guard/snapshot_guard.dart';

使用

要使用该插件,只需在 Flutter 项目中导入包,并使用提供的 SnapshotGuard.toggleGuard() 方法。此方法可以在应用程序的任何地方调用,并将防护开关打开或关闭。

示例代码:

import 'dart:developer';

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:snapshot_guard/snapshot_guard.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _hide = false;

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

  // 平台消息是异步的,所以我们在一个异步方法中初始化。
  Future<void> initPlatformState() async {
    late bool hide;
    // 平台消息可能会失败,所以我们使用 try/catch 来捕获 PlatformException。
    // 我们还处理消息可能返回 null 的情况。
    try {
      hide = await SnapshotGuard.toggleGuard() ?? false;
    } on PlatformException {
      hide = false;
    }

    // 如果小部件从树中移除而异步平台消息正在飞行,则我们想丢弃回复而不是调用
    // setState 来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _hide = hide;
    });
  }

  bool _isSnapshotHidden = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('UI 是 "${_hide ? '隐藏' : '可见'}"'),
              ElevatedButton(
                onPressed: () async {
                  final result = await SnapshotGuard.toggleGuard();
                  if (result != null) {
                    setState(() {
                      _isSnapshotHidden = result;
                    });
                  }
                  log('hideSnapshot: $result');
                },
                child: Text('隐藏快照 $_isSnapshotHidden'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

要监听防护状态的变化,可以使用 SnapshotGuard.onGuardStatusChanged 或直接通过 SnapshotGuard.isGuardEnabled 获取值。

平台支持

SnapshotGuard 目前支持 iOS 和 Android。

限制

请注意,SnapshotGuard 不能保证 100% 防止截图或屏幕录制。对于有决心的用户来说,有可能绕过这些预防措施。该插件旨在为普通用户的截图或屏幕录制提供基本级别的保护。


更多关于Flutter数据安全保护插件snapshot_guard的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据安全保护插件snapshot_guard的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用snapshot_guard插件来保护应用数据安全的示例代码。snapshot_guard是一个用于防止应用快照(如屏幕截图或屏幕录制)的插件,有助于保护敏感数据不被泄露。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加snapshot_guard依赖:

dependencies:
  flutter:
    sdk: flutter
  snapshot_guard: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来获取依赖。

2. 初始化插件

在你的主应用文件(通常是main.dart)中,初始化snapshot_guard插件。

import 'package:flutter/material.dart';
import 'package:snapshot_guard/snapshot_guard.dart';

void main() {
  // 初始化SnapshotGuard
  SnapshotGuard.enable();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Snapshot Guard Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'This screen is protected from screenshots and screen recordings.',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 示例按钮,点击时显示敏感信息
                showDialog(
                  context: context,
                  builder: (BuildContext context) {
                    return AlertDialog(
                      title: Text('Sensitive Data'),
                      content: Text('This is a sensitive piece of information.'),
                      actions: <Widget>[
                        TextButton(
                          onPressed: () => Navigator.of(context).pop(),
                          child: Text('OK'),
                        ),
                      ],
                    );
                  },
                );
              },
              child: Text('Show Sensitive Data'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 启用和禁用保护

在上面的示例中,我们在main函数中调用了SnapshotGuard.enable()来全局启用屏幕保护。如果你需要在特定条件下启用或禁用保护,可以在需要的地方调用SnapshotGuard.enable()SnapshotGuard.disable()

例如,你可能希望在用户输入敏感信息时启用保护,在离开该页面时禁用保护:

class SensitiveScreen extends StatefulWidget {
  @override
  _SensitiveScreenState createState() => _SensitiveScreenState();
}

class _SensitiveScreenState extends State<SensitiveScreen> {
  @override
  void initState() {
    super.initState();
    // 在这个页面启用保护
    SnapshotGuard.enable();
  }

  @override
  void dispose() {
    // 在离开这个页面时禁用保护
    SnapshotGuard.disable();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sensitive Screen'),
      ),
      body: Center(
        child: Text('Enter sensitive information here...'),
      ),
    );
  }
}

注意事项

  • snapshot_guard插件的效果可能因设备和操作系统版本而异。
  • 在某些情况下,插件可能无法完全防止所有形式的屏幕捕获。
  • 请确保在适当的时机启用和禁用保护,以避免影响用户体验。

通过上述代码示例,你可以在Flutter项目中有效地使用snapshot_guard插件来保护敏感数据的安全。

回到顶部