iOS阿里云1:1人脸识别

阿里云人脸对比API主要有两种方式,一种是通过url识别对比,一种是通过图片的base64编码进行对比,API接口调用很简单,根据自己的需求传入type和url或者content就行:


但是在调用API之前需要进行签名,API签名包含 公共请求头(HTTP协议header参数)、URL(规范资源)、Body


官方文档对于签名除了以上的简单说明外还给了个签名格式:Authorization: Dataplus AccessKeyId:Signature,对于签名处理直接上代码吧

{
    NSString*method =@"POST";
    NSString *accept = @"application/json";
    NSString*content_type =@"application/json";
    NSString*AccessKeyId =@"Your AccessKeyId";
    NSString *AccessKeySecret = @"Your AccessKeySecret";
    NSString *url = @"https://dtplus-cn-shanghai.data.aliyuncs.com/face/verify";
    NSString*path = [[NSURL URLWithString:url]path];
    //GTM时间
    NSDate*date = [NSDate date];
    NSTimeZone *tzGMT = [NSTimeZone timeZoneWithName:@"GMT"];
    [NSTimeZone setDefaultTimeZone:tzGMT];
    NSDateFormatter *iosDateFormater=[[NSDateFormatter alloc]init];
    iosDateFormater.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss 'GMT'";
    iosDateFormater.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];
    NSString*dateGMT = [iosDateFormater stringFromDate:date];
    //  开始签名处理
    //  对参数进行处理 type为1,content_1和content_2为图片base64编码数据,type为0,image_url_1和image_url_2
    //  代码中的data的type为1
    //  DataTOjsonString是将data转成json字符串
    //  获取到json字符串后进行md5加密
    NSString*inputString = [self DataTOjsonString:data];
    constchar*cStr = [inputString UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, (CC_LONG)strlen(cStr), digest );
    NSData*base64 = [[NSData alloc]initWithBytes:digestlength:CC_MD5_DIGEST_LENGTH];
    base64 = [GTMBase64 encodeData:base64];
    NSString *md5Body = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];
    //  StringToSign
    NSString*stringToSign = [NSStringstringWithFormat:@"POST\n%@\n%@\n%@\n%@\n%@", accept, md5Body, content_type, dateGMT, path];
    //  HMAC-SHA1加密
    NSString*signature = [self HmacSha1WithSecret:AccessKeySecretdata:stringToSign];
    //  Authorization
    NSString*authHeader = [NSString stringWithFormat:@"Dataplus %@:%@", AccessKeyId, signature];
    //  设置网络请求相关配置
    NSURL*nsurl = [NSURLURLWithString:url];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsurl];
    request.HTTPMethod= method;
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:dateGMT forHTTPHeaderField:@"Date"];
    [request setValue:authHeaderforHTTPHeaderField:@"Authorization"];
    [request setValue:@"keep-alive" forHTTPHeaderField:@"Connection"];
    request.HTTPBody = [inputString dataUsingEncoding:NSUTF8StringEncoding];
    //  调用阿里云的API
    NSURLSession *requestSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    dispatch_async(dispatch_get_main_queue(), ^{
        //  主线程处理一些等待操作
        self.tipLabel.text=@"正在对比请稍后...";
    });
    NSURLSessionDataTask*task = [requestSessiondataTaskWithRequest:request
                                                   completionHandler:^(NSData*_Nullablebody ,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {
                                                    //  请求结果
                                                    NSDictionary*responseJSON = [NSJSONSerialization JSONObjectWithData:bodyoptions:NSJSONReadingMutableLeaves error:nil];
                                                    NSLog(@" 人脸识别 : %@", responseJSON);
                                                      dispatch_async(dispatch_get_main_queue(), ^{
                                                          //    返回主线程处理
                                                      });
                                                       if(responseJSON) {
                                                           NSString*code = responseJSON[@"errno"];
                                                           if(code.intValue==0) {
                                                               NSString*result = responseJSON[@"confidence"];
                                                               CGFloat min = [result floatValue];
                                                               if(min >=60.0) {
                                                                   //  识别成功
                                                               }else{
                                                                   //  图片模糊或图片相差太大等其他原因识别失败
                                                               }
                                                           }else{
                                                               dispatch_async(dispatch_get_main_queue(), ^{
                                                                   //  识别失败
                                                               });
                                                           }
                                                       }
                                                   }];
    [taskresume];
}

//  获取json字符串
-(NSString*)DataTOjsonString:(id)object {
    NSString*jsonString =nil;
    NSError*error;
    NSData*jsonData = [NSJSONSerialization dataWithJSONObject:object
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];
    if(! jsonData) {
        NSLog(@"error: %@", error);
    }else{
        jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    return jsonString;
}

//  HMAC-SHA1加密
- (NSString*)HmacSha1WithSecret:(NSString*)keydata:(NSString*)data {
    const char*cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey,strlen(cKey), cData,strlen(cData), cHMAC);
    NSData*HMAC = [[NSData alloc]initWithBytes:cHMAClength:sizeof(cHMAC)];
    NSString *hash = [HMAC base64EncodedStringWithOptions:0];
    return hash;
}

对于阿里云的1:1人脸识别就到这,如有问题请大家指正,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。