iOS 项目添加秒验

1,185 阅读9分钟

1.先看一下一键登录效果图:

一键登录效果图.PNG

Mob官方文档:www.mob.com/mobService/…

2.秒验优势

  • 提升运营价值操作简单,助力注册登录/拉新留存
  • 提升用户体验一键验证,优化用户体验
  • 灵活配置自由决定产品流程和配置项
  • 减少客户端用户流失率,提高用户注册转化率

3.检查合规

1.确保APP有《隐私政策》

您需要确保App有《隐私政策》。为保证您在集成MobSDK之后,能够满足工信部相关合规要求,您应确保在App安装后首次冷启动时就弹出《隐私政策》取得用户同意。 ######2.添加Mob隐私协议 您务必告知用户您选择MobSDK服务,请在《隐私政策》中增加如下参考条款:“我们使用了第三方(上海游昆信息技术有限公司,以下称“MobTech”)MobTech SecVerifySDK服务为您提供一键登陆功能。为了顺利实现该功能,您需要授权MobTechSDK提供对应的服务;在您授权后,MobTech将收集您相关的个人信息。关于MobTech所收集的信息种类、用途、个人信息保护的规则及退出机制等,详见MobTech官网(www.mob.com)上的隐私政策 (www.mob.com/about/polic…)条款。” ######3.回传隐私协议授权结果 在用户阅读您的《隐私政策》并取得用户授权之后,调用提交隐私协议函数uploadPrivacyPermissionStatus提交隐私协议。反之,如果用户不同意《隐私政策》授权,则不能调用uploadPrivacyPermissionStatus提交隐私协议。

#import <MOBFoundation/MobSDK+Privacy.h>
[MobSDK uploadPrivacyPermissionStatus:YES onResult:^(BOOL success) {
//注意业务逻辑不要依赖于这个success结果,建议业务逻辑在调用这个接口之后来写
}];
4.配置MobSDK

需要在项目默认的plist文件里添加MOBNetLater参数配置,参数值配置为2

配置如图: 配置图.png

3.项目集成

1.在Mob上添加应用并获取对应的AppKey和AppSecret, 添加秒验模块,申请秒验审核。

图片一.png 秒验审核通过后纪录数据如下图: 图片二.png

2.秒验流程图

流程图.png

3.项目集成
  • 1.官网下载SDK,然后将下图中SDK文件夹拖入到工程中(若项目中集成过秒验SDK,请将原来存在的SDK删除掉,再导入官网下载的SDK)。 图片四.png 图片五.png
  • 2.添加依赖库 必需添加 libc++.tbd 图片六.png
  • 3.配置Xcode选项 Build Settings中的Other Linker Flags添加-ObjC. 图片七.png
  • 4.配置Xcode info.plist文件 (1)添加MOBAppKey,MOBAppSecret,App Transport Security Settings,MOBNetLater 图片八.png (2)目前运营商个别接口为http请求,对于全局禁用Http的项目,需要设置Http白名单。建议按以下方式配置Info.plist: 图片九.png

代码如下,直接copy到info.plist文件的source code中即可

<key>NSExceptionDomains</key>
	<dict>
		<key>cmpassport.com</key>
		<dict>
			<key>NSIncludesSubdomains</key>
			<true/>
			<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
		<key>id6.me</key>
		<dict>
			<key>NSIncludesSubdomains</key>
			<true/>
			<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
		<key>mdn.open.wo.cn</key>
		<dict>
			<key>NSIncludesSubdomains</key>
			<true/>
			<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
		<key>wostore.cn</key>
		<dict>
			<key>NSIncludesSubdomains</key>
			<true/>
			<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
		<key>zzx9.cn</key>
		<dict>
			<key>NSIncludesSubdomains</key>
			<true/>
			<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
	</dict>

图片10.png (3)添加mobForbidden。取号过程发生失败的时候会默认收集当前错误信息上传帮助开发者准确定位错误信息, 若不想上传可在plist中配置 mobForbidden(默认为NO) 为 YES 图片11.png

###4.核心代码 ######1.回传用户隐私授权结果(uploadPrivacyPermissionStatus

/**
 上传隐私协议授权状态
 @param isAgree 是否同意(用户授权后的结果)
 */
+ (void)uploadPrivacyPermissionStatus:(BOOL)isAgree
                             onResult:(void (^_Nullable)(BOOL success))handler;

######2.预登录(preLogin接口说明

  • 用于提前获取运营商取号凭证,当预登录成功时,调用拉起授权页方法将立即拉起授权界面。
  • 建议在需要授权登录前提前调用此方法,可以提前获知当前用户的手机网络环境是否符合一键登录的使用条件,成功后将得到用于一键登录使用的临时凭证, 默认的凭证有效期60s(电信)/30min(联通)/60min(移动)。

代码示例


/*
* 预登录
*
* 此调用将有助于提高拉起授权页的速度和成功率
* 不建议频繁多次调用和拉起授权页后调用
* 预登录方法回调为dispatch_get_global_queue(0, 0),非主线程,UI操作请手动切换到主线程
* 建议在一键登录前提前调用此方法,比如调一键登录的vc的viewdidload中 
* 以 if (error == nil) 为判断成功的依据,而非返回码
*/
+ (void)preLogin:(nullable SecVerifyResultHander)handler;
#import <SecVerify/SVSDKHyVerify.h>

[SVSDKHyVerify preLogin:^(NSDictionary * _Nullable resultDic, NSError * _Nullable error) {

    //判断预取号是否成功
    if (error == nil && resultDic != nil && [resultDic isKindOfClass:NSDictionary.class]) {
        //成功
    }else{
        //失败
    }
}];

成功返回示例

resultDic:
{
    operator = CUCC;
}

参数说明

resultDic : {“operatorName” : “中国移动”} // 可能返回 中国移动、中国联通、中国电信. error : errornil,即为预取号成功.

######3.拉起授权页+一键登录(openAuthPageWithModel接口描述

  • 若已经提前预取号成功,sdk将直接拉起授权页。否则将先在sdk内部进行预取号,成功后拉起授权页。
  • uiConfigure:授权页配SVSDKHyUIConfigure ,uiConfigure.currentViewController必传
  • 要修改授权页自带控件的样式和添加自定义控件等,请在代理方法中自行设置
  • 授权页将采用系统模态弹出方式。由于系统present机制问题,当currentViewController非最上层vc时,present将无效且completion无回调,请尝试使用currentViewController测试present任一vc看是否可以正常弹出。
  • openAuthPageListener : 拉起授权页回调,回调队列main_queue,拉起成功失败均有回调,error为nil即为成功。
  • cancelAuthPageListener :拉起授权页后,sdk自带的返回/关闭按钮回调,回调队列main_queue,点击内置的取消、返回按钮,sdk将自动关闭授权页,取消、返回等操作,sdk均视为失败,故此回调resultDic=nil,error!=nil。
  • oneKeyLoginListener:一键登录点击取token回调,回调队列global_queue,不包含checkBox未勾选事件
/**
 拉起授权页 + 一键登录
 @param model 授权页配置
 @param openAuthPageListener 拉起授权页回调
 @param cancelAuthPageListener 拉起授权页后,取消登录/返回/其他方式登录
 @param oneKeyLoginListener 一键登录按钮获取token
 */
+ (void)openAuthPageWithModel:(nonnull SVSDKHyUIConfigure *)model
            openAuthPageListener:(SecVerifyResultHander)openAuthPageListener
            cancelAuthPageListener:(SecVerifyResultHander)cancelAuthPageListener
            oneKeyLoginListener:(SecVerifyResultHander)oneKeyLoginListener

调用示例

-(void)openAuthPageButtonClick:(UIButton *)button{

    /**
     * 建议做防止快速点击处理
     * eg.
     * [button setEnabled:NO];
     * dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     *      [button setEnabled:YES];
     * });
     */


    //1.创建一个ui配置对象
    SVSDKHyUIConfigure * uiConfigure = [[SVSDKHyUIConfigure alloc]init];

    //2.设置currentViewController,必传!请传入当前vc或视图顶层vc,可使用此vc调系统present测试是否可以present其他vc
    uiConfigure.currentViewController = self;

    //3.可选。设置一些定制化属性。eg. 开发者手动控制关闭授权页
    uiConfigure.manualDismiss = @(YES);

    /**
     * 4.可选。设置代理,接收相关事件,自定义UI
     * [SVSDKHyVerify setDelegate:self];
     * 代理示例:通过代理接收ViewDidLoad事件,并自行设置控件约束或添加自定义控件
     * -(void)svVerifyAuthPageViewDidLoad:(UIViewController *)authVC userInfo:(SVSDKHyProtocolUserInfo*)userInfo{
     *   - 基本控件对象和相关信息在userInfo中
     *   - 可在此处设置基本控件的样式和布局、添加自定义控件等
     * }
     */


    //5.调用拉起授权页方法,传入uiConfigure    
    [SVSDKHyVerify openAuthPageWithModel:uiConfigure openAuthPageListener:^(NSDictionary * _Nullable resultDic, NSError * _Nullable error) {

           /**
            * 建议做防止快速点击的处理:
            * dispatch_async(dispatch_get_main_queue(), ^{
            *    [button setEnabled:YES];
            * });
            */


            if (error != nil ) {
                //拉起授权页失败
            }else{
                //拉起授权页成功
            }

        } cancelAuthPageListener:^(NSDictionary * _Nullable resultDic, NSError * _Nullable error) {

            //点击了sdk自带返回、关闭、其他方式登录等(添加的自定义关闭按钮事件不会触发此回调)

        } oneKeyLoginListener:^(NSDictionary * _Nullable resultDic, NSError * _Nullable error) {
            //一键登录点击获取token回调:

            //关闭页面。当uiConfigure.manualDismiss = @(YES)时需要手动调用此方法关闭。            
            [SVSDKHyVerify finishLoginVcAnimated:YES Completion:^{
                NSLog(@"%s",__func__);
            }];

            __strong typeof(weakSelf) strongSelf = weakSelf;

            //判断获取token是否成功
            if (error == nil) {

                /**
                 * 获取token成功
                 * 开始调用token置换手机号接口
                 * [Tools getMobileByToken:resultDic completion:^(){}]...
                 */

            }else{

                /**
                 * 获取token失败
                 * 可以自定跳转其他页面
                 * [self gotoSMSLogin];
                 */

            }

        }];
}

成功返回示例

resultDic:
{
    opToken = 7b19d948f1e9f18bb20dc66b4c08d68c953005d6c04841319918273113288705;
    operator = CUCC;
    token = "0:AAAAhQAAAIEAD261gzCYXMWXTL8rrAlRf9120a4LLQJHUw6LbV6S74dLCHHczDt54iTE3UziKY6MdKO9LONwgAseaPB+5HrPQZOsJXBvgIDSH5wtF6IiEbVmvwlzyRajVJY3KvAXSDSybH1Mch8XuuBG3zHXxpYs0IltgXAoOsc9/oB4aakwmPUAAACgbzY1oX1Ir9+DyU4R5PdpeWdQw+0IHYcfdKvpVXnXOXZ5ak0nqPNuR1FqCh1RMrPmHXu4K6IwYGOYnXFRtABIE7I7h7EU+2imu4vY9pY3z2OYjHvMFkrHLHCoeh0srZvhMPJscPP6Ue3NPV38sd/4hPH1bp4cH4IjFPpPB5AwWFkIn2N7U8fBX02SbPAxy4ejqCvr9yoxJq2c0dONsn/22Q==";
}

响应参数说明

  • error : error为nil,即为登录成功.
  • resultDic 为字典类型,登录成功时返回 图片12.png

######4.获取手机号

  • SDK只返回token,真实手机号需使用token单独调接口获得。我们需要将token传给自己公司服务器,以此来获得手机号

######5.SDK辅助方法说明

  • .手动关闭登录页面:
/**
 * 适用于需要手动关闭登录界面的场景 (如:model manualDismiss=YES,自定义视图按钮事件等)
 */
+ (void)finishLoginVcAnimated:(BOOL)flag Completion:(void(^_Nullable)(void))completion;

  • 手动关闭授权页自带的一键登录loading:
+ (void)hideLoading;
  • 手动设置当前授权页checkBox勾选状态:
+ (void)setCheckBoxValue:(BOOL)isSelect;
  • 判断当前网络环境是否可以发起认证(结果仅供参考):
/**
 * YES 可以认证, NO 不能认证
 */
+ (BOOL)isVerifyEnable;
  • 获取当前流量卡运营商(结果仅供参考):
/**
 * CMCC:移动 CUCC:联通 CTCC:电信 UNKNOW:未知
 */
+ (NSString *_Nullable)getCurrentOperatorType;
  • 清空sdk内部预取号缓存:
+ (void)clearPhoneScripCache;
  • 开启debug模式:
/**
 * YES时会打印较多调试日志
 */
+ (void)setDebug:(BOOL)enable;
  • 当前sdk版本号
+ (nonnull NSString *)sdkVersion;

###5.注意事项

    1. 免密登录能力必须经过运营商网关取号,因此必须在手机打开移动蜂窝网络的前提下才会成功。电信支持4G,5G网络取号,移动, 联通支持5G,4G, 3G, 2G网络取号但在非5G,4G网络情况下容易取号失败,针对双卡双待手机只取当前流量卡号。
    1. 必须先预取号成功才可以登录。
    1. 登录方法必须传入model,model中必须传入当前控制器。
    1. 登录成功使用返回的两个token和运营商类型,向服务端请求手机号等信息。
  • v3.0.2开始,标准版使用SVSDKHyVerify类作为sdk主类,与之相关的头文件有:
    • 1.授权页配置类 --SVSDKHyUIConfigure
    • 2.回调信息获取类--SVSDKHyProtocolUserInfo
    • 3.授权页vc类 --SVSDKVerifyOperationViewController
    • 4.授权页nav类 --SVSDKVerifyOperationNavigationController
    • 5.授权页协议页类 --SVSDKWebCarouselViewController
    • 6.授权页协议页nav类(协议页present时使用)-- SVSDKWebCarouselNavigationController
    • 7.如之前接入代码使用过字符串类名匹配的,如SVOperationViewController、SVBaseWebViewVC、ZUOAuthViewController、UAAuthViewController、UANavigationController、EAccountAuthenticateViewController、EAccountOPSWebViewController的,建议移除相关代码。

###6.自定义UI

###7.错误码列表 错误码返回格式: 外部code; userInfo {“error_code” : 内部code, “error_message”: 错误描述 , “description” : 本地错误描述}

直接看Mob官方错误码列表:www.mob.com/wiki/detail…