Flutter用户同意管理插件flutter_conscent_plugin的使用

Flutter用户同意管理插件flutter_conscent_plugin的使用

本文档将逐步指导您如何在您的应用程序中集成flutter_conscent_plugin。该插件基于Flutter开发,支持Android和iOS设备。


Step-1

使用我们的插件包作为库。


Step-2

在您的应用程序中传入clientId(客户端ID)和要使用的环境模式,如下所示的示例:

ConscentInitializer("your_client_id", MODE.SANDBOX);
  1. clientId会在您创建ConsCent账户后获得,登录到客户端Conscent后可以获取访问权限。
  2. 环境模式可以设置为MODE.SANDBOXMODE.PRODUCTION。它用于配置不同环境的测试。

环境模式用于不同环境的配置测试。


Step-3

登录Conscent时,需要传递令牌(从API {{BASE_URL}}/client/generate-temp-token 获取的令牌)和电子邮件或电话号码。登录方法会返回两个参数:

  • 成功:{status, userId}
  • 失败:{status, message}

登录示例代码:

String redirectUrl = await ConscentMethods()
    .prepareAutoLoginUrl([(token.text), (phone.text), (email.text)]);

Navigator.push(
    context,
    MaterialPageRoute(
        builder: (context) => WebViewDefaultApp(
              redirectUrl: redirectUrl,
            )),
).then((value) {
    print("response $value");
    if (value != null) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('$value'),
        ));
    }
});

登出示例代码:

TextButton.icon(
    onPressed: () async {
        String? logout = await ConscentMethods().userLogOut();
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('${logout}'),
        ));
    },
    icon: const Icon(Icons.logout, size: 24.0),
    label: const Text('Logout'),
),

Step-4

检查内容是否免费/付费或需要付款,在您的类中使用以下示例:

支付格式说明:

登录到ConsCent后,验证凭据并购买高级内容。有三种支付方式:

  1. CONTENT:按次计费系统,用户只需为他们想要访问的具体高级内容付费。
  2. PASS:允许用户在1小时到14天内访问所有高级内容,具体时间可以在ConsCent仪表板中更改。
  3. SUBSCRIPTION:允许用户从一个月开始访问所有高级内容。

检查内容访问权限示例代码:

ConscentInitializer.setContentId('your_content_id');

FutureBuilder<ContentAccessModel?>(
    future: ConscentMethods().getContentAccess(),
    builder: (context, snapshot) {
        if (snapshot.hasData) {
            if (snapshot.data!.signature != null) {
                showContent = true;
            } else {
                showContent = false;
            }
            setState(() {});
        }
        return Paywall((response) {
            // 根据响应处理逻辑
        });
    },
),

订阅示例代码:

FutureBuilder<Subscription_Access?>(
    future: ConscentMethods().getSubscriptionAccess(),
    builder: (context, snapshot) {
        if (snapshot.hasData) {
            return SubscriptionPaywall((response) {
                // 根据订阅响应处理逻辑
            });
        }
        return Container(); // 默认加载状态
    },
),

高级内容注册

当您使用ConsCent API时,必须根据所操作的环境更新API_URL变量。

此端点允许客户端在ConsCent上注册其内容,包括内容标题、内容ID、内容URL、标签、分析像素(Facebook和Google)、价格以及任何特定国家的价格覆盖(以设置相关内容在特定国家的价格)。此外,contentType字段是可选的,默认值为客户默认的contentType。通过在注册内容时传递priceCategory字段,可以启用类别定价,前提是类别已在ConsCent仪表板中注册并设置了相应的价格、持续时间和价格覆盖。

HTTP 请求示例:

POST {API_URL}/api/v1/content

授权:

客户端API密钥和密码必须通过Basic Auth传递在Authorization头中,其中API密钥作为用户名,API密码作为密码。

请求体示例:

参数 默认值 描述
contentId 必填 客户端CMS中注册内容的内容ID,确保内容ID最多32个字符且只能包含字母、数字、下划线和破折号。
title 必填 内容标题
price 可选 内容的按次使用价格
currency 可选 价格确定的货币,必须是ISO 4217支持的3位货币代码,默认值为INR。
url 必填 内容在网站上的可用URL
duration 可选 用户购买内容后免费访问的时间(标准做法:1天)
authorId 可选 内容作者的ID,如果存在authorName则必须提供
authorName 可选 内容作者的名字
contentType 可选 枚举类型之一:STORY、VIDEO、SONG、PODCAST、PREMIUM CONTENT
priceOverrides 可选 特定国家的价格覆盖,名称为相关国家代码,价格为枚举值
download 可选 包含"url"、“fileName"和"fileType"的对象,所有下载参数都必须提供,文件类型目前只接受"PDF”。
priceCategory 可选 客户在ConsCent客户仪表板上注册的内容价格类别,用于调用类别定价(仅在故事没有预设价格时有效)。每个注册的价格类别都有一个相关的货币、持续时间和价格覆盖。
pixels 可选 嵌套对象,键为"facebook"和"google"。对于"google"对象,只需传递trackingId即可包含gtag;对于"facebook"对象,必须传递"pixelId"以及包含事件名称(在Facebook事件管理器中配置)、eventType(枚举:“VIEW”、“CONVERSION”)以及与特定事件相关的任何数据/值的"events"数组。
tags 可选 与内容关联的标签数组

示例代码

以下是完整的示例代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_conscent_plugin/conscent_initializer.dart';
import 'package:flutter_conscent_plugin/conscent_methods.dart';
import 'package:flutter_conscent_plugin/datamodel/api_mode.dart';
import 'package:flutter_conscent_plugin/datamodel/getuser_detail.dart';
import 'package:flutter_conscent_plugin/extra.dart';
import 'package:flutter_conscent_plugin/web_view_default.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

import 'paywall.dart';

ConscentInitializer? conscentInitializer;

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (!kIsWeb && kDebugMode && defaultTargetPlatform == TargetPlatform.android) {
    await InAppWebViewController.setWebContentsDebuggingEnabled(kDebugMode);
  }

  runApp(
    MaterialApp(
      theme: ThemeData(useMaterial3: true),
      home: const MyApps(),
    ),
  );

  conscentInitializer =
      ConscentInitializer("5f92a62013332e0f667794dc", ENVIRONMENTMODE.STAGE);
}

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

  [@override](/user/override)
  State<MyApps> createState() => _MyCustomForm();
}

class _MyCustomForm extends State<MyApps> {
  final clientIdController = TextEditingController();
  final contentIdController = TextEditingController();
  final token = TextEditingController();
  final phone = TextEditingController();
  final email = TextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
    clientIdController.text = '5f92a62013332e0f667794dc';
    contentIdController.text = 'Client-Story-Id-1';
    token.text = '644291cf2ef1470d7c2a324c';
    email.text = "roshan@conscent.ai";
    phone.text = "";
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(
          'Conscent 设置',
          style: TextStyle(color: Colors.white),
        ),
        backgroundColor: Colors.blue,
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            TextFormField(
              controller: clientIdController,
              decoration: const InputDecoration(labelText: '输入您的ClientId'),
            ),
            TextFormField(
              controller: contentIdController,
              decoration: const InputDecoration(labelText: '输入您的ContentId'),
            ),
            TextFormField(
              controller: token,
              decoration: const InputDecoration(labelText: '输入登录Token'),
            ),
            TextFormField(
              controller: phone,
              decoration: const InputDecoration(labelText: '输入手机号码'),
            ),
            TextFormField(
              controller: email,
              decoration: const InputDecoration(labelText: '输入电子邮件'),
            ),
            TextButton.icon(
              onPressed: () {
                ConscentInitializer.setClientId(clientIdController.text);
                ConscentInitializer.setContentId(contentIdController.text);
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const MyAppff()),
                );
              },
              icon: const Icon(Icons.skip_next),
              label: const Text('下一步'),
            ),
            TextButton.icon(
              onPressed: () {
                ConscentInitializer.setContentId(contentIdController.text);
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => MyAp()),
                );
              },
              icon: const Icon(Icons.mode),
              label: const Text('嵌入模式'),
            ),
            TextButton.icon(
              onPressed: () async {
                const CircularProgressIndicator();
                GetUserDetail? getusermain = await ConscentMethods().getUser();
                print('${getusermain?.toJson()}');
                if (context.mounted) {
                  showDialog<String>(
                    context: context,
                    builder: (BuildContext context) => AlertDialog(
                      title: const Text('用户详情'),
                      content: Text('${getusermain?.toJson()}'),
                      actions: [
                        TextButton(onPressed: () => Navigator.pop(context, 'Cancel'), child: const Text('取消')),
                        TextButton(onPressed: () => Navigator.pop(context, 'OK'), child: const Text('确认')),
                      ],
                    ),
                  );
                }
              },
              icon: const Icon(Icons.person),
              label: const Text('用户详情'),
            ),
            TextButton.icon(
              onPressed: () async {
                String redirectUrl = await ConscentMethods()
                    .prepareAutoLoginUrl([token.text, phone.text, email.text]);
                if (context.mounted) {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => WebViewDefaultApp(redirectUrl: redirectUrl)),
                  ).then((value) {
                    print("response $value");
                    if (value != null) {
                      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                        content: Text('$value'),
                      ));
                    }
                  });
                }
              },
              icon: const Icon(Icons.login),
              label: const Text('登录'),
            ),
            TextButton.icon(
              onPressed: () async {
                String? logout = await ConscentMethods().userLogOut();
                if (context.mounted) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                    content: Text('$logout'),
                  ));
                }
              },
              icon: const Icon(Icons.logout),
              label: const Text('登出'),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter用户同意管理插件flutter_conscent_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter用户同意管理插件flutter_conscent_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_conscent_plugin 是一个用于管理用户同意的 Flutter 插件,通常用于处理 GDPR(通用数据保护条例)或其他隐私法规下的用户同意管理。它可以帮助开发者在应用中收集、存储和管理用户的同意状态,并确保应用遵守相关隐私法规。

以下是如何使用 flutter_conscent_plugin 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_conscent_plugin: ^1.0.0  # 请使用最新版本

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

2. 初始化插件

在你的应用启动时,初始化 flutter_conscent_plugin。通常可以在 main.dart 文件中进行初始化:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化插件
  await FlutterConscentPlugin.initialize(
    consentConfig: ConsentConfig(
      privacyPolicyUrl: "https://your-privacy-policy-url.com",
      // 其他配置项
    ),
  );

  runApp(MyApp());
}

3. 请求用户同意

在应用中的适当位置(通常是首次启动时),请求用户同意。你可以使用 requestConsent 方法来显示同意对话框:

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

class ConsentScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Consent Management"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            bool consentGranted = await FlutterConscentPlugin.requestConsent();
            if (consentGranted) {
              // 用户同意
              print("User granted consent");
            } else {
              // 用户拒绝
              print("User denied consent");
            }
          },
          child: Text("Request Consent"),
        ),
      ),
    );
  }
}

4. 检查用户同意状态

你可以使用 checkConsent 方法来检查用户的同意状态:

bool isConsentGranted = await FlutterConscentPlugin.checkConsent();
if (isConsentGranted) {
  print("User has granted consent");
} else {
  print("User has not granted consent");
}

5. 更新用户同意

如果用户更改了他们的同意选择,你可以使用 updateConsent 方法来更新同意状态:

await FlutterConscentPlugin.updateConsent(granted: true);

6. 处理用户拒绝

如果用户拒绝了某些同意,你需要确保应用不会收集或处理用户的数据。你可以在代码中添加相应的逻辑来处理这种情况。

7. 持久化同意状态

flutter_conscent_plugin 通常会自动将用户的同意状态持久化到本地存储中。你不需要手动处理这一点。

8. 处理隐私政策链接

你可以在初始化插件时提供隐私政策的 URL,插件会在适当的情况下显示隐私政策链接。

9. 处理撤销同意

如果用户希望撤销他们的同意,你可以提供一个选项让用户撤销同意:

await FlutterConscentPlugin.revokeConsent();

10. 监听同意状态变化

你还可以监听用户同意状态的变化,以便在状态变化时采取相应的操作:

FlutterConscentPlugin.onConsentChanged.listen((bool granted) {
  if (granted) {
    print("Consent granted");
  } else {
    print("Consent revoked");
  }
});
回到顶部