OneLogin (一键登录)
进阶模式和常规模式是一键登录的两种调用逻辑,如无特别需求建议直接使用进阶模式,两模式不可混合调用。
常规模式
预取号和授权页拉起时机均由开发者自主控制。使用此调用逻辑,开发者需自主处理预取号的时机和超期重试的逻辑等。使用这种方式时,请使用 OneLogin
类中的方法。
1、调用逻辑
registerWithAppID:
初始化 SDK 并配置 APPID
preGetTokenWithCompletion:
预取号(应用启动或进入登录页的前一个页面、用户登出时是调用该方法的时机)
requestTokenWithViewController:viewModel:completion:
拉起授权页面(调用该方法前可以调用 isPreGettedTokenValidate
判断预取号是否成功)
dismissAuthViewController:completion:
关闭授权页面
2、初始化
方法原型
+ (void)registerWithAppID:(NSString *)appID;
|
参数描述
参数 |
是否必填 |
类型 |
说明 |
appID |
是 |
NSString |
极验 appID |
接口作用
传入极验 appID,并开始预取号,注意客户端 AppID 需与服务端保持一致
使用场景
示例代码
ObjC:
导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
在 UIViewController 的 viewDidLoad
方法中添加初始化代码
- (void)viewDidLoad { [super viewDidLoad]; [OneLogin registerWithAppID:GTOneLoginAppId]; }
|
Swift:
创建混编桥接头文件并导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
在 UIViewController 的 viewDidLoad
方法中添加初始化代码
override func viewDidLoad() { super.viewDidLoad() OneLogin.register(withAppID: GTOneLoginAppId) }
|
3、预取号
方法原型
+ (void)preGetTokenWithCompletion:(void(^)(NSDictionary *sender))completion;
|
参数描述
参数 |
是否必填 |
类型 |
说明 |
completion |
否 |
void(^)(NSDictionary * _Nullable sender) |
获取临时凭证回调 |
回调的字段如下:
获取成功: { "model" : "iPhone9,1", "accessCode" : "d3f3c605a2684a8fbb4b43ee0f94f1ff", "operatorType" : "CU", "release" : "13.5.1", "processID" : "1f1437fd0b3026ff44500c3d03cdd822", "appID" : "b41a959b5cac4dd1277183e074630945", "pre_token_time" : "1087", "number" : "186****6173", "preGetTokenSuccessedTime" : 1604890389.0020308, "msg" : "获取accessCode成功", "status" : 200, "expire_time" : 580 } 获取失败: { "status" : 500, "operatorType" : "CU", "appID" : "b41a959b5cac4dd1277183e074630945", "model" : "iPhone9,1", "release" : "13.5.1", "msg" : "Can't access cellular.", "errorCode" : "-20202" }
|
字段 |
说明 |
status |
状态码,200 表示成功,500 表示失败 |
number |
脱敏手机号 |
operatorType |
运营商 |
errorCode |
获取失败时的错误码 |
msg |
获取失败时表示失败原因 |
接口作用
可以提前获知当前用户的手机网络环境是否符合一键登录的使用条件,成功后将得到用于一键登录使用的临时凭证,默认的凭证有效期: 60 分钟(移动) / 60 分钟(电信) / 10 分钟(联通)
应用启动时或者进入登录页的前一个页面、用户登出时是调用该方法的时机
4、进入授权页面
方法原型
+ (void)requestTokenWithViewController:(nullable UIViewController *)viewController viewModel:(nullable OLAuthViewModel *)viewModel completion:(void(^)(NSDictionary * _Nullable result))completion;
|
参数描述
参数 |
是否必填 |
类型 |
说明 |
viewController |
是 |
UIViewController |
进入授权页面的上一级页面 |
viewModel |
否 |
OLAuthViewModel |
授权页面UI配置参数 |
completion |
否 |
void(^)(NSDictionary * _Nullable result) |
获取token回调 |
注意:
1、在成功进入授权页面时,不会立即收到 completion 回调,在授权页面点击一键登录、切换账号或者返回按钮时,才会收到 completion 回调;
2、若不能成功进入授权页面,则会立即收到 completion 回调
回调的字段如下:
获取成功: { "model" : "iPhone9,1", "authcode" : "0000", "operatorType" : "CU", "release" : "13.5.1", "processID" : "967ceb230b3fdfb4d74ebcb470c5830c", "appID" : "b41a959b5cac4dd1277183e074630945", "pre_token_time" : "1012", "token" : "CU__0__b41a959b5cac4dd1277183e074630945__2.3.4__1__f632d01ab7c64efda96580c3274de971__NOTCUCC", "number" : "186****6173", "preGetTokenSuccessedTime" : 1604890895.807291, "errorCode" : "0", "msg" : "获取accessCode成功", "status" : 200, "expire_time" : 580 } 获取失败: { "status" : 500, "operatorType" : "CU", "appID" : "b41a959b5cac4dd1277183e074630945", "model" : "iPhone9,1", "release" : "13.5.1", "msg" : "Can't access cellular.", "errorCode" : "-20202" }
|
字段 |
说明 |
status |
状态码,200 表示成功,500 表示失败 |
token |
换取手机号需要的 token |
processID |
流水号 |
authcode |
authcode |
appID |
appID |
operatorType |
运营商 |
number |
脱敏手机号 |
errorCode |
失败时的具体错误码 |
msg |
失败时表示失败原因 |
接口作用
拉起授权页面,用户在授权页面点击一键登录,即可获取 token,拿该 token 即可换取对应的手机号
调用该方法前建议先调用方法判断预取号是否成功
使用场景
示例代码
ObjC:
导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
在需要使用一键登录的地方调用极验一键登录接口
- (IBAction)normalLoginAction:(UIButton *)sender { OLAuthViewModel *viewModel = [OLAuthViewModel new]; [OneLogin requestTokenWithViewController:self viewModel:viewModel completion:^(NSDictionary * _Nullable result) { NSLog(@"OneLoginPro requestTokenWithViewController result: %@", result); }]; }
|
Swift:
创建混编桥接头文件并导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
在需要使用一键登录的地方调用极验一键登录接口
@IBAction func normalLoginAction(_ sender: UIButton) { let viewModel = OLAuthViewModel() OneLogin.requestToken(with: self, viewModel: viewModel) { [weak self] result in } }
|
5、手动关闭授权页面
方法原型
+ (void)dismissAuthViewController:(BOOL)animated completion:(void (^ __nullable)(void))completion;
|
参数描述
参数 |
是否必填 |
类型 |
说明 |
animated |
是 |
BOOL |
关闭授权页面时是否需要动画 |
completion |
否 |
void(^)(void) |
关闭授权页面后的回调 |
接口作用
当开发者设置点击一键登录或者自定义控件不自动销毁授权页时,将需要自行调用此方法主动销毁授权页,建议在置换手机号成功后销毁,请不要使用其他方式关闭授权页面
关闭授权页面时机
示例代码
ObjC:
导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
在需要关闭授权页面的地方调用极验关闭授权页面接口
- (void)dismissAuthVC { [OneLogin dismissAuthViewController:nil]; }
|
Swift:
创建混编桥接头文件并导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
在需要关闭授权页面的地方调用极验关闭授权页面接口
@objc func dismissAuthVC(_ sender: UIButton) { OneLogin.dismissAuthViewController { } }
|
6、判断预取号结果是否有效
方法原型
+ (BOOL)isPreGettedTokenValidate;
|
接口作用
判断预取号结果是否有效
调用时机
- 调用
requestTokenWithCompletion
时,判断是否需要先调用preGetTokenWithCompletion
示例代码
ObjC:
导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
判断预取号结果是否有效
__weak typeof(self) wself = self; if ([OneLogin isPreGettedTokenValidate]) { [OneLogin requestTokenWithViewController:self viewModel:viewModel completion:^(NSDictionary * _Nullable result) { NSLog(@"requestTokenWithViewController result: %@", result); }]; } else { [GTProgressHUD showLoadingHUDWithMessage:nil]; [OneLogin preGetTokenWithCompletion:^(NSDictionary * _Nonnull preResult) { [GTProgressHUD hideAllHUD]; NSLog(@"preGetTokenWithCompletion result: %@", preResult); if (preResult.count > 0 && preResult[@"status"] && 200 == [preResult[@"status"] integerValue]) { [OneLogin requestTokenWithViewController:wself viewModel:viewModel completion:^(NSDictionary * _Nullable result) { NSLog(@"requestTokenWithViewController result: %@", result); [OneLogin stopLoading]; [wself finishRequestingToken:result]; }]; } else { [GTProgressHUD showToastWithMessage:preResult[@"msg"]?:@"预取号失败"]; } }]; }
|
Swift:
创建混编桥接头文件并导入极验 SDK 头文件 #import <OneLoginSDK/OneLoginSDK.h>
判断预取号结果是否有效
if OneLogin.isPreGettedTokenValidate() { OneLogin.requestToken(with: self, viewModel: viewModel) { [weak self] result in if let strongSelf = self { strongSelf.finishRequsetingToken(result: result!) } sender.isEnabled = true } } else { GTProgressHUD.showLoadingHUD(withMessage: nil) OneLogin.preGetToken { [weak self] preResult in GTProgressHUD.hideAllHUD() if let strongSelf = self { let status = NSString.init(format: "%@", preResult["status"] as! NSNumber) if 200 == status.integerValue { OneLogin.requestToken(with: strongSelf, viewModel: viewModel) { (result) in strongSelf.finishRequsetingToken(result: result!) } } else { let message = (preResult["msg"] != nil) ? (preResult["msg"] as! String) : "预取号失败" GTProgressHUD.showToast(withMessage: message) } } sender.isEnabled = true } }
|