金融级NFC认证提供了iOS端的SDK,可以帮助您在应用(App)中快速实现NFC认证功能。本文将结合示例代码介绍SDK接入的详细流程。​

前提条件

  • 系统版本:iOS 13.0 及以上

  • 支持语言:Objective-C、Swift

重要

SDK 不支持模拟器调试。

配置开发环境

  1. 在Xcode的编译设置中,关闭Enable Bitcode选项。

    ios-开发环境配置2

    重要

    Xcode 15 开始 ENABLE_BITCODE 将不再生效,详见:Xcode Release Notes

  2. 在Xcode编译设置中,选择Linking > Other Linker Flags,添加-ObjC

    image.png

  3. 应用权限配置。

    1. 登录苹果开发者证书管理后台,在左侧导航菜单选中Identifiers,随后在右侧列表中找到对应的bundle ID,进入配置详情后确认NFC Tag Reading已经正确启用。

      image

    2. 在项目工程的info.plist文件中:

      1. 添加Privacy - NFC Scan Usage Description权限和说明;

      2. 添加ISO7816 application identifiers for NFC Tag Reader Session配置,在item0item1中分别填写A0000002471001(旅行证件)、 F049442E43484E(身份证)。

      image.png

    3. 在Xcode中,选择TARGETS > Signing&Capabilities > All,添加Near Field Communication Tag Reading

      image.png

配置依赖

  1. 下载iOS SDK。该SDK为framework包。

  2. 解压下载的SDK包,并在解压的文件夹中执行以下命令,以提取所有的framework到Products目录。

    # 提取所有.tgz和.tar格式的压缩文件。
    for i in $(ls *.tgz *.tar);do tar xvf $i;done

    解压后iOS SDK中的包如下所示:

    AliyunFaceAuthFacade.framework
    DTFUtility.framework
    DTFNFCIdentityManager.framework
  3. Build Phases > Link Binary With Libraries中,添加SDK解压后的包和以下系统库依赖。

    libc++.tbd
    CoreNFC.framework

拷贝资源文件

在Xcode中,选择TARGETS,单击Build Phases页签,在Copy Bundle Resources中添加DTFNFCIdentityManager.bundle

该Bundle位于DTFNFCIdentityManager.framework中。

image.png

调用SDK

  1. 引入头文件。

    命令如下:

    #import <AliyunFaceAuthFacade/AliyunFaceAuthFacade.h>
  2. 初始化SDK。

    说明

    为了提升用户体验并为NFC认证准备一些必备的数据,iOS客户端需要初始化SDK。

    您可以在appDelegate方法中调用初始化SDK的代码(如下代码块所示)。

    appDelegate方法中初始化SDK,示例代码:

    - (BOOL)application:(UIApplication)application didFinishLaunchingWithOptions:(NSDictionary)launchOptions {
        [AliyunFaceAuthFacade initSDK]; // 初始化SDK。
    }

    IPv6网络初始化,示例代码如下:

    [AliyunFaceAuthFacade init]; // 初始化SDK,如果已经在appDelegate函数中调用过,此处无需再重复调用。
    [AliyunFaceAuthFacade getNFCMetaInfo];
  3. 获取metaInfo数据,示例代码如下:

    [AliyunFaceAuthFacade initSDK]; // 初始化SDK,如果已经在appDelegate函数中调用过,此处无需再重复调用。
    [AliyunFaceAuthFacade getNFCMetaInfo]; // 获取NFCMetainfo,调用前请务必先初始化SDK。
    说明

    getNFCMetaInfo返回值类型是NSDictionary,在调用服务端的发起认证请求接口时,您需要先将其转为JSON格式。

    关于发起认证请求的具体操作,请参见InitFaceVerify-发起NFC认证请求

  4. 调用SDK开始认证。

    • 示例代码如下:

      // NFC认证接口
      [AliyunFaceAuthFacade nfcVerifyWith:certifyId extParams:extParams onCompletion:^(ZIMResponse *response) {}];

      名称

      类型

      描述

      certifyId

      NSString

      您可以通过服务端发起申请请求接口获取该参数。关于发起认证请求的具体操作,请参见InitFaceVerify-发起NFC认证请求

      extParams

      NSDictionary

      通过以下代码传入当前viewController,用于展现网络加载和presentViewController

      [extParams setValue:self forKey:@"currentCtr"];
      重要

      请注意在extParams中务必传入当前控制器,否则会导致 SDK 页面无法正常展示。

    • 返回结果说明:

      response.code包含以下返回参数,具体说明如下表所示。

      错误码

      错误码文案

      错误码描述

      1000(ZIMResponseSuccess)

      验证成功

      表示验证成功。

      说明

      该结果仅供参考。可通过调用服务端DescribeFaceVerify-查询NFC认证结果接口获取最终认证结果。

      1001(ZIMInternalError)

      系统错误

      表示系统错误。

      1003(ZIMInterrupt)

      验证中断

      表示验证中断。

      2002(ZIMNetworkfail)

      网络错误

      表示网络错误。

      2003(ZIMTIMEError)

      客户端设备时间错误

      表示客户端设备时间错误。

      2006(ZIMResponseFail)

      验证失败

      表示验证失败。

      说明

      如需获取认证不通过的详情,需通过调用服务端DescribeFaceVerify-查询NFC认证结果接口。

      说明

      关于错误码的更多信息,请参见金融级NFC认证iOS客户端错误码

    • 代码示例:

      [AliyunFaceAuthFacade nfcVerifyWith:certifyId extParams:extParams onCompletion:^(ZIMResponse *response) {
          dispatch_async(dispatch_get_main_queue(), ^{
              NSString *title = @"认证成功";
              switch (response.code) {
                  case ZIMResponseSuccess: // 1000。
                      break;
                  case ZIMInterrupt: // 1003。
                      title = @"用户退出";
                      break;
                  case ZIMNetworkfail: // 2002。
                      title = @"网络错误";
                      break;
                  case ZIMTIMEError: // 2003。
                      title = @"设备时间设置不对";
                      break;
                  case ZIMResponseFail: // 2006。
                      title = @"认证失败";
                      break;
                  case ZIMInternalError: // 1001。
                      title = @"初始化失败";
                      break;
                  default:
                      break;
              }
          });
      }];

Demo代码包

您可以下载以下iOS Demo代码包进行体验:

说明

Demo体验前,请将其中的SDK版本更新至最新。​

升级注意事项

如果您在使用金融级NFC认证之前接入过金融级实人认证方案,您只需要将金融级实人认证方案升级到最新版本。

升级后复用金融级实人认证方案中的AliyunFaceAuthFacade.frameworkDTFUtility.framework即可。