感谢您的反馈!
// // RootVC.m // MSAuthSDK // // Created by Jeff Wang on 16/3/13. // Copyright ? 2016年 Jeff Wang. All rights reserved. // #import "RootVC.h" #pragma mark 需要引入的头文件 #import <MSAuthSDK/MSAuthVCFactory.h> #import <SecurityGuardSDK/Open/OpenSecurityGuardManager.h> #import <SecurityGuardSDK/Open/OpenSecurityBody/IOpenSecurityBodyComponent.h> #import <SecurityGuardSDK/Open/OpenSecurityBody/OpenSecurityBodyDefine.h> #import <SecurityGuardSDK/Open/OpenSecurityBody/IOpenSecurityBodyComponent.h> @protocol textSelectDelegate -(void)onSelect:(UITextField*)v index:(NSUInteger)index; @end @interface UITextFieldWithPick:UITextField<UIPickerViewDelegate,UIPickerViewDataSource,UITextFieldDelegate> @property(nonatomic,strong)NSArray<NSString*>* choise; @property(nonatomic,weak)id<textSelectDelegate> selectDelegate; @end @implementation UITextFieldWithPick { int pickindex; int oldindex; } -(instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; // self.delegate = self; return self; } - (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView { return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return self.choise.count; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return [self.choise objectAtIndex:row]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { pickindex = row; } - (void)showAuthChoose { oldindex = pickindex; UIPickerView *pickerView = [[UIPickerView alloc] init]; [pickerView sizeToFit]; pickerView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); pickerView.delegate = self; pickerView.dataSource = self; pickerView.showsSelectionIndicator = YES; self.inputView = pickerView; UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init]; keyboardDoneButtonView.barStyle = UIBarStyleDefault; keyboardDoneButtonView.translucent = YES; keyboardDoneButtonView.tintColor = nil; [keyboardDoneButtonView sizeToFit]; UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked)] ; UIBarButtonItem* doneButton1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerCancelClicked)] ; [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton,doneButton1, nil]]; self.inputAccessoryView = keyboardDoneButtonView; } /* - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (self==textField) { return NO; } return TRUE; } - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if (textField==self) { // [self showAuthChoose]; } return YES; } */ -(void)pickerCancelClicked { self.text = [self.choise objectAtIndex:self->oldindex]; [self endEditing:TRUE]; } -(void)pickerDoneClicked { self.text = [self.choise objectAtIndex:self->pickindex]; [self endEditing:TRUE]; [self.selectDelegate onSelect:self index:pickindex]; } @end @interface RootVC () <MSAuthProtocol,textSelectDelegate> @property (nonatomic, strong) NSString *currentLanguage; @property (nonatomic, strong) UITextField* ipaddress; @property (nonatomic, strong) UITextFieldWithPick* chooseAuth; @property (nonatomic, strong) UITextFieldWithPick* chooseAuthNoneNum; @property (nonatomic, assign) NSInteger chooseAuthNoneNumIndex; @property (nonatomic, strong) UITextField* phonenumber; @property (nonatomic, strong) UITextView* status; @property (nonatomic,copy)NSString* host; @property (nonatomic,copy)NSString* phonetext; @property (nonnull,strong)NSArray* choice; @end @implementation RootVC { MSAuthType mAuthType; NSInteger pickindex; } -(void)setColor { self.view.backgroundColor = [UIColor whiteColor]; } - (instancetype)init { self = [super init]; if (self) { self.title = @"验证SDK demo "; } return self; } -(void)msgNotSupport { [self verifyDidFinishedWithResult:VERIFY_REUSLT_FAIL Error:[NSError errorWithDomain:@"暂不支持" code:-1 userInfo:nil] SessionId:nil]; } #pragma mark 选择方式 -(void)fengkongAndShibie { switch (self->mAuthType) { case MSAuthTypeSlide: case MSAuthTypeCall: case MSAuthTypeSms: [self pushAuthVC:self->mAuthType]; break; default: [self msgNotSupport]; return; } } -(void)yanzheng { MSAuthType type = 0; switch (self.chooseAuthNoneNumIndex) { case 0: type = MSAuthTypeSlide;break; case 1: type = MSAuthBallRoll; case 2: type = MSAuthBallShake; default: [self msgNotSupport]; return; } [self onAuthType:type data:nil]; } -(void)onSelect:(UITextField*)v index:(NSUInteger)index { if (v==self.chooseAuth) { self->mAuthType = index; } else if(v == self.chooseAuthNoneNum) { // self.chooseAuthNoneNum.choise = @[@"划一划",@"滚一滚",@"摇一摇"]; self.chooseAuthNoneNumIndex = index; } } - (void)viewDidLoad { [self setColor]; #define space 0 #define height 35 #define label_height 20 #define leading 10 #define controlwidth self.view.bounds.size.width-40-40 // MSAuthTypeSms =1, // MSAuthTypeCall, // MSAuthTypeMail, // MSAuthTypeSlide, // MSAuthBallShake, // MSAuthBallRoll self.choice= @[@"切换语言",@"短信",@"语音",@"滑动",@"邮件",@"摇一摇",@"滚动"]; UILabel* l = [[UILabel alloc] initWithFrame:CGRectMake(leading, 80, controlwidth, label_height)]; l.font = [UIFont systemFontOfSize:10]; l.text = @"服务器地址/域名"; [self.view addSubview:l]; self.ipaddress = [[UITextField alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(l.frame) ,controlwidth, height)]; self.ipaddress.clearButtonMode= UITextFieldViewModeWhileEditing; self.ipaddress.textAlignment = NSTextAlignmentCenter; [self.ipaddress setBorderStyle:UITextBorderStyleRoundedRect]; NSString* ip = [[NSUserDefaults standardUserDefaults] valueForKey:@"ip"]; if (ip.length) { self.host = ip; } else { self.host = @"0.0.0.0"; } self.ipaddress.text = self.host; [self.view addSubview:self.ipaddress]; // self.ipaddress.delegate = self; [self.ipaddress addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; l = [[UILabel alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(self.ipaddress.frame)+space, controlwidth, label_height)]; l.font = [UIFont systemFontOfSize:10]; l.text = @"电话号码"; [self.view addSubview:l]; self.phonenumber = [[UITextField alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(l.frame), controlwidth, height*1)]; self.phonenumber.clearButtonMode= UITextFieldViewModeWhileEditing; [self.phonenumber setBorderStyle:UITextBorderStyleRoundedRect]; self.phonetext = [[NSUserDefaults standardUserDefaults] valueForKey:@"phone"]; self.phonenumber.text = self.phonetext; [self.phonenumber addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; [self.view addSubview:self.phonenumber]; l = [[UILabel alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(self.phonenumber.frame)+space, controlwidth, label_height*1)]; l.font = [UIFont systemFontOfSize:10]; l.text = @"风险识别+验证"; [self.view addSubview:l]; self.chooseAuth = [[UITextFieldWithPick alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(l.frame), controlwidth, height*1)]; self.chooseAuth.selectDelegate = self; self.chooseAuth.delegate = self; self.chooseAuth.choise = self.choice; self->mAuthType = MSAuthTypeSlide; self.chooseAuth.text = [self.choice objectAtIndex:self->mAuthType]; [self.chooseAuth setBorderStyle:UITextBorderStyleRoundedRect]; [self.view addSubview:self.chooseAuth]; UIButton* b = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.chooseAuth.frame)+10, CGRectGetMaxY(l.frame), self.view.bounds.size.width-CGRectGetMaxX(self.chooseAuth.frame)-15, height*1) ]; [b.titleLabel setFont:[UIFont systemFontOfSize:10]]; [b.layer setBorderColor:[[UIColor lightGrayColor] CGColor]]; [b.layer setCornerRadius:2]; [b.layer setBorderWidth:1]; [b setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [b setTitle:@"识别+验证" forState:UIControlStateNormal]; [b addTarget:self action:@selector(fengkongAndShibie) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:b]; l = [[UILabel alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(self.chooseAuth.frame)+space, controlwidth, label_height*1)]; l.font = [UIFont systemFontOfSize:10]; l.text = @"风险验证"; [self.view addSubview:l]; self.chooseAuthNoneNum = [[UITextFieldWithPick alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(l.frame), controlwidth, height*1)]; self.chooseAuthNoneNum.selectDelegate = self; self.chooseAuthNoneNum.delegate = self; self.chooseAuthNoneNumIndex = 0; self.chooseAuthNoneNum.choise = @[@"滑动",@"滚一滚",@"摇一摇"]; self.chooseAuthNoneNum.text = @"滑动"; [self.chooseAuthNoneNum setBorderStyle:UITextBorderStyleRoundedRect]; [self.view addSubview:self.chooseAuthNoneNum]; b = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.chooseAuthNoneNum.frame)+10, CGRectGetMaxY(l.frame), self.view.bounds.size.width-CGRectGetMaxX(self.chooseAuthNoneNum.frame)-15, height*1) ]; [b.titleLabel setFont:[UIFont systemFontOfSize:10]]; [b.layer setBorderColor:[[UIColor lightGrayColor] CGColor]]; [b.layer setCornerRadius:2]; [b.layer setBorderWidth:1]; [b setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [b setTitle:@"验证" forState:UIControlStateNormal]; [b addTarget:self action:@selector(yanzheng) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:b]; l = [[UILabel alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(self.chooseAuthNoneNum.frame)+space, controlwidth, label_height)]; l.font = [UIFont systemFontOfSize:10]; l.text = @"回调返回错误信息"; [self.view addSubview:l]; self.status = [[UITextView alloc] initWithFrame:CGRectMake(leading, CGRectGetMaxY(l.frame), controlwidth, CGRectGetMaxY(self.view.frame)- CGRectGetMaxY(l.frame)-10)]; [self.status setEditable:NO]; self.status.layer.backgroundColor = [[UIColor clearColor] CGColor]; self.status.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.status.layer.borderWidth = 1.0; self.status.layer.cornerRadius = 3.0f; self.status.text = @""; [self.view addSubview:self.status]; #pragma mark 设置运行环境,默认是线上 [super viewDidLoad]; } -(void)textFieldDidChange :(UITextField *)theTextField{ if(theTextField==self.ipaddress){ self.host= theTextField.text; } if(theTextField==self.phonenumber){ self.phonetext= theTextField.text; [[NSUserDefaults standardUserDefaults] setValue:self.phonetext forKey:@"phone"]; } } - (BOOL)textFieldShouldReturn:(UITextField *)textField { if(textField==self.ipaddress) { [textField resignFirstResponder]; return YES; } return YES; } - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if (textField==self.chooseAuth) { [self.chooseAuth showAuthChoose]; } else if (textField == self.chooseAuthNoneNum) { [self.chooseAuthNoneNum showAuthChoose]; } return YES; } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField==self.chooseAuth || textField == self.chooseAuthNoneNum) { return NO; } return TRUE; } - (void)changeLanguage { } #pragma mark 风险采集调用 //风险采集调用获得 -(void) doJAQVerfificationToken { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ id<IOpenSecurityBodyComponent> sbComp = [[OpenSecurityGuardManager getInstance] getSecurityBodyComp]; NSError* error = nil; NSString* wtoken = [sbComp getSecurityBodyDataEx: nil appKey: nil authCode: @"0335" extendParam: nil flag: OPEN_SECURITYBODY_FLAG_FORMAT_GENERAL //指定格式 env: OPEN_SECURITYBODY_ENV_ONLINE //指定环境 error: &error]; NSLog(@"dojaqverX=%@",wtoken); dispatch_async(dispatch_get_main_queue(), ^{ [self tokenQueryFinished:nil wtoken:wtoken]; }); }); } - (void)pushAuthVC:(MSAuthType)type{ self.status.text = @""; [self doJAQVerfificationToken]; } //当接入服务端用一下用户访问, //邮箱 test_hua@test.com //test_phone@test.com //test_sms@test.com //test_shake@test.com //test_gun@test.com //会跳出对应的验证方式 #pragma mark 风险识别 //将wtoken利用三方服务器,透传到聚安全服务器 -(void)tokenQueryFinished:(NSError *)error wtoken:(NSString *)tokenid { NSString* formaturl = @"http://%@:8080/action/wtoken=%@&&mail=%@&&phone=%@"; [[NSUserDefaults standardUserDefaults] setValue:self.ipaddress.text forKey:@"ip"]; /**************************************************************************************************************/ #pragma mark 账号和电话应该在服务器端设置而不是客户端,增加这些只是为了demo更快看到效果避免修改后端代码 /*****账号和电话应该在服务器端设置而不是客户端,增加这些只是为了demo更快看到效果避免修改后端代码**************************/ NSString* mail = @""; switch (self->mAuthType) { case MSAuthTypeSms: mail = @"test_sms@test.com"; break; case MSAuthTypeCall: mail = @"test_phone@test.com"; break; case MSAuthTypeSlide: mail = @"test_hua@test.com"; break; case MSAuthBallShake: mail = @"test_shake@test.com"; break; case MSAuthBallRoll: mail = @"test_gun@test.com"; break; default: break; } self.host = self.ipaddress.text; NSString* url = [NSString stringWithFormat:formaturl,self.host,tokenid,mail,self.phonetext]; /**************************************************************************************************************/ NSURLRequest* request = [NSURLRequest requestWithURL: [NSURL URLWithString:url]]; [[NSURLConnection connectionWithRequest:request delegate:self] start]; } #pragma mark 网络操作回调 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { self.status.text = error.localizedDescription; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)jsondata { BOOL isToken = [connection.currentRequest.URL.path hasPrefix:@"/action/wtoken"]; if (isToken) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsondata options:NSJSONReadingMutableLeaves error:nil]; MSAuthType type = [dict[@"captcha_type"] integerValue]; [self onAuthType:type data:dict[@"captcha_client_need_info"]]; return; } else{ NSString* jsonString = [[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding]; //self.status.text = jsonString; [self.status setText:[NSString stringWithFormat:@"%@ %@", self.status.text, jsonString]]; } } #pragma mark 风险验证 -(void)onAuthType:(MSAuthType)type data:(NSString*)data { if (data==nil) { UIViewController *vc = [MSAuthVCFactory simapleVerifyWithType:type language:@"en" Delegate:self authCode:@"0335" appKey:nil]; [self.navigationController pushViewController:vc animated:YES]; return; } UIViewController *vc = [MSAuthVCFactory vcWithAuthType:type jsonData:data language:@"en" Delegate:self authCode:@"0335" appKey:nil]; [self.navigationController pushViewController:vc animated:YES]; } #pragma mark 风险验证结果回传服务器 - (void)secondVerifyWithSessionId:(NSString *)sessionId { if (sessionId) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"SessionID = %@",sessionId); dispatch_async(dispatch_get_main_queue(), ^{ NSString* formaturl = @"http://%@:8080/action/sessionid=%@"; [[NSUserDefaults standardUserDefaults] setValue:self.ipaddress.text forKey:@"ip"]; self.host = self.ipaddress.text; NSString* url = [NSString stringWithFormat:formaturl,self.host, sessionId]; NSURLRequest* request = [NSURLRequest requestWithURL: [NSURL URLWithString:url]]; [[NSURLConnection connectionWithRequest:request delegate:self] start]; }); }); } else { NSLog(@"Error: SessionID is nil"); } } #pragma mark 风险验证回调 - (void)verifyDidFinishedWithResult:(t_verify_reuslt)code Error:(NSError *)error SessionId:(NSString *)sessionId { dispatch_async(dispatch_get_main_queue(), ^{ if (error) { self.status.text = error.localizedDescription; NSLog(@"Error: %@", error); } else { NSString* msg = [NSString stringWithFormat:@"Authentication passed! Session id: %@", sessionId]; self.status.text = msg; NSLog(@"%@",msg); } [self.navigationController popViewControllerAnimated:YES]; if (sessionId) { [self secondVerifyWithSessionId:sessionId]; } }); } @end