Flutter统一访问控制插件unified_access的使用

Flutter统一访问控制插件unified_access的使用

UnifiedAccess 包

UnifiedAccess 是一个强大的 Flutter 包,旨在简化身份验证和通知管理。它集成了多种通过 Firebase 实现的身份验证方法(电话、电子邮件、Google、Apple、Facebook)并提供了统一的通知服务,包括本地通知和 Firebase Cloud Messaging (FCM),所有这些都集成在一个统一的解决方案中。

功能

该包提供了以下功能:

  • 统一认证:支持多种认证方法,包括电话验证、电子邮件登录、Google 登录、Apple 登录和 Facebook 登录,并且具有自定义异常处理。
  • 统一通知:通过无缝集成管理和本地通知及 Firebase Cloud Messaging (FCM),并提供自定义通知渠道。
  • 处理后台和前台通知。
  • 获取设备信息和 FCM 令牌。
  • 可定制的通知点击回调以处理用户交互。

前提条件

在使用此包之前,请确保你已经:

  1. Firebase 设置:将 Firebase 添加到你的 Flutter 项目中。更多详情,请参阅官方 Firebase 设置指南。
  2. Google、Facebook 和 Apple 登录配置:在 Firebase 控制台中设置 Google、Facebook 和 Apple 登录服务。
  3. 权限:确保你的 Android 和 iOS 应用请求必要的通知和认证权限。

如何使用

  1. 将包添加到 pubspec.yaml 文件中:
dependencies:
  unified_access: ^1.0.0
  1. main.dart 中初始化 Firebase:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
  1. 在应用中导入并初始化 UnifiedNotificationUnifiedAuthentication
import 'package:unified_access/unified_access.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // 初始化认证
  UnifiedAuthentication authenticationService = UnifiedAuthentication();

  // 初始化通知
  UnifiedNotification notificationService = UnifiedNotification();

  await notificationService.init(
    onOpenNotification: () {
      // 自定义逻辑当通知被点击时触发
      print('Notification clicked');
    },
    defaultIcon: 'app_icon', // 提供你的应用图标
    enableCloudMessaging: true, // 启用 Firebase Cloud Messaging
  );

  runApp(MyApp());
}

认证示例

电话和OTP登录

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase 电话号码和OTP登录。

await auth.verifyPhoneNumber(
    phoneNumber: '+911234567890', // 国家代码+电话号码
    codeSent: (String verificationId, [int? forceResendingToken]) {
      final verificationId = verificationId;
      // 处理发送验证码(例如,显示OTP输入字段)
    },
    verificationFailed: (FirebaseAuthException e) {
      // 处理验证失败
      print('Verification failed: ${e.message}');
    },
    verificationCompleted: (PhoneAuthCredential credential) {
      // 处理自动验证
      print('Phone verified: ${credential}');
    },
    codeAutoRetrievalTimeout: (String verificationId) {
      // 处理超时
      print('Auto retrieval timeout');
    },
);

/// 验证OTP
final credentials  = await auth.authenticateWithOTP(
    otp: 用户输入的OTP值,
    verificationId: verificationId,
)

电子邮件登录

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase 电子邮件登录。

try {
    UserCredential userCredential = await auth.emailLogin(
      email: 'test@example.com',
      password: 'password123',
    );
    print('Logged in as: ${userCredential.user?.email}');
  } catch (e) {
    // 处理登录过程中发生的任何错误
    print('Login failed: ${e}');
  }

发送密码重置邮件

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase 密码重置邮件。

try {
    // 替换为想要重置密码的用户的电子邮件地址
    String email = 'user@example.com';

    await auth.sendPasswordResetEmail(email: email);
    print('Password reset email sent to $email');
  } catch (e) {
    // 处理过程中发生的任何错误
    print('Failed to send password reset email: $e');
  }

Google 登录

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase Google 登录。

try {
    UserCredential googleUser = await auth.signInWithGoogle();
    print('Google user: ${googleUser.user?.email}');
  } catch (e) {
    // 处理登录过程中发生的任何错误
    print('Google sign-in failed: ${e}');
  }

Apple 登录

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase Apple 登录。

try {
    UserCredential userCredential = await auth.signInWithApple(
      scopes: [Scope.email, Scope.fullName],
    );
    print('Signed in with Apple as: ${userCredential.user?.email}');
  } catch (e) {
    // 处理登录过程中发生的任何错误
    print('Apple sign-in failed: $e');
  }

Facebook 登录

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase Facebook 登录。

try {
    UserCredential userCredential = await auth.signInWithFacebook(
      permissions: ['email', 'public_profile'],
    );
    print('Signed in with Facebook as: ${userCredential.user?.email}');
  } catch (e) {
    // 处理登录过程中发生的任何错误
    print('Facebook sign-in failed: $e');
  }

注销

该示例演示了如何使用 UnifiedAuthentication 类进行 Firebase 注销。

try {
    await auth.firebaseSignOut();
    print('User successfully signed out.');
  } catch (e) {
    // 处理注销过程中发生的任何错误
    print('Sign-out failed: $e');
  }

通知示例

获取FCM令牌

getFcmToken 方法用于获取 Firebase Cloud Messaging (FCM) 令牌 和设备信息。

FcmDeviceInfoModel? deviceInfo = await notificationService.getFcmToken();

// 打印 FCM 令牌和设备详细信息
if (deviceInfo != null) {
  print('FCM Token: ${deviceInfo.fcmToken}');
  if (deviceInfo.androidDeviceInfo != null) {
    print('Android Device Info: ${deviceInfo.androidDeviceInfo!.model}');
  } else if (deviceInfo.iosDeviceInfo != null) {
    print('iOS Device Info: ${deviceInfo.iosDeviceInfo!.name}');
  }
}

显示/触发通知

showNotification 方法用于显示本地通知。

await notificationService.showNotification(
  id: 1, // 唯一的通知ID
  title: 'Test Notification', // 通知标题
  body: 'This is a test notification body', // 通知正文
);

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

1 回复

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


unified_access 是一个用于 Flutter 的插件,旨在简化应用中访问控制的管理。它提供了一个统一的接口来处理权限请求和管理,使得开发者能够更方便地处理应用中的各种访问控制需求。

安装

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

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

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

使用

1. 初始化

在使用 unified_access 之前,通常需要在应用启动时进行初始化:

import 'package:unified_access/unified_access.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await UnifiedAccess.initialize();
  runApp(MyApp());
}

2. 请求权限

unified_access 提供了多种权限请求方法,常见的权限包括相机、位置、存储等。你可以使用 requestPermission 方法来请求特定的权限:

import 'package:unified_access/unified_access.dart';

void requestCameraPermission() async {
  PermissionStatus status = await UnifiedAccess.requestPermission(Permission.camera);
  if (status == PermissionStatus.granted) {
    print("Camera permission granted");
  } else {
    print("Camera permission denied");
  }
}

3. 检查权限

你可以使用 checkPermission 方法来检查当前是否拥有某个权限:

void checkCameraPermission() async {
  PermissionStatus status = await UnifiedAccess.checkPermission(Permission.camera);
  if (status == PermissionStatus.granted) {
    print("Camera permission is granted");
  } else {
    print("Camera permission is not granted");
  }
}

4. 打开设置

如果用户拒绝了某个权限,你可以引导用户去应用设置中手动开启权限:

void openAppSettings() async {
  await UnifiedAccess.openAppSettings();
}

5. 处理权限状态

unified_access 提供了 PermissionStatus 枚举来表示权限的状态:

  • PermissionStatus.granted:权限已授予
  • PermissionStatus.denied:权限被拒绝
  • PermissionStatus.permanentlyDenied:权限被永久拒绝(用户选择了“不再询问”)

你可以根据这些状态来执行不同的逻辑。

示例

以下是一个完整的示例,展示了如何使用 unified_access 来请求和处理相机权限:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await UnifiedAccess.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  void requestCameraPermission() async {
    PermissionStatus status = await UnifiedAccess.requestPermission(Permission.camera);
    if (status == PermissionStatus.granted) {
      print("Camera permission granted");
    } else {
      print("Camera permission denied");
    }
  }

  void checkCameraPermission() async {
    PermissionStatus status = await UnifiedAccess.checkPermission(Permission.camera);
    if (status == PermissionStatus.granted) {
      print("Camera permission is granted");
    } else {
      print("Camera permission is not granted");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Unified Access Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: requestCameraPermission,
              child: Text('Request Camera Permission'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: checkCameraPermission,
              child: Text('Check Camera Permission'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部