iOS Best Practice Guide

Last updated:2024-06-17
iOS Best Practice Guide

This is an introduction. iOS SDK One-Tap LoginBest practice.

One-Tap LoginProcess description

Initialize SDK-> GetCarrierPre-number- > Set Mandated Page UI Style-> Pull-%1 Page Noodles.

1. Initialization

We suggest thatAppDelegate.mYes.application:didFinishLaunchingWithOptions:Initialization in Method SDK。 SDK The original herd is intended for early extraction.CarrierConfigure, pull the carrier 's configuration earlier helps to improve one-tap loginSpeed.

#import "AppDelegate.h" #import "JVERIFICATIONService.h" // 如果需要使用 idfa 功能所需要引入的头文件(可选) #import <AdSupport/AdSupport.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 如需使用 IDFA 功能请添加此代码并在初始化配置类中设置 advertisingI NSString *idfaStr = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; JVAuthConfig *config = [[JVAuthConfig alloc] init]; config.appKey = @"your appkey"; config.advertisingId = idfaStr; config.timeout = 5000; config.authBlock = ^(NSDictionary *result) { NSLog(@"初始化结果 result:%@", result); }; [JVERIFICATIONService setupWithConfig:config]; return YES; }
          #import "AppDelegate.h"
#import "JVERIFICATIONService.h"
// 如果需要使用 idfa 功能所需要引入的头文件(可选)
#import <AdSupport/AdSupport.h>

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
 // 如需使用 IDFA 功能请添加此代码并在初始化配置类中设置 advertisingI
 NSString *idfaStr = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

 JVAuthConfig *config = [[JVAuthConfig alloc] init];
 config.appKey = @"your appkey";
 config.advertisingId = idfaStr;
 config.timeout = 5000;
 config.authBlock = ^(NSDictionary *result) {
 NSLog(@"初始化结果 result:%@", result);
 };
 [JVERIFICATIONService setupWithConfig:config];
 
 return YES;
}

        
This code block is shown in the floating window

2. Advance number

API:Preclaim number The preliminary number is through.CarrierAccessLogintokenSo we suggest a key for entry.Login, and then call the prep interface, so that when the user really has to use one-tap loginThis reduces the load time of the predeposit number and enhances the user experience.

We suggest that the user add a field storage prep interface status!

//增加一个字段存储预取号接口状态 static BOOL finishPrelogin = YES; - (void)viewDidLoad { [super viewDidLoad]; //建议在页面加载时进行获取预取号 [self preLogin]; } - (void)preLogin { // 先判断SDK初始化状态 if ([JVERIFICATIONService isSetupClient]) { finishPrelogin = NO; [JVERIFICATIONService preLogin:5000 completion:^(NSDictionary * _Nonnull result) { // 回调响应结果,建议用户增加一个字段存储预取号接口状态 finishPrelogin = YES; }]; } }
          //增加一个字段存储预取号接口状态
static BOOL finishPrelogin = YES;
- (void)viewDidLoad {
 [super viewDidLoad];
 //建议在页面加载时进行获取预取号
 [self preLogin];
}

- (void)preLogin {
 // 先判断SDK初始化状态
 if ([JVERIFICATIONService isSetupClient]) {
 finishPrelogin = NO;
 [JVERIFICATIONService preLogin:5000 completion:^(NSDictionary * _Nonnull result) {
 // 回调响应结果,建议用户增加一个字段存储预取号接口状态
 finishPrelogin = YES;
 }];
 }
}

        
This code block is shown in the floating window

3. Set authorized page UI style

API:Customise authorized page UI styles Pulling up the authorization.Loginbefore the page, it is suggested to set a custom page style to have a better page effect.

- (void)loginAuth { //一些前置操作,例如:判断是否处于预取号中,加载HUD等等.............. //建议拉起授权页面之前设置自定义UI [self setUIConfig]; //以下为拉起授权页面部分.............. } - (void)setUIConfig{ JVUIConfig *config = [[JVUIConfig alloc] init]; config.prefersStatusBarHidden = YES; config.shouldAutorotate = YES; config.openPrivacyInBrowser = NO; config.autoLayout = YES; config.agreementNavTextColor = [UIColor redColor]; config.navReturnHidden = NO; config.privacyTextFontSize = 12; config.navText = [[NSAttributedString alloc]initWithString:@"登录统一认证" attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:18]}]; config.privacyTextAlignment = NSTextAlignmentLeft; config.numberFont = [UIFont boldSystemFontOfSize:12]; config.logBtnFont = [UIFont boldSystemFontOfSize:13]; config.sloganFont = [UIFont boldSystemFontOfSize:16]; config.modalTransitionStyle = UIModalTransitionStyleCoverVertical; config.privacyTextAlignment = NSTextAlignmentLeft; config.privacyShowBookSymbol = YES; config.privacyComponents = @[@"登录表示同意",@"文本1",@"文本2",@"文本3",@"文本4",@"文本5"]; config.preferredStatusBarStyle = 0; config.agreementPreferredStatusBarStyle = 0; config.privacyState = NO; config.dismissAnimationFlag = YES; ///协议二次弹窗默认配置 config.isAlertPrivacyVC = YES; // config.agreementAlertViewLogBtnTextColor = [UIColor whiteColor]; // config.agreementAlertViewTitleTextColor = [UIColor colorWithRed:34/255 green:35/255 blue:40/255 alpha:1]; config.agreementAlertViewContentTextFontSize = 10; config.agreementAlertViewContentTextAlignment = NSTextAlignmentLeft; // config.agreementAlertViewTitleTexFont = [UIFont fontWithName:NSFontAttributeName size:16]; config.windowCornerRadius = 15; config.resetAgreementAlertViewFrameBlock = ^(NSValue *_Nullable* _Nullable superViewFrame,NSValue *_Nullable* _Nullable alertViewFrame, NSValue *_Nullable* _Nullable titleFrame, NSValue *_Nullable* _Nullable contentFrame, NSValue *_Nullable* _Nullable buttonFrame){ *superViewFrame = [NSValue valueWithCGRect:CGRectMake(10, 60, 280, 180)]; *alertViewFrame = [NSValue valueWithCGRect:CGRectMake(0, 0, 280, 180)]; *buttonFrame = [NSValue valueWithCGRect:CGRectMake(CGRectGetMidX([*contentFrame CGRectValue])-180/2, CGRectGetMaxY([*contentFrame CGRectValue])+5, 180, CGRectGetHeight([*buttonFrame CGRectValue]))]; }; config.customLoadingViewBlock = ^(UIView *View) { //https://github.com/jdg/MBProgressHUD MBProgressHUD *hub = [MBProgressHUD showHUDAddedTo:View animated:YES]; hub.backgroundColor = [UIColor clearColor]; hub.label.text = @"正在登录.."; [hub showAnimated:YES]; }; config.customPrivacyAlertViewBlock = ^(UIViewController *vc, NSArray *appPrivacys,void(^loginAction)(void)) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请点击同意协议" message:appPrivacys.description preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { loginAction(); }]]; [vc presentViewController:alert animated:true completion:nil]; }; config.agreementAlertViewShowWindow = YES; __weak __typeof(self)weakSelf = self; config.customAgreementAlertView = ^(UIView *superView,void(^hidAlertView)(void)){ weakSelf.hidAlertView = hidAlertView; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(10, 50, 60, 40); [button setTitle:@"关闭拉起" forState:UIControlStateNormal]; button.backgroundColor = [UIColor greenColor]; [button addTarget:self action:@selector(buttonTouch_alerView) forControlEvents:UIControlEventTouchUpInside]; [superView addSubview:button]; }; //logo config.logoImg = [UIImage imageNamed:@"cmccLogo"]; CGFloat logoWidth = config.logoImg.size.width?:100; CGFloat logoHeight = logoWidth; JVLayoutConstraint *logoConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; JVLayoutConstraint *logoConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:-90]; JVLayoutConstraint *logoConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:logoWidth]; JVLayoutConstraint *logoConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:logoHeight]; config.logoConstraints = @[logoConstraintX,logoConstraintY,logoConstraintW,logoConstraintH]; config.logoHorizontalConstraints = config.logoConstraints; //号码栏 JVLayoutConstraint *numberConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; JVLayoutConstraint *numberConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:-55]; JVLayoutConstraint *numberConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:130]; JVLayoutConstraint *numberConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:25]; config.numberConstraints = @[numberConstraintX,numberConstraintY, numberConstraintW, numberConstraintH]; config.numberHorizontalConstraints = config.numberConstraints; //slogan展示 JVLayoutConstraint *sloganConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; JVLayoutConstraint *sloganConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:-20]; JVLayoutConstraint *sloganConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:180]; JVLayoutConstraint *sloganConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:20]; config.sloganConstraints = @[sloganConstraintX,sloganConstraintY, sloganConstraintW, sloganConstraintH]; config.sloganHorizontalConstraints = config.sloganConstraints; //登录按钮 UIImage *login_nor_image = [self imageNamed:@"loginBtn_Nor"]; UIImage *login_dis_image = [self imageNamed:@"loginBtn_Dis"]; UIImage *login_hig_image = [self imageNamed:@"loginBtn_Hig"]; if (login_nor_image && login_dis_image && login_hig_image) { config.logBtnImgs = @[login_nor_image, login_dis_image, login_hig_image]; } CGFloat loginButtonWidth = login_nor_image.size.width?:100; CGFloat loginButtonHeight = login_nor_image.size.height?:100; JVLayoutConstraint *loginConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; JVLayoutConstraint *loginConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:30]; JVLayoutConstraint *loginConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:loginButtonWidth]; JVLayoutConstraint *loginConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:loginButtonHeight]; config.logBtnConstraints = @[loginConstraintX,loginConstraintY,loginConstraintW,loginConstraintH]; config.logBtnHorizontalConstraints = config.logBtnConstraints; //勾选框---全屏样式 sdk先add隐私 因为隐私大小随内容变化而变化 UIImage * uncheckedImg = [self imageNamed:@"checkBox_unSelected"]; UIImage * checkedImg = [self imageNamed:@"checkBox_selected"]; CGFloat checkViewWidth = uncheckedImg.size.width; CGFloat checkViewHeight = uncheckedImg.size.height; config.uncheckedImg = uncheckedImg; config.checkedImg = checkedImg; JVLayoutConstraint *checkViewConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeLeft multiplier:1 constant:20]; JVLayoutConstraint *checkViewConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemPrivacy attribute:NSLayoutAttributeTop multiplier:1 constant:0];//改为top对齐 JVLayoutConstraint *checkViewConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:checkViewWidth]; JVLayoutConstraint *checkViewConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:checkViewHeight]; config.checkViewConstraints = @[checkViewConstraintX,checkViewConstraintY,checkViewConstraintW,checkViewConstraintH]; config.checkViewHorizontalConstraints = config.checkViewConstraints; config.navCustom = YES; config.privacysNavCustom = NO; //隐私 config.textVerAlignment = JVVerAlignmentTop;///设置隐私Label的垂直对齐方式 //隐私---旧方法 CGFloat spacing = checkViewWidth + 20 + 5; config.appPrivacyOne = @[@"应用自定义服务条款1",@"https://www.jiguang.cn/about"]; config.appPrivacyTwo = @[@"应用自定义服务条款2",@"https://www.jiguang.cn/about"]; //隐私---新方法 存在appPrivacys则默认使用appPrivacys方式 config.appPrivacys = @[ @"头部文字",//头部文字 @[@"、",@"应用自定义服务条款1",@"https://www.taobao.com/",@"协议1自定义标题"], @[@"、",@"应用自定义服务条款2",@"https://www.jiguang.cn/",@"协议2自定义标题"], @[@"、",@"应用自定义服务条款3",@"https://www.baidu.com/", @"协议3自定义标题"], // @[@"、",@"应用自定义服务条款4",@"https://www.taobao.com/",@"协议4自定义标题"], // @[@"、",@"应用自定义服务条款5",@"https://www.taobao.com/",@"协议5自定义标题"], @"尾部文字。" ]; JVLayoutConstraint *privacyConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeLeft multiplier:1 constant:spacing]; JVLayoutConstraint *privacyConstraintX2 = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeRight multiplier:1 constant:-spacing]; JVLayoutConstraint *privacyConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeBottom multiplier:1 constant:-20]; JVLayoutConstraint *privacyConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:80]; config.privacyConstraints = @[privacyConstraintX,privacyConstraintX2,privacyConstraintY,privacyConstraintH]; config.privacyHorizontalConstraints = config.privacyConstraints; //loading JVLayoutConstraint *loadingConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; JVLayoutConstraint *loadingConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]; JVLayoutConstraint *loadingConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:30]; JVLayoutConstraint *loadingConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:30]; config.loadingConstraints = @[loadingConstraintX,loadingConstraintY,loadingConstraintW,loadingConstraintH]; config.loadingHorizontalConstraints = config.loadingConstraints; // 设置 gif背景 // config.authPageGifImagePath = [[NSBundle mainBundle] pathForResource:@"auth" ofType:@"gif"]; /* config.authPageBackgroundImage = [UIImage imageNamed:@"背景图"]; config.navColor = [UIColor redColor]; config.preferredStatusBarStyle = UIStatusBarStyleDefault; config.navText = [[NSAttributedString alloc] initWithString:@"自定义标题"]; config.navReturnImg = [UIImage imageNamed:@"自定义返回键"]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 0, 44, 44); button.backgroundColor = [UIColor greenColor]; config.navControl = [[UIBarButtonItem alloc] initWithCustomView:button]; config.logoHidden = NO; config.logBtnText = @"自定义登录按钮文字"; config.logBtnTextColor = [UIColor redColor]; config.numberColor = [UIColor blueColor]; config.appPrivacyOne = @[@"应用自定义服务条款1",@"https://www.jiguang.cn/about"]; config.appPrivacyTwo = @[@"应用自定义服务条款2",@"https://www.jiguang.cn/about"]; config.privacyComponents = @[@"文本1",@"文本2",@"文本3",@"文本4"]; config.appPrivacyColor = @[[UIColor redColor], [UIColor blueColor]]; config.sloganTextColor = [UIColor redColor]; config.navCustom = NO; config.numberSize = 24; config.privacyState = YES; */ config.navCustom = NO; NSString *urlStr = @"http://video01.youju.sohu.com/88a61007-d1be-4e82-8d74-2b87ba7797f72_0_0.mp4"; [config setVideoBackgroudResource:urlStr placeHolder:@"cmBackground.jpeg"]; [JVERIFICATIONService customUIWithConfig:[self customSMSUI:config] customViews:^(UIView *customAreaView) { /* //添加一个自定义label UILabel *lable = [[UILabel alloc] init]; lable.text = @"这是一个自定义label"; [lable sizeToFit]; lable.center = customAreaView.center; [customAreaView addSubview:lable]; */ UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(10, 400, 100, 40); [button setTitle:@"关闭拉起" forState:UIControlStateNormal]; button.backgroundColor = [UIColor greenColor]; [button addTarget:self action:@selector(buttonTouch) forControlEvents:UIControlEventTouchUpInside]; [customAreaView addSubview:button]; UIButton *button2 = [UIButton buttonWithType:UIButtonTypeSystem]; button2.frame = CGRectMake(200, 400, 100, 40); [button2 setTitle:@"关闭" forState:UIControlStateNormal]; button2.backgroundColor = [UIColor greenColor]; [button2 addTarget:self action:@selector(buttonTouch2) forControlEvents:UIControlEventTouchUpInside]; // [customAreaView addSubview:button2]; /* UILabel *autoLabel = [[UILabel alloc] init]; autoLabel.text = @"这是一个自定义autoLable"; [autoLabel sizeToFit]; [customAreaView addSubview:autoLabel]; autoLabel.translatesAutoresizingMaskIntoConstraints = NO; NSLayoutConstraint *constraintCenterX = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:customAreaView attribute:NSLayoutAttributeCenterX multiplier:1 constant:10]; NSLayoutConstraint *constraintCenterY = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:customAreaView attribute:NSLayoutAttributeCenterY multiplier:1 constant:10]; NSLayoutConstraint *constarintW = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1 constant:50]; NSLayoutConstraint *constarintH = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:20]; [autoLabel addConstraint:constarintW]; [autoLabel addConstraint:constarintH]; [customAreaView addConstraint:constraintCenterX]; [customAreaView addConstraint:constraintCenterY]; */ }]; }
          - (void)loginAuth {
 //一些前置操作,例如:判断是否处于预取号中,加载HUD等等..............
 //建议拉起授权页面之前设置自定义UI
 [self setUIConfig];
 //以下为拉起授权页面部分..............
}

- (void)setUIConfig{
 
 JVUIConfig *config = [[JVUIConfig alloc] init];
 config.prefersStatusBarHidden = YES;
 config.shouldAutorotate = YES;
 config.openPrivacyInBrowser = NO;
 config.autoLayout = YES;
 config.agreementNavTextColor = [UIColor redColor];
 
 config.navReturnHidden = NO;
 config.privacyTextFontSize = 12;
 config.navText = [[NSAttributedString alloc]initWithString:@"登录统一认证" attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:18]}];
 config.privacyTextAlignment = NSTextAlignmentLeft;
 config.numberFont = [UIFont boldSystemFontOfSize:12];
 config.logBtnFont = [UIFont boldSystemFontOfSize:13];
 config.sloganFont = [UIFont boldSystemFontOfSize:16];
 config.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
 
 config.privacyTextAlignment = NSTextAlignmentLeft;
 config.privacyShowBookSymbol = YES;
 
 config.privacyComponents = @[@"登录表示同意",@"文本1",@"文本2",@"文本3",@"文本4",@"文本5"];
 
 config.preferredStatusBarStyle = 0;
 config.agreementPreferredStatusBarStyle = 0;
 config.privacyState = NO;
 config.dismissAnimationFlag = YES;
 
 ///协议二次弹窗默认配置
 config.isAlertPrivacyVC = YES;
// config.agreementAlertViewLogBtnTextColor = [UIColor whiteColor];
// config.agreementAlertViewTitleTextColor = [UIColor colorWithRed:34/255 green:35/255 blue:40/255 alpha:1];
 config.agreementAlertViewContentTextFontSize = 10;
 config.agreementAlertViewContentTextAlignment = NSTextAlignmentLeft;
// config.agreementAlertViewTitleTexFont = [UIFont fontWithName:NSFontAttributeName size:16];
 
 config.windowCornerRadius = 15;
 
 config.resetAgreementAlertViewFrameBlock = ^(NSValue *_Nullable* _Nullable superViewFrame,NSValue *_Nullable* _Nullable alertViewFrame, NSValue *_Nullable* _Nullable titleFrame, NSValue *_Nullable* _Nullable contentFrame, NSValue *_Nullable* _Nullable buttonFrame){
 *superViewFrame = [NSValue valueWithCGRect:CGRectMake(10, 60, 280, 180)];
 *alertViewFrame = [NSValue valueWithCGRect:CGRectMake(0, 0, 280, 180)];
 *buttonFrame = [NSValue valueWithCGRect:CGRectMake(CGRectGetMidX([*contentFrame CGRectValue])-180/2, CGRectGetMaxY([*contentFrame CGRectValue])+5, 180, CGRectGetHeight([*buttonFrame CGRectValue]))];
 };
 
 config.customLoadingViewBlock = ^(UIView *View) {
 
 //https://github.com/jdg/MBProgressHUD
 MBProgressHUD *hub = [MBProgressHUD showHUDAddedTo:View animated:YES];
 hub.backgroundColor = [UIColor clearColor];
 hub.label.text = @"正在登录..";
 [hub showAnimated:YES];
 
 };
 
 config.customPrivacyAlertViewBlock = ^(UIViewController *vc, NSArray *appPrivacys,void(^loginAction)(void)) {
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请点击同意协议" message:appPrivacys.description preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 loginAction();
 }]];
 [vc presentViewController:alert animated:true completion:nil];
 };
 
 config.agreementAlertViewShowWindow = YES;
 
 __weak __typeof(self)weakSelf = self;
 config.customAgreementAlertView = ^(UIView *superView,void(^hidAlertView)(void)){
 
 weakSelf.hidAlertView = hidAlertView;
 
 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
 button.frame = CGRectMake(10, 50, 60, 40);
 [button setTitle:@"关闭拉起" forState:UIControlStateNormal];
 button.backgroundColor = [UIColor greenColor];
 [button addTarget:self action:@selector(buttonTouch_alerView) forControlEvents:UIControlEventTouchUpInside];
 [superView addSubview:button];
 
 };
 
 //logo
 config.logoImg = [UIImage imageNamed:@"cmccLogo"];
 CGFloat logoWidth = config.logoImg.size.width?:100;
 CGFloat logoHeight = logoWidth;
 JVLayoutConstraint *logoConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
 JVLayoutConstraint *logoConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:-90];
 JVLayoutConstraint *logoConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:logoWidth];
 JVLayoutConstraint *logoConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:logoHeight];
 config.logoConstraints = @[logoConstraintX,logoConstraintY,logoConstraintW,logoConstraintH];
 config.logoHorizontalConstraints = config.logoConstraints;
 
 //号码栏
 JVLayoutConstraint *numberConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
 JVLayoutConstraint *numberConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:-55];
 JVLayoutConstraint *numberConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:130];
 JVLayoutConstraint *numberConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:25];
 config.numberConstraints = @[numberConstraintX,numberConstraintY, numberConstraintW, numberConstraintH];
 config.numberHorizontalConstraints = config.numberConstraints;
 
 //slogan展示
 JVLayoutConstraint *sloganConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
 JVLayoutConstraint *sloganConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:-20];
 JVLayoutConstraint *sloganConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:180];
 JVLayoutConstraint *sloganConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:20];
 config.sloganConstraints = @[sloganConstraintX,sloganConstraintY, sloganConstraintW, sloganConstraintH];
 config.sloganHorizontalConstraints = config.sloganConstraints;
 
 
 //登录按钮
 UIImage *login_nor_image = [self imageNamed:@"loginBtn_Nor"];
 UIImage *login_dis_image = [self imageNamed:@"loginBtn_Dis"];
 UIImage *login_hig_image = [self imageNamed:@"loginBtn_Hig"];
 if (login_nor_image && login_dis_image && login_hig_image) {
 config.logBtnImgs = @[login_nor_image, login_dis_image, login_hig_image];
 }
 CGFloat loginButtonWidth = login_nor_image.size.width?:100;
 CGFloat loginButtonHeight = login_nor_image.size.height?:100;
 JVLayoutConstraint *loginConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
 JVLayoutConstraint *loginConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:30];
 JVLayoutConstraint *loginConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:loginButtonWidth];
 JVLayoutConstraint *loginConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:loginButtonHeight];
 config.logBtnConstraints = @[loginConstraintX,loginConstraintY,loginConstraintW,loginConstraintH];
 config.logBtnHorizontalConstraints = config.logBtnConstraints;
 
 //勾选框---全屏样式 sdk先add隐私 因为隐私大小随内容变化而变化
 UIImage * uncheckedImg = [self imageNamed:@"checkBox_unSelected"];
 UIImage * checkedImg = [self imageNamed:@"checkBox_selected"];
 CGFloat checkViewWidth = uncheckedImg.size.width;
 CGFloat checkViewHeight = uncheckedImg.size.height;
 config.uncheckedImg = uncheckedImg;
 config.checkedImg = checkedImg;
 JVLayoutConstraint *checkViewConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeLeft multiplier:1 constant:20];
 JVLayoutConstraint *checkViewConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemPrivacy attribute:NSLayoutAttributeTop multiplier:1 constant:0];//改为top对齐
 JVLayoutConstraint *checkViewConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:checkViewWidth];
 JVLayoutConstraint *checkViewConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:checkViewHeight];
 config.checkViewConstraints = @[checkViewConstraintX,checkViewConstraintY,checkViewConstraintW,checkViewConstraintH];
 config.checkViewHorizontalConstraints = config.checkViewConstraints;
 
 config.navCustom = YES;
 config.privacysNavCustom = NO;
 
 
 //隐私
 config.textVerAlignment = JVVerAlignmentTop;///设置隐私Label的垂直对齐方式
 //隐私---旧方法
 CGFloat spacing = checkViewWidth + 20 + 5;
 config.appPrivacyOne = @[@"应用自定义服务条款1",@"https://www.jiguang.cn/about"];
 config.appPrivacyTwo = @[@"应用自定义服务条款2",@"https://www.jiguang.cn/about"];
 
 //隐私---新方法 存在appPrivacys则默认使用appPrivacys方式
 config.appPrivacys = @[
 @"头部文字",//头部文字
 @[@"、",@"应用自定义服务条款1",@"https://www.taobao.com/",@"协议1自定义标题"],
 @[@"、",@"应用自定义服务条款2",@"https://www.jiguang.cn/",@"协议2自定义标题"],
 @[@"、",@"应用自定义服务条款3",@"https://www.baidu.com/", @"协议3自定义标题"],
// @[@"、",@"应用自定义服务条款4",@"https://www.taobao.com/",@"协议4自定义标题"],
// @[@"、",@"应用自定义服务条款5",@"https://www.taobao.com/",@"协议5自定义标题"],
 @"尾部文字。"
 ];
 
 JVLayoutConstraint *privacyConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeLeft multiplier:1 constant:spacing];
 JVLayoutConstraint *privacyConstraintX2 = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeRight multiplier:1 constant:-spacing];
 JVLayoutConstraint *privacyConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeBottom multiplier:1 constant:-20];
 JVLayoutConstraint *privacyConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:80];
 config.privacyConstraints = @[privacyConstraintX,privacyConstraintX2,privacyConstraintY,privacyConstraintH];
 config.privacyHorizontalConstraints = config.privacyConstraints;
 
 
 //loading
 JVLayoutConstraint *loadingConstraintX = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
 JVLayoutConstraint *loadingConstraintY = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemSuper attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
 JVLayoutConstraint *loadingConstraintW = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeWidth multiplier:1 constant:30];
 JVLayoutConstraint *loadingConstraintH = [JVLayoutConstraint constraintWithAttribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:JVLayoutItemNone attribute:NSLayoutAttributeHeight multiplier:1 constant:30];
 config.loadingConstraints = @[loadingConstraintX,loadingConstraintY,loadingConstraintW,loadingConstraintH];
 config.loadingHorizontalConstraints = config.loadingConstraints;
 
 // 设置 gif背景
 // config.authPageGifImagePath = [[NSBundle mainBundle] pathForResource:@"auth" ofType:@"gif"];
 
 /*
 config.authPageBackgroundImage = [UIImage imageNamed:@"背景图"];
 config.navColor = [UIColor redColor];
 config.preferredStatusBarStyle = UIStatusBarStyleDefault;
 config.navText = [[NSAttributedString alloc] initWithString:@"自定义标题"];
 config.navReturnImg = [UIImage imageNamed:@"自定义返回键"];
 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
 button.frame = CGRectMake(0, 0, 44, 44);
 button.backgroundColor = [UIColor greenColor];
 config.navControl = [[UIBarButtonItem alloc] initWithCustomView:button];
 config.logoHidden = NO;
 config.logBtnText = @"自定义登录按钮文字";
 config.logBtnTextColor = [UIColor redColor];
 config.numberColor = [UIColor blueColor];
 config.appPrivacyOne = @[@"应用自定义服务条款1",@"https://www.jiguang.cn/about"];
 config.appPrivacyTwo = @[@"应用自定义服务条款2",@"https://www.jiguang.cn/about"];
 config.privacyComponents = @[@"文本1",@"文本2",@"文本3",@"文本4"];
 config.appPrivacyColor = @[[UIColor redColor], [UIColor blueColor]];
 config.sloganTextColor = [UIColor redColor];
 config.navCustom = NO;
 config.numberSize = 24;
 config.privacyState = YES;
 */
 config.navCustom = NO;
 NSString *urlStr = @"http://video01.youju.sohu.com/88a61007-d1be-4e82-8d74-2b87ba7797f72_0_0.mp4";
 [config setVideoBackgroudResource:urlStr placeHolder:@"cmBackground.jpeg"];
 [JVERIFICATIONService customUIWithConfig:[self customSMSUI:config] customViews:^(UIView *customAreaView) {
 /*
 //添加一个自定义label
 UILabel *lable = [[UILabel alloc] init];
 lable.text = @"这是一个自定义label";
 [lable sizeToFit];
 lable.center = customAreaView.center;
 [customAreaView addSubview:lable];
 */
 
 
 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
 button.frame = CGRectMake(10, 400, 100, 40);
 [button setTitle:@"关闭拉起" forState:UIControlStateNormal];
 button.backgroundColor = [UIColor greenColor];
 [button addTarget:self action:@selector(buttonTouch) forControlEvents:UIControlEventTouchUpInside];
 [customAreaView addSubview:button];

 UIButton *button2 = [UIButton buttonWithType:UIButtonTypeSystem];
 button2.frame = CGRectMake(200, 400, 100, 40);
 [button2 setTitle:@"关闭" forState:UIControlStateNormal];
 button2.backgroundColor = [UIColor greenColor];
 [button2 addTarget:self action:@selector(buttonTouch2) forControlEvents:UIControlEventTouchUpInside];
// [customAreaView addSubview:button2];
 
 /*
 UILabel *autoLabel = [[UILabel alloc] init];
 autoLabel.text = @"这是一个自定义autoLable";
 [autoLabel sizeToFit];
 [customAreaView addSubview:autoLabel];
 
 
 autoLabel.translatesAutoresizingMaskIntoConstraints = NO;
 NSLayoutConstraint *constraintCenterX = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:customAreaView attribute:NSLayoutAttributeCenterX multiplier:1 constant:10];
 NSLayoutConstraint *constraintCenterY = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:customAreaView attribute:NSLayoutAttributeCenterY multiplier:1 constant:10];
 NSLayoutConstraint *constarintW = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1 constant:50];
 NSLayoutConstraint *constarintH = [NSLayoutConstraint constraintWithItem:autoLabel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:20];
 [autoLabel addConstraint:constarintW];
 [autoLabel addConstraint:constarintH];
 [customAreaView addConstraint:constraintCenterX];
 [customAreaView addConstraint:constraintCenterY];
 */
 }];
 
}

        
This code block is shown in the floating window

4. Pull up the authorization page Noodles.

API:Pull up authorized pages Pull up the authorized page and finish one in that pageLogin;

Attention.

If it is not available, the interface will take the initiative to get the prepick and then pull up the page; If the pre-deposit interface is called upon and is not yet completed, the callback returns the hint in the pre-equittal, and it is recommended that the interface be called after the pre-equittation has been completed; No custom UI set, default UI used;

- (void)loginAuth { //如果预登录未完成则不建议调用一键登录,根据我们的数据分析如果预登录较长时间未完成,一键登录的成功率也会降低,所以用户体验最好的方式就是,在预登录接口执行完成后进行一键登录。 //我们强烈建议,在一键登录的前置页面进行预取号接口调用。 if (!finishPrelogin) { return; } //设置自定义UI [self setUIConfig]; // 一键登录 __weak __typeof(self)weakSelf = self; [JVERIFICATIONService getAuthorizationWithController:weakSelf hide:YES animated:YES timeout:5*1000 completion:^(NSDictionary *result) { NSLog(@"一键登录 result:%@", result); NSString *token = result[@"loginToken"]; // 通过token调用极光接口去拿手机号。 [weakSelf getRealNumber:token]; } actionBlock:^(NSInteger type, NSString *content) { NSLog(@"一键登录 actionBlock:%ld %@", (long)type, content); }]; } - (void)setUIConfig {...... }
          - (void)loginAuth {
     //如果预登录未完成则不建议调用一键登录,根据我们的数据分析如果预登录较长时间未完成,一键登录的成功率也会降低,所以用户体验最好的方式就是,在预登录接口执行完成后进行一键登录。
     //我们强烈建议,在一键登录的前置页面进行预取号接口调用。
    if (!finishPrelogin) {
 return;
 }

 //设置自定义UI
 [self setUIConfig];
 
 // 一键登录
 __weak __typeof(self)weakSelf = self;
 [JVERIFICATIONService getAuthorizationWithController:weakSelf hide:YES animated:YES timeout:5*1000 completion:^(NSDictionary *result) {
 NSLog(@"一键登录 result:%@", result);
 NSString *token = result[@"loginToken"];
 // 通过token调用极光接口去拿手机号。
 [weakSelf getRealNumber:token];
 } actionBlock:^(NSInteger type, NSString *content) {
 NSLog(@"一键登录 actionBlock:%ld %@", (long)type, content);
 }];
}

- (void)setUIConfig {......
}

        
This code block is shown in the floating window
Was this document helpful?

Copyright 2011-2026, jiguang.cn, All Rights Reserved. 粤ICP备12056275号-13 Shenzhen Hexun Huagu Information Technology Co., Ltd.

Open in Docs Center