美文网首页iOS开发实用工具IOS
iOS开发实战 - 接入阿里云人脸识别SDK遇到的坑

iOS开发实战 - 接入阿里云人脸识别SDK遇到的坑

作者: ArchLL | 来源:发表于2018-05-24 18:20 被阅读182次
    1.“云盾·实人认证”

    https://help.aliyun.com/document_detail/57570.html?spm=a2c4g.11186623.6.539.CUVfsa
    使用这个服务需要先去阿里云开通,开通免费,使用收费, 计费说明

    2.认证方案

    https://help.aliyun.com/document_detail/61362.html?spm=a2c4g.11186623.6.545.JjOW73
    这里我们项目选用的是人脸验证,接入方式是:RPBioID

    RPBioID 系统时序图
    3.无线端接入 (这里介绍iOS端)
    3.1 下载无线SDK:https://help.aliyun.com/document_detail/59341.html?spm=a2c4g.11186623.6.568.x5dPRG

    注意:这里需要先登陆阿里云账号,并开通“云盾·实人认证”功能,然后上传自己项目的ipa包,阿里会给你生成一个定制版的SDK,具体步骤可以去看上方链接;
    ️第一个坑:下载下来的SDK不是zip格式的,是exec格式的,不能直接解压,在mac上也没找到合适的解压工具,如果你们找到了合适的解压工具,一定要告诉我,非常感谢;


    看到后是不是懵逼了?

    解决办法:可以在windows上右击文件通过解压工具打开(如:winrar),然后就能拿到里面的依赖包,和资源文件;

    3.2 iOS集成:https://help.aliyun.com/document_detail/57932.html?spm=a2c4g.11186623.6.570.JOzYu9d
    3.2.1 引入外部依赖
    可以把外部依赖和资源文件放在一个文件夹中一次引入
    3.2.2 引入系统依赖和编译配置,略 - 相关链接
    3.2.3 先编译一下吧,如果没问题的话,那就万事具备,只欠调用了,直接跳到下一步;

    看一下我的编译报错:


    显示有4个重复的对象,SecurityEnvSDK和SGMain

    去一探究竟吧:


    位于pods中的友盟推送的SecurityEnvSDK.framework
    SGMain.framework
    这样看起来两个framework内容也不一样啊,怎么办呢,也没有存在相同的文件,难道要删除其中一个framework吗?删除哪一个呢,删除SGMain.framework肯定不行,人脸识别肯定需要用到,那就找技术问一下吧,网页咨询客服和一通电话之后,联系到了阿里的技术小哥哥,加了钉钉,开始咨询问题;
    咨询截图

    把SecurityEnvSDK.framework从pods中移除之后,又出现了新的报错,沃特法克


    lALPBbCc1cggXdrM8M0FeA_1400_240.png
    咨询截图 - link中并没有SecurityEnvSDK的影子 解决办法 发现在.debug.cconfig和.release.cconfig中并没有把"SecurityEnvSDK删除掉" 找到上图画线部分的SecurityEnvSDK.framework,并删除,我这里已经移除了

    到此,编译成功,以后如果删除pods中的依赖库,就需要注意上面的坑;

    3.2.4 接下来去测试了一遍推送,还好没受到影响,然后去调用人脸识别测试把;
    示例代码

    因为认证前和认证后需要通知后台去查询获取认证资料,并且项目中需要多个地方调用,所以我封装了认证类代码:

    #import <Foundation/Foundation.h>
    #import <RPSDK/RPSDK.h>
    
    @interface RealPeopleCertification : NSObject
    
    + (RealPeopleCertification *)shareInstance;
    
    - (void)startRealPeopleCertificationWithVC:(UINavigationController *)nav success:(void (^)(AUDIT auditState))success alreadyCert:(void (^)())alreadyCert ;
    
    @end
    
    #import "RealPeopleCertification.h"
    
    @implementation RealPeopleCertification
    
    + (RealPeopleCertification *)shareInstance {
        static RealPeopleCertification *realPeopleCertification;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            realPeopleCertification = [[RealPeopleCertification alloc]init];
        });
        return realPeopleCertification;
    }
    
    #pragma mark - 实人认证
    - (void)startRealPeopleCertificationWithVC:(UINavigationController *)nav success:(void (^)(AUDIT auditState))success alreadyCert:(void (^)())alreadyCert {
        [YQHttpRequest getHeaderData:nil url:@"/user/getVerifyToken" success:^(id responseDic) {
            if ([[responseDic allKeys] containsObject:@"token"]) {
                NSString *ticketId = responseDic[@"ticketId"];
                NSString *certToken = responseDic[@"token"];
                //开始实名认证
                [RPSDK start:certToken rpCompleted:^(AUDIT auditState) {
                    NSLog(@"verifyResult = %ld",(unsigned long)auditState);
                    if(auditState == AUDIT_PASS) { //认证通过
                        //通知后台查询获取认证资料
                        [self certificationSuccessWithTicketId:ticketId];
                    }
                    else if(auditState == AUDIT_FAIL) { //认证不通过
                    }
                    else if(auditState == AUDIT_IN_AUDIT) { //认证中,通常不会出现,只有在认证审核系统内部出现超时,未在限定时间内返回认证结果时出现。此时提示用户系统处理中,稍后查看认证结果即可。
                    }
                    else if(auditState == AUDIT_NOT) { //未认证,用户取消
                    }
                    else if(auditState == AUDIT_EXCEPTION) { //系统异常
                    }
                    if (success) {
                        success(auditState);
                    }
                }withVC:nav];
            }else {
                [MBProgressHUD showError:responseDic[@"message"]];
                //已经实人认证
                if (alreadyCert) {
                    alreadyCert();
                }
            }
        } fail:^(NSError *error) {
            if (error) {
                [MBProgressHUD showError:@"请求失败"];
            }
        }];
    }
    
    
    #pragma mark - 认证成功,通知后台查询获取认证资料
    - (void)certificationSuccessWithTicketId:(NSString *)ticketId {
        NSDictionary *dataDic = @{@"ticketId":ticketId};
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dataDic options:NSJSONWritingPrettyPrinted error:nil];
        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        [YQHttpRequest postBodyData:jsonString url:@"/user/realPersonAuthentication" success:^(id responseDic) {
            NSLog(@"%@",responseDic);
        } fail:^(NSError *error) {
            NSLog(@"%@",error);
            if (error) {
    //            [MBProgressHUD showError:@"请求失败"];
            }
        }];
    }
    
    @end
    

    接下来直接在需要判断实人认证的控制器中引入头文件,调用即可;

    if ([HYXTools getLoginStatusWithUrl:@""]) {
            [[RealPeopleCertification shareInstance] startRealPeopleCertificationWithVC:wself.navigationController success:^(AUDIT auditState) {
                //认证结果
                if(auditState == AUDIT_PASS) { //认证通过
                    [UD setObject:@"AUTH_SUCCESS" forKey:REALNAMEAUTHSTATUS];
                    [UD synchronize];
                    //刷新页面显示(如未认证->已认证)
                }
                else if(auditState == AUDIT_FAIL) { //认证不通过
                    [MBProgressHUD showError:@"认证失败"];
                }
                else if(auditState == AUDIT_IN_AUDIT) { //认证中
                    [MBProgressHUD showError:@"认证中"];
                }
                else if(auditState == AUDIT_NOT) { //未认证,用户取消
                    [MBProgressHUD showError:@"取消认证"];
                }
                else if(auditState == AUDIT_EXCEPTION) { //系统异常
                    [MBProgressHUD showError:@"系统异常"];
                }
            } alreadyCert:^{
                //已经认证过
    
                //跳转到认证展示页面
                RealNameVC *realName = [[RealNameVC alloc]init];
                [wself.navigationController pushViewController:realName animated:YES];
            }];
        }
    
    项目演示
    亲们喜欢的话,请给个 ❤️ 额,谢谢亲们的支持!!!

    相关文章

      网友评论

      • iOS学末:能给个demo看看么
        ArchLL:@iOS学末 没有啊,我已经从那家公司离职了,这个sdk接起来不太难,你可以结合官方文档和我这篇文章,应该没什么问题,有疑问可以问我
      • 我想说_:大佬能不能给个联系方式,有事请教
        ArchLL:@我想说_ QQ: 811434108
      • 我在远方啊:老铁 我卡主了 拍摄身份证照片的时候 提示上传失败
        ArchLL:@我在远方啊 我还没遇到过这种情况,换个手机试试
      • IT人故事会:老铁,写的很用心,你的文章我收藏了啊

      本文标题:iOS开发实战 - 接入阿里云人脸识别SDK遇到的坑

      本文链接:https://www.haomeiwen.com/subject/aopsjftx.html