Flutter隐私合规插件onetrust_publishers_native_cmp的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter隐私合规插件onetrust_publishers_native_cmp的使用

简介

onetrust_publishers_native_cmp 是一个Flutter插件,用于将OneTrust的原生CMP(Consent Management Platform)平台集成到您的Flutter项目中。通过该插件,您可以轻松管理用户的隐私偏好和同意状态,确保您的应用符合GDPR、CCPA等隐私法规。

安装与配置

为了安装和配置 onetrust_publishers_native_cmp 插件,请按照以下步骤操作:

  1. 添加依赖:在 pubspec.yaml 文件中添加 onetrust_publishers_native_cmp 作为依赖项。

    dependencies:
      onetrust_publishers_native_cmp: ^最新版本号
    
  2. 配置iOS和Android项目

    • iOS:确保在 ios/Runner/Info.plist 中添加必要的权限请求。
    • Android:确保在 android/app/build.gradle 中配置正确的SDK版本,并在 AndroidManifest.xml 中添加必要的权限。
  3. 初始化SDK:在Flutter代码中初始化OneTrust SDK,并根据需要显示横幅或用户偏好中心。

示例代码

以下是一个完整的示例代码,展示了如何使用 onetrust_publishers_native_cmp 插件来初始化SDK、监听用户同意变化、显示横幅和用户偏好中心等。

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io' show Platform;

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

void main() {
  runApp(const MaterialApp(title: "OneTrust Flutter Demo", home: HomePage()));
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String _cmpDownloadStatus = 'Waiting'; // CMP下载状态
  int _c0003Status = -1; // C0003类别的同意状态
  int _c0004Status = -1; // C0004类别的同意状态
  OTATTrackingAuthorizationStatus _attStatus = OTATTrackingAuthorizationStatus.notDetermined; // ATT授权状态
  String _dataSubjectId = "Unknown"; // 数据主体标识符

  [@override](/user/override)
  void initState() {
    super.initState();
    initOneTrust(); // 初始化OneTrust SDK
    startListening(); // 开始监听用户同意变化
  }

  Future<void> initOneTrust() async {
    bool? status;
    String appId;
    bool? shouldShowBanner;
    String? id;
    OTATTrackingAuthorizationStatus startupATTStatus;

    // 根据平台设置App ID
    if (Platform.isAndroid) {
      appId = "d572dec8-4990-4452-bcdd-ad94a2f0d827";
    } else if (Platform.isIOS) {
      appId = "d572dec8-4990-4452-bcdd-ad94a2f0d827";
    } else {
      throw Exception("Platform not found!");
      return;
    }

    // 加载Android UX参数(可选)
    String AndroidUXParams = await DefaultAssetBundle.of(context)
        .loadString("assets/AndroidUXParams.json");

    // 设置启动参数
    Map<String, String> params = {
      "countryCode": "US",
      "regionCode": "GA"
      // "androidUXParams": AndroidUXParams
    };

    try {
      // 启动SDK
      status = await OTPublishersNativeSDK.startSDK("qa", appId, "en", params);
      shouldShowBanner = await OTPublishersNativeSDK.shouldShowBanner();
      id = await OTPublishersNativeSDK.getCurrentActiveProfile();
    } on PlatformException {
      print("Error communicating with platform code");
    }

    // 获取ATT授权状态
    startupATTStatus = await OTPublishersNativeSDK.getATTrackingAuthorizationStatus();

    // 如果SDK启动成功且需要显示横幅,则显示横幅
    if (status! && shouldShowBanner!) {
      OTPublishersNativeSDK.showBannerUI();
    }

    if (!mounted) return;

    // 更新UI状态
    setState(() {
      _cmpDownloadStatus = status ? 'Success!' : 'Error';
      _dataSubjectId = id!;
      _attStatus = startupATTStatus;
    });
  }

  void startListening() {
    // 监听特定类别的同意变化
    var consentListener = OTPublishersNativeSDK.listenForConsentChanges(["C0003", "C0004"])
        .listen((event) {
      setCategoryState(event['categoryId'], event['consentStatus']);
      print("New status for ${event['categoryId']} is ${event['consentStatus']}");
    });

    // 监听UI交互事件
    var interactionListener = OTPublishersNativeSDK.listenForUIInteractions().listen((event) {
      print(event);
    });

    // consentListener.cancel(); // 取消事件流前打开新的事件流
  }

  void setCategoryState(String category, int status) {
    setState(() {
      switch (category) {
        case "C0003":
          _c0003Status = status;
          break;
        case "C0004":
          _c0004Status = status;
          break;
        default:
          break;
      }
    });
  }

  void loadATTPrompt() async {
    int? status;
    // 显示ATT授权提示
    status = await OTPublishersNativeSDK.showConsentUI(OTDevicePermission.idfa);
    if (status != null) {
      setState(() {
        _attStatus = OTATTrackingAuthorizationStatus.values[status!];
      });
    }
  }

  void loadAgeGatePrompt() async {
    // 显示年龄门提示
    int? status = await OTPublishersNativeSDK.showConsentUI(OTDevicePermission.ageGate);
    print("Age Gate Status is $status");
  }

  Column getATTColumn() {
    return Column(
      children: [
        ElevatedButton(
            onPressed: () {
              loadATTPrompt();
            },
            child: Text("Load ATT Prompt")),
        Text("ATT Status = $_attStatus\n")
      ],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
      ),
      body: Center(
        child: Column(
          children: [
            Text('OneTrust Download Status: $_cmpDownloadStatus\n'),
            ElevatedButton(
                onPressed: () {
                  OTPublishersNativeSDK.showBannerUI();
                },
                child: Text("Load Banner")),
            ElevatedButton(
                onPressed: () {
                  OTPublishersNativeSDK.showPreferenceCenterUI();
                },
                child: Text("Load Preference Center")),
            ElevatedButton(
                onPressed: () {
                  OTPublishersNativeSDK.clearOTSDKData();
                },
                child: Text("Clear OneTrust SDK Data")),
            ElevatedButton(
                onPressed: () {
                  OTPublishersNativeSDK.showUCPurposesUI();
                },
                child: Text("Load UC Purposes")),
            ElevatedButton(
                onPressed: () {
                  loadAgeGatePrompt();
                },
                child: Text("Load Age Gate")),
            Platform.isIOS // 条件渲染ATT预提示按钮
                ? getATTColumn()
                : Container(),
            Text('Category C0003 Status: $_c0003Status\n'),
            Text('Category C0004 Status: $_c0004Status\n'),
            Text('Data Subject Identifier is'),
            Text(_dataSubjectId, style: TextStyle(fontWeight: FontWeight.bold)),
            ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => const EvenMore()),
                  );
                },
                child: Text("More")),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter隐私合规插件onetrust_publishers_native_cmp的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter隐私合规插件onetrust_publishers_native_cmp的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成OneTrust的隐私合规插件onetrust_publishers_native_cmp可以帮助你实现对用户隐私的合规管理。以下是一个基本的代码案例,展示了如何集成和使用这个插件。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加onetrust_publishers_native_cmp依赖。

dependencies:
  flutter:
    sdk: flutter
  onetrust_publishers_native_cmp: ^最新版本号  # 替换为实际的最新版本号

2. 导入插件

在你的Flutter项目的Dart文件中,导入onetrust_publishers_native_cmp插件。

import 'package:onetrust_publishers_native_cmp/onetrust_publishers_native_cmp.dart';

3. 初始化插件

在应用的入口文件(通常是main.dart)中初始化插件。

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化OneTrust插件
  OneTrustPublishersNativeCmp.initialize(
    configuration: OneTrustConfiguration(
      cmpAppId: '你的CMP App ID',  // 替换为你的CMP App ID
      cmpHostUrl: '你的CMP Host URL',  // 替换为你的CMP Host URL
      // 其他可选配置参数
    ),
    listener: (OneTrustEvent event) {
      // 处理OneTrust事件,比如用户同意或拒绝隐私政策
      if (event is OneTrustUserAction) {
        OneTrustUserAction userAction = event;
        print('用户操作: ${userAction.action}, 同意状态: ${userAction.consents.toString()}');
      }
    },
  );

  runApp(MyApp());
}

4. 显示隐私合规界面

在你的UI中,可以添加一个按钮来触发显示隐私合规界面。

import 'package:flutter/material.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('OneTrust 隐私合规示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 显示隐私合规界面
              OneTrustPublishersNativeCmp.showCMP();
            },
            child: Text('显示隐私合规界面'),
          ),
        ),
      ),
    );
  }
}

5. 处理用户同意状态

你可以通过监听插件的事件来获取用户的同意状态,并在应用中进行相应的处理。例如,在初始化插件时,我们已经添加了一个事件监听器来处理OneTrustUserAction事件。

6. 清理资源(可选)

如果你的应用在后台运行一段时间后会被系统回收,你可以在适当的时机调用清理方法(如果插件提供了这样的方法)。不过,对于大多数情况,这个步骤是可选的。

注意事项

  • 确保你已经在OneTrust平台上配置了你的应用,并获取了CMP App IDCMP Host URL
  • 根据你的具体需求,你可能需要调整插件的配置参数和事件处理逻辑。
  • 插件的具体API和配置可能会随着版本更新而发生变化,请参考官方文档以获取最新信息。

以上代码提供了一个基本的集成和使用onetrust_publishers_native_cmp插件的示例。根据你的实际需求,你可能需要进行进一步的定制和扩展。

回到顶部