Flutter访问控制插件acl_sdk的使用

Flutter访问控制插件acl_sdk的使用

简介

Flutter ACL Plugin 是一个通过统一智能(Unified Intelligence)提供访问控制功能的插件。它允许开发者收集设备数据、位置信息、通知等,并将数据同步到服务器以进行评分计算。


功能

以下是该插件的主要功能:

  • 收集设备数据(电池、资源、网络、应用使用情况)
  • 收集地理位置
  • 收集通知
  • 将数据存储并同步到服务器
  • 计算评分

注意

  • 此插件支持 Android 和 iOS。
  • 在 iOS 版本中,以下功能不可用:
    • PermissionHelper.isNotificationListenerRunning
    • PermissionHelper.goToNotificationListenerSetting
    • PermissionHelper.isPackageUsageStatsEnable
    • PermissionHelper.goToAppUsageSetting
      使用这些功能时,请务必添加平台条件检查!

安装步骤

Step 1: 添加依赖

pubspec.yaml 文件中添加插件依赖:

flutter pub add acl_sdk

Step 2: 配置 Firebase

此插件使用 firebase_messaging 处理服务器消息并执行操作。你需要在项目中安装以下 Firebase 包:

dependencies:
  firebase_core: ^3.4.1
  firebase_messaging: ^15.1.1

Android 配置

  1. 打开 android/build.gradle 文件,添加以下代码以支持 aar 库:

    allprojects {
        repositories {
            ...
            // 添加以下行
            maven {
                url "${project(':acl_sdk').projectDir}/build"
            }
        }
    }
    
  2. 修改 android/app/build.gradle 文件中的 minSdkVersion24

    defaultConfig {
        ...
        minSdk = 24
        ...
    }
    

iOS 配置

  1. Info.plist 中启用后台模式:

    <key>UIBackgroundModes</key>
    <array>
        <string>fetch</string>
        <string>remote-notification</string>
        <string>location</string>
    </array>
    
  2. 如果你的应用未请求位置权限,请添加位置始终权限。


使用方法

初始化插件并注册设备

import 'package:acl_sdk/acl_sdk.dart';

final _aclSdkPlugin = AclSdk();

void initializeAndRegisterDevice() async {
  await _aclSdkPlugin.initialize(AppConfigCreateInput(
    partnerId: '<你的组织唯一名称>',
    apiEndpoint: '<你的 API 地址>',
    apiKey: '<你的 API Key>',
    apiSecret: '<你的 API 密钥>',
    appBundle: '<你的应用包名>',
  ));
  await _aclSdkPlugin.registerDevice();
}

映射设备与成员

注意

  1. 在调用 mapDeviceMember 前,请确保已执行过 registerDevice
  2. memberId 发生变化时调用此函数(例如登录或切换账户)。
await _aclSdkPlugin.mapDeviceMember('<你的 memberId >');

开始收集数据和位置

await _aclSdkPlugin.startCollectData();
await _aclSdkPlugin.startCollectLocation();

监听服务器消息

你可以通过以下方式监听来自 Unified Intelligence 的消息:

import 'package:acl_sdk/work_manager_dispatchers/acl_fcm_on_receive_handler.dart';

// 后台消息处理
FirebaseMessaging.onBackgroundMessage(aclFCMOnReceiveHandler);

// 前台消息处理
FirebaseMessaging.onMessage.listen(aclFCMOnReceiveHandler);

API 示例

获取设备 ID

import 'package:acl_sdk/helpers/device_info_helper.dart';

final deviceId = await DeviceInfoHelper.generateDeviceId();

检查应用使用权限

import 'package:acl_sdk/helpers/permission_helper.dart';

final isAllowAppUsage = await PermissionHelper.isPackageUsageStatsEnable();

打开应用使用设置页面

import 'package:acl_sdk/helpers/permission_helper.dart';

await PermissionHelper.goToAppUsageSetting();

检查通知监听器权限

import 'package:acl_sdk/helpers/permission_helper.dart';

final isNotificationListenerRunning = await PermissionHelper.isNotificationListenerRunning();

手动触发数据同步

import 'package:acl_sdk/helpers/sync_data_helper.dart';

await SyncDataHelper.syncData();

注意事项

  1. iOS 背景推送:在 iOS 上,我们通过主题 sync_data 推送通知以收集和同步数据。请勿覆盖此主题。
  2. 位置权限:当用户返回应用并授予位置始终权限后,请立即调用 _aclSdkPlugin.startCollectLocation() 开始收集位置数据。

示例代码

以下是完整的示例代码:

import 'dart:async';
import 'dart:io';

import 'package:acl_sdk/acl_sdk.dart';
import 'package:acl_sdk/helpers/permission_helper.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _deviceId = 'Unknown';
  bool _isAllowAppUsage = false;
  bool _isAllowLocationAlways = false;
  bool _isAllowNotificationListener = false;

  final _aclSdkPlugin = AclSdk();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    String deviceId = 'Unknown';
    bool isAllowAppUsage = false;
    bool isAllowLocationAlways = false;
    bool isAllowNotificationListener = false;

    try {
      await Firebase.initializeApp();
      await _aclSdkPlugin.initialize(
        AppConfigCreateInput(
          partnerId: '<your-partner-id>',
          apiEndpoint: '<your-api-endpoint>',
          apiKey: '<your-api-key>',
          apiSecret: '<your-api-secret>',
          appBundle: '<your-app-bundle>',
        ),
      );
      await _aclSdkPlugin.registerDevice();
      deviceId = await DeviceInfoHelper.generateDeviceId();
      isAllowAppUsage = await PermissionHelper.isPackageUsageStatsEnable();
      isAllowLocationAlways = await Geolocator.checkPermission() == LocationPermission.always;
      isAllowNotificationListener = await PermissionHelper.isNotificationListenerRunning();

      await _aclSdkPlugin.mapDeviceMember('hello-world');
      await _aclSdkPlugin.startCollectData();
      await _aclSdkPlugin.startCollectLocation();
    } catch (e) {
      print('Error initializing plugin: $e');
    }

    setState(() {
      _deviceId = deviceId;
      _isAllowAppUsage = isAllowAppUsage;
      _isAllowLocationAlways = isAllowLocationAlways;
      _isAllowNotificationListener = isAllowNotificationListener;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('ACL SDK Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Device ID: $_deviceId'),
              ElevatedButton(
                onPressed: () async {
                  final isAllowed = await PermissionHelper.isPackageUsageStatsEnable();
                  if (!isAllowed) {
                    await PermissionHelper.goToAppUsageSetting();
                  }
                },
                child: Text(_isAllowAppUsage ? '已允许应用使用权限' : '允许应用使用权限'),
              ),
              ElevatedButton(
                onPressed: () async {
                  final permission = await Geolocator.checkPermission();
                  if (permission == LocationPermission.always) return;
                  await Geolocator.requestPermission();
                  if (permission == LocationPermission.always) {
                    await _aclSdkPlugin.startCollectLocation();
                  }
                },
                child: Text(_isAllowLocationAlways ? '已允许始终定位权限' : '允许始终定位权限'),
              ),
              ElevatedButton(
                onPressed: () async {
                  final isAllowed = await PermissionHelper.isNotificationListenerRunning();
                  if (!isAllowed) {
                    await PermissionHelper.goToNotificationListenerSetting();
                  }
                },
                child: Text(_isAllowNotificationListener ? '已允许通知监听权限' : '允许通知监听权限'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter访问控制插件acl_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


acl_sdk 是一个用于访问控制的 Flutter 插件,通常用于管理用户权限和角色。它可以帮助开发者在应用程序中实现细粒度的访问控制,确保只有具有特定权限的用户才能访问某些功能或资源。

以下是如何在 Flutter 项目中使用 acl_sdk 的基本步骤:

1. 添加依赖

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

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

然后运行 flutter pub get 来安装依赖。

2. 初始化 SDK

在你的 Flutter 应用程序中,首先需要初始化 acl_sdk。通常,你可以在 main.dart 文件中进行初始化:

import 'package:acl_sdk/acl_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 ACL SDK
  await AclSdk.initialize(
    apiKey: 'YOUR_API_KEY',  // 替换为你的 API Key
    baseUrl: 'https://api.example.com',  // 替换为你的 API 基础 URL
  );

  runApp(MyApp());
}

3. 检查用户权限

在应用程序中,你可以使用 acl_sdk 来检查用户是否具有特定权限。例如,在某个页面中,你可以这样做:

import 'package:acl_sdk/acl_sdk.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: FutureBuilder<bool>(
          future: AclSdk.hasPermission('view_dashboard'),  // 检查用户是否有 'view_dashboard' 权限
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else if (snapshot.data == true) {
              return Text('You have permission to view the dashboard.');
            } else {
              return Text('You do not have permission to view the dashboard.');
            }
          },
        ),
      ),
    );
  }
}

4. 管理用户角色

acl_sdk 还允许你管理用户角色。例如,你可以为用户分配或移除角色:

import 'package:acl_sdk/acl_sdk.dart';

void assignRoleToUser(String userId, String role) async {
  try {
    await AclSdk.assignRole(userId, role);
    print('Role assigned successfully.');
  } catch (e) {
    print('Failed to assign role: $e');
  }
}

void removeRoleFromUser(String userId, String role) async {
  try {
    await AclSdk.removeRole(userId, role);
    print('Role removed successfully.');
  } catch (e) {
    print('Failed to remove role: $e');
  }
}

5. 处理权限变更

在某些情况下,你可能需要监听用户权限的变更。acl_sdk 提供了相关的事件监听功能:

import 'package:acl_sdk/acl_sdk.dart';

void listenForPermissionChanges() {
  AclSdk.onPermissionChanged.listen((permission) {
    print('Permission changed: $permission');
  });
}

6. 注销和清理

在用户注销或应用程序关闭时,你可能需要清理 acl_sdk 的资源:

import 'package:acl_sdk/acl_sdk.dart';

void logout() async {
  await AclSdk.logout();
  print('User logged out and ACL SDK resources cleaned up.');
}

7. 错误处理

在使用 acl_sdk 时,确保正确处理可能出现的错误。例如,网络错误、权限不足等:

import 'package:acl_sdk/acl_sdk.dart';

void checkPermission() async {
  try {
    bool hasPermission = await AclSdk.hasPermission('edit_profile');
    if (hasPermission) {
      print('You can edit the profile.');
    } else {
      print('You cannot edit the profile.');
    }
  } catch (e) {
    print('Error checking permission: $e');
  }
}
回到顶部