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);
clientId
会在您创建ConsCent账户后获得,登录到客户端Conscent后可以获取访问权限。- 环境模式可以设置为
MODE.SANDBOX
或MODE.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后,验证凭据并购买高级内容。有三种支付方式:
- CONTENT:按次计费系统,用户只需为他们想要访问的具体高级内容付费。
- PASS:允许用户在1小时到14天内访问所有高级内容,具体时间可以在ConsCent仪表板中更改。
- 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
更多关于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");
}
});