iOS SDK

<p><span style="font-size:18px"><a href="https://obs-cn-shanghai.yun.pingan.com/pacloud/iOS_PAFaceSDK4.4.0.zip?response-content-disposition=attachment%3Bfilename%3DiOS_PAFaceSDK4.4.0.zip">点此下载V4.4.0</a></span></p> <ul> <li>简介</li> </ul> <p>由平安科技智能认知产品团队研发的人脸活体采集SDK-4.4.0版,以下简称为人脸SDK。人脸SDK iOS 版是一种面向 iOS&nbsp;移动设备人脸技术开发包,此版SDK包含人脸检测、活体识别等功能,以aar包+动态链接库的形式发布。基于该方案,开发者可以轻松的构建包含人脸检测、采集和活体识别的应用。在您使用SDK之前,我们首先为您介绍一下SDK本身及相关人脸能力,以便您能更方便使用人脸服务。</p> <p>&nbsp;</p> <ul> <li>授权说明</li> </ul> <p>使用人脸SDK,请先完成三件事情:</p> <p>一、可以登陆平安云(<a href="https://yun.pingan.com">yun.pingan.com</a>),选择您需要的人脸识别API、SDK、并了解付费信息。</p> <p>二、请完成SDK使用需求反馈(<a href="https://obs-cn-shanghai.yun.pingan.com/pacloud/%E6%99%BA%E8%83%BD%E8%AE%A4%E8%AF%81%E4%BA%BA%E8%84%B8%E6%B4%BB%E4%BD%93%E9%87%87%E9%9B%86SDK%E4%BD%BF%E7%94%A8%E9%9C%80%E6%B1%82%E5%8F%8D%E9%A6%88%E8%A1%A8V1.docx?response-content-disposition=attachment%3Bfilename%3D%25E6%2599%25BA%25E8%2583%25BD%25E8%25AE%25A4%25E8%25AF%2581%25E4%25BA%25BA%25E8%2584%25B8%25E6%25B4%25BB%25E4%25BD%2593%25E9%2587%2587%25E9%259B%2586SDK%25E4%25BD%25BF%25E7%2594%25A8%25E9%259C%2580%25E6%25B1%2582%25E5%258F%258D%25E9%25A6%2588%25E8%25A1%25A8V1.docx">智能认证人脸活体采集SDK使用需求反馈表V1</a>),发送邮件至项目对接人或wulei621@pingan.com.cn申请相关产品;</p> <p>三、人脸活体采集SDK授权流程:</p> <p>在完成第二步需求文档反馈后,我们会在3个工作日内发送您的应用(boundid)对应的appid\appkey, 然后用于SDK授权配置。</p> <p>SDK授权采用联网校验形式,需要用户在APP首次调用该SDK时,保持网络开启,首次使用授权后,之后即可离线使用。</p> <p>&nbsp;</p> <ul> <li>调用规则</li> </ul> <p>1.授权</p> <pre> <code>#import "PAAuthorizationKit.h" //授权 [PAAuthorizationKit applicationAuthorizationWithUrl:Kurl AppKey:Kappkey AppId:KappId completion:^(int code, NSString *msg) { NSLog(@"completion-code--msg:%d--%@",code,msg); if (code == 0) { NSLog(@"可以正常使用sdk"); }else{ NSLog(@"无法正常使用sdk"); } }]; </code></pre> <p>2.添加日记上传配置</p> <p>/*如果需要日记上传 则可以打开*/</p> <pre> <code>/*如果需要日记上传 则可以打开*/ [PAFaceDetectorManager setApp_id:APP_ID setApp_key:APP_KEY url:ACEBaseURL success:^(id responseObject) { NSLog(@":配置环境成功:%@",responseObject); [self.detector addLogNotification]; } failure:^(NSError *error) { NSLog(@":配置环境失败:%@",error.description); }]; </code></pre> <p>3.初始化</p> <p>@param bundleName 模型bundle 如果要包在Framework里,需要传入的是&ldquo;Frameworks+Your Frameworksname.framework+ bundleName&rdquo;</p> <p>@param options 阈值参数</p> <p>@param facedelegate 代理</p> <p>@return obj</p> <p>+(PAFaceDetectorManager*) initDetectorWithBundleName:(NSString*)bundleName detectorOfOptions:(NSDictionary*) options andSetDelegate:(id&lt;PAFaceDetectorManagerDelegate&gt;)facedelegate completion:(void(^)(BOOL successed))initBlock;</p> <pre> <code>-(PAFaceDetectManager *)detector{ if (!_detector) { NSDictionary *options ; //方案一:方案一:随机两种动作+静默活体+后端活体 //options = [[PAFaceDetectorSetting share] getPlanADefaultParameters]; //方案二:方案二:随机两种动作+后端活体 //options = [[PAFaceDetectorSetting share] getPlanBDefaultParameters]; //自定义 options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithFloat:0.1],PAThreshold_CloseEye, [NSNumber numberWithFloat:-1.2],PAThreshold_OpenEye, [NSNumber numberWithFloat:3],PAThreshold_Paper, [NSNumber numberWithFloat:-3.84],PAThreshold_MouthOcc, [NSNumber numberWithFloat:3],PAThreshold_Paper, [NSNumber numberWithFloat:-0.97],PAThreshold_EyeOcc, [NSNumber numberWithFloat:0.45],PAThreshold_Feature, [NSNumber numberWithFloat:0.5],PAThreshold_Live, [NSNumber numberWithBool:YES],PAThreshold_Live_Is2M, [NSNumber numberWithFloat:10],PAThreshold_PoseCenter, [NSNumber numberWithFloat:1.7],PAThreshold_MouthOpen, [NSNumber numberWithFloat:-1],PAThreshold_MouthClose, [NSNumber numberWithFloat:-0.6],PAThreshold_MouthConfidence, [NSNumber numberWithFloat:18],PAThreshold_Shake, [NSNumber numberWithFloat:18],PAThreshold_ShakeLeft, [NSNumber numberWithFloat:18],PAThreshold_Shake, [NSNumber numberWithFloat:18],PAThreshold_ShakeRight, [NSNumber numberWithFloat:0.3],PAThreshold_Far, [NSNumber numberWithFloat:0.8],PAThreshold_Close, [NSNumber numberWithFloat:15],PAThreshold_Blurness, [NSNumber numberWithFloat:220],PAThreshold_Brightness, [NSNumber numberWithFloat:65],PAThreshold_Dark, [NSNumber numberWithFloat:130],PAThreshold_BetweenPoints, nil]; _detector = [PAFaceDetectManager initDetectorWithBundleName:@"ACEFaceKit2M" detectorOfOptions:options andSetDelegate:self completion:^(BOOL successed) { if (successed) { NSLog(@"SDK初始化成功"); } }]; } return _detector; } </code></pre> <p>4.重置</p> <p>重置时需要传入当天动作是否需要静默活体和非连续检测(比对)</p> <p>重置Detector类的状态,当用户需要重新开始活体检测流程时,调用此函数</p> <p>detectionType 强制更改当前的活体检测类型 具体选项请参照 PAFaceDetectType</p> <p>compareSwitch 是否与前一帧做校对 防止非连续攻击</p> <p>liveSwitch 是否开启非连续</p> <pre> <code>-(void) resetWithFaceDetectType:(PAFaceDetectType)detectionType compareVerifySwitch:(BOOL)compareSwitch liveVerifySwitch:(BOOL)liveSwitch;</code></pre> <pre> <code> PAFaceDetectType detectionType = [self randActionType]; [self.detector resetWithFaceDetectType:detectionType compareVerifySwitch:NO liveVerifySwitch:YES]; </code></pre> <p>5.数据流检测</p> <p>&nbsp;将图片传入检测器进行异步活体检测,检测结果将以异步的形式通知delegate</p> <p>&nbsp;竖屏ACEDeviceOrientationPortrait</p> <p>&nbsp;左横ACEDeviceOrientationLandscapeLeft</p> <p>&nbsp;右横ACEDeviceOrientationLandscapeRight</p> <table border="1" cellpadding="1" cellspacing="1" style="width:500px"> <tbody> <tr> <td colspan="2" style="text-align:center">sampleBuffer</td> </tr> <tr> <td colspan="2">&nbsp;AVCaptureOutput获取的原始数据流</td> </tr> <tr> <td>&nbsp;RGB格式</td> <td> <p>用于旋转/翻转图像</p> </td> </tr> </tbody> </table> <p>此方法对于sampleBuffer有特殊要求(retain),请参照DEMO的示例代码。</p> <pre> <code>-(void) detectWithSampleBuffer:(CMSampleBufferRef)sampleBuffer orientation:(ACEDeviceOrientation)orientation;</code></pre> <pre> <code>@property (nonatomic, strong) __attribute__((NSObject)) CMSampleBufferRef currentSampleBuffer; /*! * 视频流处理的回调,相机获得的视屏流会传出来(使用sdk提供相机需要) */ - (void)onCaptureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ @autoreleasepool { @synchronized(self) { if (sampleBuffer) { [self detectFaceWithSampleBuffer:sampleBuffer]; } } } } - (void)detectFaceWithSampleBuffer:(CMSampleBufferRef)sampleBuffer{ _detectCount++; if (_detectCount%2 == 0) { return; } if (_isDetection &amp;&amp; _detectCount&gt;20) { __weak typeof(self) weakSelf = self; self.currentSampleBuffer = sampleBuffer; dispatch_async(_detectQueue, ^{ @autoreleasepool { __strong typeof(weakSelf) strongSelf=weakSelf; __block CMSampleBufferRef matchSampleBuffer = NULL; @synchronized( strongSelf ) { matchSampleBuffer = self.currentSampleBuffer; if ( matchSampleBuffer ) { CFRetain(matchSampleBuffer); self.currentSampleBuffer = NULL; } } if (matchSampleBuffer) { [strongSelf.detector detectWithSampleBuffer:matchSampleBuffer orientation:PADeviceOrientationPortrait]; } self.currentSampleBuffer = NULL; } }); } } </code></pre> <p>6.日记回传配置</p> <pre> <code>+(void)setApp_id:(NSString *)app_id setApp_key:(NSString *)app_key url:(NSString*)baseUrl success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;</code></pre> <p>7.添加日记监控</p> <pre> <code>-(void)addLogNotification;</code></pre> <p>8.是否保存日记</p> <pre> <code>-(void)whetherOrNotSave:(BOOL)isSave;</code></pre> <p>9.追加日记</p> <pre> <code>-(void)fileHandleForWriting:(NSString *)text;</code></pre> <p>10.删除日记监控</p> <pre> <code>-(void)removeLogNotification;</code></pre> <p>&nbsp;</p> <ul> <li>遵循代理 PAFaceDetectManagerDelegate</li> </ul> <pre> <code>-(void) detectWithSampleBuffer:(CMSampleBufferRef)sampleBuffer;</code></pre> <p>1.每一帧数据信息</p> <table> <thead> <tr> <th>perFrame</th> </tr> </thead> <tbody> <tr> <td>每一帧相对于的帧数据</td> </tr> <tr> <td>开启检测后对于每一帧的数据的检测信息返回</td> </tr> </tbody> </table> <pre> <code>-(void)onDetectFrame:(PAFaceDetectionFrame *)perFrame;</code></pre> <p>2.环境与用户操作监控</p> <table> <thead> <tr> <th>tipType</th> </tr> </thead> <tbody> <tr> <td>当前活体检测的环境与用户操作监控</td> </tr> <tr> <td>返回环境与用户操作不妥当的地方</td> </tr> </tbody> </table> <pre> <code>-(void)onDetectTip:(EnvironmentalTip)tipType;</code></pre> <pre> <code>-(void)onDetectTip:(EnvironmentalTip)tipType{ NSString *videoName = nil; NSString *tip; switch (tipType) { case PAEnviTip_NOCENTER: tip = @"请正对摄像头"; videoName = @"请正对摄像头"; break; case PAEnviTip_TOO_CLOSE: tip = @"手机拿远一点"; videoName = @"手机拿远一点"; break; case PAEnviTip_TOO_FAR: tip = @"手机拿近一点"; videoName = @"手机拿近一点"; break; case PAEnviTip_TOO_BRIGHT: tip = @"光线太亮"; videoName = @"光线太亮请调整"; break; case PAEnviTip_TOO_DARK: tip = @"光线太暗"; videoName = @"光线太暗请调整"; break; case PAEnviTip_YAW_LEFT: tip = @"请正对摄像头"; videoName = @"请正对摄像头"; break; case PAEnviTip_YAW_RIGHT: tip = @"请正对摄像头"; videoName = @"请正对摄像头"; break; case PAEnviTip_PITCH_UP: tip = @"请稍微低头"; videoName = @"请稍微低头"; break; case PAEnviTip_PITCH_DOWN: tip = @"请稍微抬头"; videoName = @"请稍微抬头"; break; case PAEnviTip_ROLL_LEFT: tip = @"请正对摄像头"; videoName = @"请正对摄像头"; break; case PAEnviTip_ROLL_RIGHT: tip = @"人脸太偏右"; videoName = @"请正对摄像头"; break; case PAEnviTip_NO_FACE: tip = @"请正对摄像头"; videoName = @"请正对摄像头"; break; case PAEnviTip_TOO_FUZZY: tip = @"图像模糊"; videoName = @"图像模糊请调整"; break; case PAEnviTip_ILLEGAL: tip = @"未检测到真人脸"; //videoName = @"未检测到真人脸"; break; case PAEnviTip_MULTI_FACE: tip = @"请保持单人脸"; videoName = @"请保持单人脸"; break; case PAEnviTip_MouthOpen: tip = @"请不要张着嘴"; //videoName = @"请保持单人脸"; break; case PAEnviTip_CoverFace: tip = @"请不要遮挡人脸"; //videoName = @"请保持单人脸"; break; case PAEnviTip_EyeClose: tip = @"请不要闭着眼"; //videoName = @"请保持单人脸"; break; case PAEnviTip_NORMAL: switch (_detectionType) { case PADetectType_NORMAL: //tip = @"验证中请等待"; //videoName = @"验证中请等待"; break; case PADetectType_MouthOpen: tip = @"请缓慢张嘴"; videoName = @"请缓慢张嘴"; break; case PADetectType_EyeBlink: tip = @"请缓慢眨眼"; videoName = @"请缓慢眨眼"; break; case PADetectType_HeadShank: tip = @"请缓慢摇头"; videoName = @"请缓慢摇头"; break; case PADetectType_LeftShank: tip = @"向左缓慢转头"; videoName = @"向左转头"; break; case PADetectType_RightShank: tip = @"向右缓慢转头"; videoName = @"向右转头"; break; default: break; } break; default: break; } if (videoName &amp;&amp; _soundContor) { [[ACEPlayAudio sharedAudioPlayer] playWithFileName:videoName]; } MAIN_ACTION(^{ [self.stateLabel setText:tip]; }); } </code></pre> <p>3.动作检测成功</p> <table> <thead> <tr> <th>validFrame</th> <th>currentState</th> </tr> </thead> <tbody> <tr> <td>当前动作有效帧</td> <td>动作类型</td> </tr> <tr> <td>当前动作中采集的质量最好帧</td> <td>当前动作类型</td> </tr> </tbody> </table> <pre> <code>-(void)onDetectSuccess:(PAFaceDetectionFrame *)validFrame currentFaceDetectionState:(PAFaceDetectType)currentState;</code></pre> <pre> <code>-(void)onDetectSuccess:(PAFaceDetectionFrame *)validFrame currentFaceDetectionState:(PAFaceDetectType)currentState{ if (!_isDetection) { return; } __weak typeof(self) weakSelf = self; if (currentState == PADetectType_NORMAL) { //保存这帧作为外送图片 _validImageInfo = validFrame; //判断活体 NSLog(@"liveType:%f",_validImageInfo.attr.liveType); if ( _validImageInfo.attr.liveType &lt; 0.2 &amp;&amp; [PAFaceDetectorSetting share].liveSwitch) { NSLog(@"活体分数过低"); //[self faceDetectionFailed:Detection_ERROR_Attack]; [self actionArrayWtihDetectType:DemoPlanType_PlanA]; PAFaceDetectType detectionType = [self randActionType]; [self.detector resetWithFaceDetectType:detectionType compareVerifySwitch:NO liveVerifySwitch:YES]; return; } }else{ NSLog(@"FeatureScore:%f",validFrame.attr.compareScore); //判断非连续 if ( validFrame.attr.compareScore &lt; 0.5) { NSLog(@"比对分数过低"); //[self faceDetectionFailed:Detection_ERROR_Attack]; [self.detector resetWithFaceDetectType:currentState compareVerifySwitch:YES liveVerifySwitch:NO]; return; } } if (validFrame.image) { [self.actionImgArr addObject:validFrame.image]; } if (self.actionArray.count&lt;=0) { //停止操作 _isDetection = NO; _retainFrame = nil; [self.timerManager stop]; self.timerManager.delegate = nil; //如果需要日记上传 则可以打开 需要与本团队确认 后台是否已经上线 [self.detector whetherOrNotSave:NO]; [self.detector removeLogNotification]; MAIN_ACTION(^{ __strong typeof(weakSelf) strongSelf = weakSelf; [self pushToSuccessVc:strongSelf-&gt;_validImageInfo]; }); }else{ MAIN_ACTION(^{ PAFaceDetectType detectionType = [self randActionType]; //界面提示 __strong typeof(weakSelf) strongSelf = weakSelf; switch (detectionType) { case PADetectType_NORMAL: [strongSelf.stateLabel setText:@"验证中请等待"]; break; case PADetectType_MouthOpen: [strongSelf.stateLabel setText:@"请缓慢张嘴"]; break; case PADetectType_EyeBlink: [strongSelf.stateLabel setText:@"请缓慢眨眼"]; break; case PADetectType_HeadShank: [strongSelf.stateLabel setText:@"请缓慢摇头"]; break; case PADetectType_LeftShank: [strongSelf.stateLabel setText:@"向左缓慢转头"]; break; case PADetectType_RightShank: [strongSelf.stateLabel setText:@"向右缓慢转头"]; break; default: break; } [self.timerManager stop]; [self.timerManager start]; [self.detector resetWithFaceDetectType:detectionType compareVerifySwitch:YES liveVerifySwitch:NO]; }); } </code></pre> <p>&nbsp;</p> <ul> <li>附录</li> </ul> <p>1.动作随机方法</p> <pre> <code>//随机一个动作 - (PAFaceDetectType)randActionType{ if (self.actionArray.count&gt;0) { //如果有1001 必先提取1001 if ([self.actionArray containsObject:@"1001"]) { NSInteger type = 0; PAFaceDetectType detectionType = (PAFaceDetectType)[self.actionArray[type] integerValue]; [self.actionArray removeObjectAtIndex:type]; _detectionType = detectionType; return detectionType; } NSInteger type = arc4random()%(self.actionArray.count); PAFaceDetectType detectionType = (PAFaceDetectType)[self.actionArray[type] integerValue]; [self.actionArray removeObjectAtIndex:type]; _detectionType = detectionType; return detectionType; } return PADetectType_NORMAL; } </code></pre> <p>2.PAFaceBasicInfo</p> <pre> <code>/** * 人脸识别参数 */ struct PAFaceAttr{ /** 人脸位置 */ Rect face_rect; /** 左右旋转弧度 */ float yaw ; /** 上下俯仰弧度 */ float pitch ; /** 左右偏航弧度 */ float roll ; /** 运动模糊程度 */ float blurness_motion ; /** 亮度 */ float brightness ; /** 两眼间距 */ float eyeDis ; /**活体结果**/ float liveType ; /**连续帧置信度**/ float compareScore ; /**单帧置信度度**/ float confidence ; }; </code></pre> <p>3.EnvironmentalTip</p> <pre> <code>/** Environmental ErrorEnum */ typedef NS_ENUM (NSInteger,EnvironmentalTip) { PAEnviTip_NORMAL = 2001, //正常 PAEnviTip_NO_FACE , //没有人脸 PAEnviTip_MULTI_FACE , //多人脸存在 PAEnviTip_NOCENTER, //请正对采集框 PAEnviTip_YAW_LEFT, //人脸过于偏左 PAEnviTip_YAW_RIGHT, //人脸过于偏右 PAEnviTip_PITCH_UP, //人脸过于仰头 PAEnviTip_PITCH_DOWN, //人脸过于低头 PAEnviTip_ROLL_LEFT, //人脸过于偏左歪头 PAEnviTip_ROLL_RIGHT, //人脸过于偏右歪头 PAEnviTip_TOO_DARK , //人脸过于灰暗 PAEnviTip_TOO_BRIGHT , //人脸过于亮 PAEnviTip_TOO_FUZZY , //模糊值过高 PAEnviTip_TOO_CLOSE, //人脸过近 PAEnviTip_TOO_FAR , //人脸过于远 PAEnviTip_ILLEGAL, //非法人脸警告 PAEnviTip_MOVEMENT //请保持相对静止 } ; </code></pre> <p>4.MotionType</p> <pre> <code>/*! * \enum PAFaceDetectionType * \brief 检测类型选项 */ typedef NS_ENUM (NSInteger,PAFaceDetectType) { PADetectType_NORMAL = 1001, //正脸--必须--合格 PADetectType_MouthOpen , //张嘴---选择 PADetectType_EyeBlink , //眨眼---选择 PADetectType_HeadShank, //摇头---选择 PADetectType_LeftShank, //摇头左---选择 PADetectType_RightShank //摇头右---选择 } ; </code></pre> <p>5.ACEDeviceOrientation</p> <pre> <code>typedef NS_ENUM(NSInteger, ACEDeviceOrientation) { // Device oriented vertically, home button on the bottom PADeviceOrientationPortrait, // Device oriented horizontally, home button on the right PADeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the left PADeviceOrientationLandscapeRight }; </code></pre> <p>&nbsp;</p> <ul> <li>&nbsp;PAFaceDetectorSetting SDK配置</li> </ul> <p>1.日记回传日记,授权,需要分别取申请APPID和APPKEY</p> <p>2.不需要日记回传的时候,日记相关的代码,请自行屏蔽,以免影响性能。</p> <p>3.PAFaceConfig.h,主要列举了相关阈值</p> <pre> <code>//0.0f 闭眼阈值 大于succeed extern NSString* const PAThreshold_CloseEye ; //-1.2f 睁眼阈值 小于succeed extern NSString* const PAThreshold_OpenEye ; //3 纸张判定阈值 大于fail,纸张 extern NSString* const PAThreshold_Paper ; //-3.84f 遮挡阈值 小于fail,遮挡 extern NSString* const PAThreshold_MouthOcc ; //-0.97 遮挡阈值 小于fail,遮挡 extern NSString* const PAThreshold_EyeOcc ; //0.45 比对阈值 大于succeed,同一人 extern NSString* const PAThreshold_Feature ; //0.5 活体阈值 小于fail,非法攻击 extern NSString* const PAThreshold_Live ; //NO 活体开关 YES为开 NO为关闭 extern NSString* const PAThreshold_Live_Switch; //No 静默活体2.2M开关 默认900K 所以默认NO extern NSString* const PAThreshold_Live_Is2M ; //10 角度阈值 大于fail extern NSString* const PAThreshold_PoseCenter ; //1.7张嘴阈值 大于success,张嘴状态 extern NSString* const PAThreshold_MouthOpen ; //-1 闭嘴阈值 小于success,闭嘴状态 extern NSString* const PAThreshold_MouthClose; //-0.6 嘴巴置信度 小于fail,不合格 extern NSString* const PAThreshold_MouthConfidence ; //18 摇头阈值,大于success,摇头成功 extern NSString* const PAThreshold_Shake ; //18左摇头,大于success,左摇头成功 extern NSString* const PAThreshold_ShakeLeft ; //18右摇头,大于success,右摇头成功 extern NSString* const PAThreshold_ShakeRight; //0.3 小于0.3 太远 人脸对于全图的占比 extern NSString* const PAThreshold_Far ; //0.8 大于0.8 太近 人脸对于全图的占比 extern NSString* const PAThreshold_Close ; //15 越小越清晰 越小越严格 extern NSString* const PAThreshold_Blurness ; //220 大于则过亮 extern NSString* const PAThreshold_Brightness ; //65 小于过暗 extern NSString* const PAThreshold_Dark ; //130 人脸中心点与图片中心点的距离 extern NSString* const PAThreshold_BetweenPoints; </code></pre> <p>&nbsp;</p> <p>常见问题</p> <p>因为需要兼容C++,凡有用到`PAFaceDetectManager.h`的类,都需要把后缀`.m`改成`.mm`。</p>
以上内容是否解决了您的问题?
请补全提交信息!
咨询·建议

电话咨询 - 7x24 小时

400-151-8800

邮件咨询

pub_pinganyun@pingan.com.cn

在线客服

7x24 小时,急速解答

工单支持

解决云产品相关技术问题