Flutter接入

金融级实人认证服务提供Flutter客户端SDK,帮助您在业务应用(App)中实现刷脸认证功能。本文结合示例代码介绍Flutter客户端的接入流程。

使用限制

  • 不支持模拟器调试及使用,请您使用真机开发及功能测试。

  • 仅支持iOS 9.0、Android 5.0及以上版本的移动智能设备(手机或Pad)接入。

依赖配置

  1. 下载Flutter SDK并解压。

    Flutter SDK中的接口介绍,请参见接口说明

  2. 将解压后的Flutter SDK拷贝至业务工程。业务工程

  3. 编辑业务工程中的pubspec.yaml文件,并在dev_dependencies字段下增加阿里云刷脸插件依赖。

    aliyun_face_plugin:
        path: aliyun_face_plugin

    pubspec.yaml

Android环境配置

增加模块依赖

编辑业务工程下/android/build.gradle文件,在allprojects字段中增加flatDir配置。

flatDir {
    dirs project(':aliyun_face_plugin').file('libs')
}

build.gradle

配置Proguard混淆规则

如果在release场景下配置了Proguard代码混淆,则需要在业务工程的android/app/proguard-rules.pro文件中添加如下规则:

-keep class com.alipay.deviceid.** { *; }
-keep class net.security.device.api.** {*;}
-keep class org.json.** { *;}
-keep class com.alibaba.fastjson.** {*;}
-keep class com.alibaba.sdk.android.oss.** { *; }

-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**

-keepclassmembers,allowobfuscation class * {
@com.alibaba.fastjson.annotation.JSONField <fields>;
}

iOS环境配置

添加Camera权限

  1. 使用Xcode打开Runner工程(业务工程/ios/Runner.xcworkspace)。

  2. 按照下图指引,在Runner工程的Info.plist文件中增加Camera权限。

    Value值需要您根据业务自定义。info.plist

添加framework

Link Binary With Libraries配置项中添加SDK的framework和系统依赖库。framework位于解压后的Flutter SDK目录下,路径为aliyun_face_plugin/ios/Products/

image.png

SDK中的framework:

AliyunFaceAuthFacade.framework
APBToygerFacade.framework
APPSecuritySDK.framework
BioAuthEngine.framework
deviceiOS.framework
DTFIdentityManager.framework
DTFUtility.framework
OCRDetectSDKForTech.framework
ToygerNative.framework
ToygerService.framework

系统依赖库:

CoreGraphics.framework
Accelerate.framework
SystemConfiguration.framework
AssetsLibrary.framework
CoreTelephony.framework
QuartzCore.framework
CoreFoundation.framework
CoreLocation.framework
ImageIO.framework
CoreMedia.framework
CoreMotion.framework
AVFoundation.framework
WebKit.framework
libresolv.tbd
libz.tbd
libc++.tbd
libc++.1.tbd
libc++abi.tbd
AudioToolbox.framework
CFNetwork.framework
MobileCoreServices.framework
libz.1.2.8.tbd
AdSupport.framework
ReplayKit.framework

添加Bundle

按照下图指引,在Copy Bundle Resources配置项中添加以下Bundle。Bundle位于解压后的Flutter SDK目录下,路径为aliyun_face_plugin/ios/Products/

  • ToygerService.bundle:位于ToygerService.framework中。

  • APBToygerFacade.bundle:位于APBToygerFacade.framework中。

  • APBToygerFacadeSuitable.bundle:位于APBToygerFacade.framework中。

  • OCRXMedia.bundle:位于OCRDetectSDKForTech.framework中。

  • BioAuthEngine.bundle:位于BioAuthEngine.framework中。

image.png

增加-ObjC链接标志

按照下图指引,在Other Linker Flags配置项中添加-ObjC标志。链接标志

接口说明

Flutter SDK包含初始化SDK(init)、获取MetaInfos(getMetaInfos)和开始认证(verify)3个接口。

class AliyunFacePlugin {
  // SDK初始化接口
  Future<void> init() {
    return AliyunFacePluginPlatform.instance.init();
  }

  // 获取客户端的metainfos,用于服务器端接口获取认证id,即CertifyId
  Future<String?> getMetaInfos() {
    return AliyunFacePluginPlatform.instance.getMetaInfos();
  }

  // SDK认证接口
  Future<String?> verify(String key, String value) {
    return AliyunFacePluginPlatform.instance.verify(key, value);
  }
}

初始化SDK

  • 描述:主要用于人脸模型及人脸安全模块的初始化。需要在应用刚启动,用户确认App隐私协议之后,尽可能早的调用。

  • 函数原型:

    Future<void> init() {
        return AliyunFacePluginPlatform.instance.init();
    }
  • 返回值:无。

获取MetaInfos

  • 描述:该接口返回客户端的环境信息,客户端需要将这些信息发送至业务服务器端,业务服务器端将这些信息作为参数之一(MetaInfo)调用服务端初始化认证接口InitFaceVerify,从而获取CertifyId,用于后续认证环节。

  • 函数原型:

    Future<String?> getMetaInfos() {
        return AliyunFacePluginPlatform.instance.getMetaInfos();
    }
  • 返回值:无。

开始认证

  • 描述:用于发起实人认证请求。

  • 函数原型:

    Future<String?> verify(String key, String value) {
        return AliyunFacePluginPlatform.instance.verify(key, value);
    }
  • 参数说明:

    • Key:固定字符串certifyId

    • Value:服务器端通过调用初始化认证接口InitFaceVerify返回的CertifyId。

      重要

      每个CertifyId只能使用一次,否则会返回错误。错误信息如下:

      • iOS:2002,ZIMNetworkfail

      • Android:1001,NET_RESPONSE_INVALID

  • 返回值:返回实人认证请求状态。格式为code,reson,中间以逗号(,)分隔。code为错误码;reson为具体原因。

    说明

    iOS、Android平台的code及reson释义可能会有不同,以相应的文档说明为准。

示例代码

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

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _infos = 'Unknown';
  final _aliyunFacePlugin = AliyunFacePlugin();

  @override
  void initState() {
    super.initState();

    // 在App启动的早期调用init接口。
    _aliyunFacePlugin.init();
  }

  Future<void> getMetaInfos() async {
    String metainfos;

    try {
      // 获取客户端metainfos,将信息发送到服务器端,调用服务器端相关接口获取认证ID,即CertifyId。
      metainfos = await _aliyunFacePlugin.getMetaInfos() ?? 'Unknown metainfos';
    } on PlatformException {
      metainfos = 'Failed to get metainfos.';
    }

    setState(() {
      _infos = "metainfos: " + metainfos;
    });
  }

  Future<void> startVerify() async {
    String verifyResult;
    try {
      // 调用认证接口,CertifyId需要调用服务器端接口获取。
      // 每个CertifyId只能使用一次,否则会返回code: "2002(iOS), 1001(Android)"。
      verifyResult = await _aliyunFacePlugin.verify(
              "certifyId", "shac05691e3bf2e1826a968793c1a17d") ??
          '-1,error';
    } on PlatformException {
      verifyResult = '-2,exception';
    }

    setState(() {
      _infos = "verifyResult: " + verifyResult;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Aliyun face plugin demo')),
        body: Center(
            child: Column(children: <Widget>[
          Text('$_infos\n'),
          ElevatedButton(
              onPressed: () async {
                getMetaInfos();
              },
              child: Text("getMetaInfos")),
          ElevatedButton(
              onPressed: () async {
                startVerify();
              },
              child: Text("startVerify")),
        ])),
      ),
    );
  }
}
            

完整代码示例,请点击Demo下载。