创蓝闪验一键登录

221闪验集成文档-简版

一、创建应用

**提示:一个应用对应一个appid,多个应用(不同bundleID)需在闪验平台创建多个应用以对应多个appid
**
应用的创建流程及APPID/APPKEY的获取,请查看「账号创建」文档

二、集成方式

1.通过CocoaPods自动集成

在工程的Podfile里面添加以下代码:以下示例pod 版本仅供参考,请按需选择或选择最新版本

pod 'CL_ShanYanSDK', '2.2.0.5'

注意:
在podfile中保存并执行pod install --no-repo-update,然后用后缀为.xcworkspace的文件打开工程。
命令行下执行pod search CL_ShanYanSDK,如显版本不是最新版,或者pod install导入的版本不是最新版,则先执行pod repo update操作更新本地repo的内容
关于CocoaPods的更多信息请查看 CocoaPods官方网站

2. 手动集成

2.1 导入framework

将闪验SDK压缩包中framework文件夹下所有资源添加到工程中(注意勾选Copy items if needed)

image

2.2 Xcode配置

  • OtherLinkerFlags中 添加-ObjC****:xcode->BuildSetting->Other Linker Flags 添加 -ObjC
    image
  • 添加libc++.1.tbd: 在xcode->General->Linked Frameworks and Libraries中点击 + ,搜索并选择添加 libc++.1.tbd
    image

3. Swift工程额外配置

  • 在xcode->BuildSetting->Other Linker Flags 添加-force_load


    image
  • 在-force_load下方添加CL_ShanYanSDK.framework/CL_ShanYanSDK所在路径,具体操作可以将CL_ShanYanSDK.framework拖入空栏,在尾部拼接静态库名称CL_ShanYanSDK,将前缀绝对地址改成相对地址(SRCROOT),最终为 "(SRCROOT)/.../CL_ShanYanSDK.framework/CL_ShanYanSDK"形式
    image

三、SDK使用说明

1.初始化

  • 导入闪验SDK头文件 #import <CL_ShanYanSDK/CL_ShanYanSDK.h>
  • 在AppDelegate中的 didFinishLaunchingWithOptions方法中添加初始化代码

注意:需要填入闪验控制台上的appid 和 appkey,同时项目工程需要匹配控制台上的bundleId

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // 需要填入闪验控制台上的appid 和 appkey
    [CLShanYanSDKManager initWithAppId:cl_SDK_APPID AppKey:cl_SDK_APPKEY complete:^(CLCompleteResult * _Nonnull completeResult) {
        if (completeResult.error) {
            NSLog(@"初始化失败");
        } else {
            NSLog(@"初始化成功");
        }
    }];
}

2.预取号

建议进入页面时在viewDidLoad中进行预取号操作

- (void)viewDidLoad {
    [super viewDidLoad];
    // 预取号
    [CLShanYanSDKManager preGetPhonenumber:nil];
}

3.拉起授权页

3.1 授权页UI设置

// 控件元素设置
CLUIConfigure * baseUIConfigure = [[CLUIConfigure alloc] init];

// self 为拉起授权页时的当前页面控制器
baseUIConfigure.viewController = self;

baseUIConfigure.clNavigationBackgroundClear = @(YES);
baseUIConfigure.clNavigationBottomLineHidden = @(YES);
baseUIConfigure.clNavigationBackBtnImage = [UIImage imageNamed:@"close-white"];
baseUIConfigure.clNavigationBarStyle = @(UIBarStyleBlack);


//LOGO
baseUIConfigure.clLogoImage = [UIImage imageNamed:@"logo_shanyan_text"];
baseUIConfigure.clLogoCornerRadius = @(10);


//PhoneNumber
baseUIConfigure.clPhoneNumberColor = UIColor.blackColor;
baseUIConfigure.clPhoneNumberFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:20.0*screenScale];

//LoginBtn
baseUIConfigure.clLoginBtnText = @"本机号一键登录";
baseUIConfigure.clLoginBtnTextFont = [UIFont systemFontOfSize:15*screenScale];
baseUIConfigure.clLoginBtnBgColor = [UIColor colorWithRed:0.2 green:0.8 blue:0.2 alpha:1];
baseUIConfigure.clLoginBtnCornerRadius = @(10*screenScale);

//Privacy
baseUIConfigure.clAppPrivacyFirst = @[@"闪验用户协议",[NSURL URLWithString:@"https://www.baidu.com"]];
baseUIConfigure.clAppPrivacySecond = @[@"隐私政策",[NSURL URLWithString:@"https://www.sina.com"]];
baseUIConfigure.clAppPrivacyColor = @[[UIColor lightGrayColor],[UIColor greenColor]];
baseUIConfigure.clAppPrivacyTextAlignment = @(NSTextAlignmentCenter);
baseUIConfigure.clAppPrivacyTextFont = [UIFont systemFontOfSize:11*screenScale];

//隐私协议页
baseUIConfigure.clAppPrivacyWebBackBtnImage = [UIImage imageNamed:@"title_back"];
NSMutableAttributedString * att0 = [[NSMutableAttributedString alloc]initWithString:@"隐私" attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:17],NSForegroundColorAttributeName:[UIColor blueColor]}];
NSMutableAttributedString * att1 = [[NSMutableAttributedString alloc]initWithString:@"条款" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14],NSForegroundColorAttributeName:[UIColor orangeColor]}];
[att0 appendAttributedString:att1];
baseUIConfigure.clAppPrivacyWebAttributesTitle = att0;

//CheckBox
baseUIConfigure.clCheckBoxHidden = @(NO);
baseUIConfigure.clCheckBoxValue = @(NO);
baseUIConfigure.clCheckBoxSize = [NSValue valueWithCGSize:CGSizeMake(30*screenScale, 30*screenScale)];
baseUIConfigure.clCheckBoxImageEdgeInsets = [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(2*screenScale, 10*screenScale, 13*screenScale, 5*screenScale)];
baseUIConfigure.clCheckBoxVerticalAlignmentToAppPrivacyCenterY = @(YES);
baseUIConfigure.clCheckBoxCheckedImage = [UIImage imageNamed:@"checkBoxSEL"];
baseUIConfigure.clCheckBoxUncheckedImage = [UIImage imageNamed:@"checkBoxNor"];

//Slogan
baseUIConfigure.clSloganTextColor = UIColor.lightGrayColor;
baseUIConfigure.clSloganTextFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:11.0*screenScale];
baseUIConfigure.clSlogaTextAlignment = @(NSTextAlignmentCenter);

// 控件布局设置
CGFloat screenWidth_Portrait;
CGFloat screenHeight_Portrait;
CGFloat screenWidth_Landscape;
CGFloat screenHeight_Landscape;
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
    screenWidth_Portrait = UIScreen.mainScreen.bounds.size.width;
    screenHeight_Portrait = UIScreen.mainScreen.bounds.size.height;
    screenWidth_Landscape = UIScreen.mainScreen.bounds.size.height;
    screenHeight_Landscape = UIScreen.mainScreen.bounds.size.width;
}else{
    screenWidth_Portrait = UIScreen.mainScreen.bounds.size.height;
    screenHeight_Portrait = UIScreen.mainScreen.bounds.size.width;
    screenWidth_Landscape = UIScreen.mainScreen.bounds.size.width;
    screenHeight_Landscape = UIScreen.mainScreen.bounds.size.height;
}

CGFloat screenScale = [UIScreen mainScreen].bounds.size.width/375.0;
if (screenScale > 1) {
    screenScale = 1;
}

//layout 布局
//布局-竖屏
CLOrientationLayOut * clOrientationLayOutPortrait = [CLOrientationLayOut new];

clOrientationLayOutPortrait.clLayoutPhoneCenterY = @(0*screenScale);
clOrientationLayOutPortrait.clLayoutPhoneLeft = @(50*screenScale);
clOrientationLayOutPortrait.clLayoutPhoneRight = @(-50*screenScale);
clOrientationLayOutPortrait.clLayoutPhoneHeight = @(20*screenScale);

clOrientationLayOutPortrait.clLayoutLogoWidth = @(100*screenScale);
clOrientationLayOutPortrait.clLayoutLogoHeight = @(100*screenScale);
clOrientationLayOutPortrait.clLayoutLogoCenterX = @(0);
clOrientationLayOutPortrait.clLayoutLogoCenterY = @(-SCREEN_HEIGHT*0.25);

clOrientationLayOutPortrait.clLayoutLoginBtnCenterY= @(clOrientationLayOutPortrait.clLayoutPhoneCenterY.floatValue + clOrientationLayOutPortrait.clLayoutPhoneHeight.floatValue*0.5*screenScale + 20*screenScale + 15*screenScale);
clOrientationLayOutPortrait.clLayoutLoginBtnHeight = @(30*screenScale);
clOrientationLayOutPortrait.clLayoutLoginBtnLeft = @(70*screenScale);
clOrientationLayOutPortrait.clLayoutLoginBtnRight = @(-70*screenScale);

clOrientationLayOutPortrait.clLayoutAppPrivacyLeft = @(40*screenScale);
clOrientationLayOutPortrait.clLayoutAppPrivacyRight = @(-40*screenScale);
clOrientationLayOutPortrait.clLayoutAppPrivacyBottom = @(0*screenScale);
clOrientationLayOutPortrait.clLayoutAppPrivacyHeight = @(45*screenScale);

clOrientationLayOutPortrait.clLayoutSloganLeft = @(0);
clOrientationLayOutPortrait.clLayoutSloganRight = @(0);
clOrientationLayOutPortrait.clLayoutSloganHeight = @(15*screenScale);
clOrientationLayOutPortrait.clLayoutSloganBottom = @(clOrientationLayOutPortrait.clLayoutAppPrivacyBottom.floatValue - clOrientationLayOutPortrait.clLayoutAppPrivacyHeight.floatValue);
baseUIConfigure.clOrientationLayOutPortrait = clOrientationLayOutPortrait;

// 拉起授权页时将baseUIConfigure参数传入接口中即可
[CLShanYanSDKManager quickAuthLoginWithConfigure:baseUIConfigure openLoginAuthListener:^(CLCompleteResult * _Nonnull completeResult) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // 隐藏loading操作
            ...
        });
        if (completeResult.error) {
            NSLog(@"授权页拉起失败");
        }else{
            NSLog(@"授权页拉起成功");
        }
 } oneKeyLoginListener:^(CLCompleteResult * _Nonnull completeResult) {
        if (completeResult.error) {
            NSLog(@"一键登录失败");
        }else{
            NSLog(@"一键登录成功---进行置换手机号操作");
            
            // 置换手机号操作
            ...
        }
    }
];


3.2 自定义控件

__weak typeof(self) weakSelf = self;
baseUIConfigure.customAreaView = ^(UIView * _Nonnull customAreaView) {
    __strong typeof(weakSelf) strongSelf = weakSelf;
    UIImageView * bg0 = [UIImageView new];
    [customAreaView addSubview:bg0];
    UIImageView * bg = [[UIImageView alloc]init];
    [customAreaView addSubview:bg];

    UIButton * weChat = [[UIButton alloc]init];
    [weChat setBackgroundImage:[UIImage imageNamed:@"微信"] forState:(UIControlStateNormal)];
    [customAreaView addSubview:weChat];
    UIButton * qq = [[UIButton alloc]init];
    [qq setBackgroundImage:[UIImage imageNamed:@"qq"] forState:(UIControlStateNormal)];
    [customAreaView addSubview:qq];

    UIButton * weibo = [[UIButton alloc]init];
    [weibo setBackgroundImage:[UIImage imageNamed:@"weibo"] forState:(UIControlStateNormal)];
    [customAreaView addSubview:weibo];

    //布局
    [strongSelf setSeylt2Contrains:bg0 bg:bg wx:weChat qq:qq webo:weibo customView:customAreaView];

    //屏幕旋转通知
    strongSelf-> _notifObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidChangeStatusBarFrameNotification object:nil queue:NSOperationQueue.mainQueue usingBlock:^(NSNotification * _Nonnull note) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        [strongSelf setSeylt2Contrains:bg0 bg:bg wx:weChat qq:qq webo:weibo customView:customAreaView];
    }];
};

3.3 自定义loading

// 自定义loading
baseUIConfigure.loadingView = ^(UIView * _Nonnull containerView) {
    UIImage *image = [YYImage imageNamed:@"KungFuPanda.gif"];
    UIImageView *imageBackground = [[YYAnimatedImageView alloc] initWithImage:image];
    [containerView addSubview:imageBackground];
    imageBackground.layer.cornerRadius = 40;
    imageBackground.layer.masksToBounds = YES;

    [imageBackground mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(80, 80));
        make.center.mas_equalTo(0);
    }];
};

4.拉起授权页

// 拉起授权页时将baseUIConfigure参数传入接口中即可
[CLShanYanSDKManager quickAuthLoginWithConfigure:baseUIConfigure openLoginAuthListener:^(CLCompleteResult * _Nonnull completeResult) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // 隐藏loading操作
            ...
        });
        if (completeResult.error) {
            NSLog(@"授权页拉起失败");
        }else{
            NSLog(@"授权页拉起成功");
        }
 } oneKeyLoginListener:^(CLCompleteResult * _Nonnull completeResult) {
        if (completeResult.error) {
            NSLog(@"一键登录失败");
        }else{
            NSLog(@"一键登录成功---进行置换手机号操作");
            
            // 置换手机号操作
            ...
        }
    }
];

5.获取置换手机号

[CLShanYanSDKManager quickAuthLoginWithConfigure:baseUIConfigure openLoginAuthListener:^(CLCompleteResult * _Nonnull completeResult) {
    ...
} oneKeyLoginListener:^(CLCompleteResult * _Nonnull completeResult) {
    if (completeResult.error) {
        ...
    }else{
        //SDK成功获取到Token
        NSString * telecom = [completeResult.data valueForKey:@"telecom"];
        //urlStr:用户后台对接闪验后台后配置的API,以下为Demo提供的调试API及调用示例,在调试阶段可暂时调用此API,也可用此API验证后台API是否正确配置
        NSString * urlStr = nil;
        if ([telecom isEqualToString:@"CMCC"]) {
          urlStr = [cl_SDK_URL stringByAppendingString:@"open/flashsdk/mobile-query-m"];
        }else if ([telecom isEqualToString:@"CUCC"]) {
          urlStr = [cl_SDK_URL stringByAppendingString:@"open/flashsdk/mobile-query-u"];
        }else if ([telecom isEqualToString:@"CTCC"]) {
          urlStr = [cl_SDK_URL stringByAppendingString:@"open/flashsdk/mobile-query-t"];
        }else{
          //失败
          return;
        }
        if (urlStr) {
          NSLog(@"tokenParamr:%@",completeResult.data);
          [NetWorkManager POST_url:urlStr withParameter:completeResult.data complete:^(NSDictionary * _Nonnull responseObject, NSError * _Nonnull error) {
              if (error) {
                  NSLog(@"置换手机号出错:%@",error);
              }else{
                  NSInteger code = [[responseObject valueForKey:@"code"] integerValue];
                  if (code == 200000) {
                      NSString * mobileName = responseObject[@"data"][@"mobileName"];
                      // decryptUseDESKey:解密方法详情见demo
                      NSString * mobileCode = [mobileName decryptUseDESKey:cl_SDK_APPKEY];
                      NSLog(@"免密登录成功,手机号:%@",mobileCode);
                      
                      // 成功拿到手机号后,关闭授权页
                      [CLShanYanSDKManager finishAuthControllerAnimated:YES Completion:nil];
                  } else {
                      NSLog(@"免密登录失败:%@",responseObject);
                  }
              }
          }];
        }
    }
}];

6.关闭授权页

注意:授权页面未拉起的情况调用该方法无效并且无回调

// 
[CLShanYanSDKManager finishAuthControllerCompletion:^{
    // 关闭授权页后其他操作--该回调已切换为主线程
}];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • CocoaPods操作手册 本文档介绍了啥? 为什么要使用CocoaPods? 如何安装CocoaPods? Po...
    风小钻阅读 7,544评论 1 10
  • 最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...
    拂晓的云阅读 7,158评论 6 23
  • 使用CocoaPods也有很长一段时间了,最近几个月的时间里也主导了公司私有Pods的创建和使用。在此期间踩过了不...
    Code_Ninja阅读 115,397评论 12 185
  • 还记得陈奕迅的那首《最佳损友》吗?里面唱到:“为何旧知己在最后,变不到老友。”听他唱来,老友一词似乎比普通朋友有着...
    港漂圈阅读 1,056评论 0 1
  • 写了几百字,删除几百字;再写,再删;最后只剩一两百字,紧接着就是长达近一小时的撰白,思维如同一口干枯的井,舀不出一...
    虫鸣吹晚风阅读 324评论 0 0