本文为您介绍iOS客户端一键登录的集成方法及接口的功能示例。
在使用过程中如有疑问,可以提交工单联系阿里云技术工程师处理。
下载SDK
登录号码认证产品控制台,在概览页面右侧API&SDK区域,单击立即下载,进入API&SDK页面,根据页面提示下载并解压对应SDK。
创建认证方案
您导入项目或调用API接口时,会用到方案Code等参数信息,请先在号码认证产品控制台,创建认证方案,获取方案Code等参数信息。
集成方式
集成分动态库和静态库。ATAuthSDK_D.framework和ATAuthSDK.framework不能同时集成到工程里,两者是同一个SDK,前者是动态库,后者是静态库。
若您集成静态库,则需要集成以下组件:
ATAuthSDK.framework、YTXMonitor.framework和YTXOperators.framework。
若您集成动态库,则需要集成以下组件:
ATAuthSDK_D.framework。
集成静态库操作
创建工程。
下载并安装Xcode,点击Create a new Xcode project,根据页面引导创建一个新工程。
添加主库和系统库。
方式一:在菜单栏选择Targets > Build Phases > Link Binary With Libraries,添加主库ATAuthSDK.framework、YTXMonitor.framework和YTXOperators.framework,添加系统库Network.framework。
方式二:在Xcode中Targets > General > Frameworks,Libraries, and Embedded Content,添加主库ATAuthSDK.framework、YTXMonitor.framework和YTXOperators.framework,添加系统库Network.framework。
说明添加主库时Embed选择Do Not Embed类型。
iOS12.0版本开始支持Network.framework,请在菜单栏选择Targets > Build Phases > Linked Frameworks and Libraries > Status,将Status设置为弱依赖关系。
BuildSettings设置。
在菜单栏选择Targets > BuildSettings > Other Linker Flags。
Other Linker Flags增加
-ObjC
、-framework
、"YTXOperators"
。添加ATAuthSDK.bundle资源文件。
主项目右键添加ATAuthSDK.framework > ATAuthSDK.bundle资源⽂件,否则⼀键登录授权页面默认的图片或icon不显示。
或在Targets > Build Phases > Copy Bundle Resources,添加ATAuthSDK.bundle。
集成动态库操作
动态库不一定包含模拟器架构,可使用
lipo -info
指令查询动态库支持的模拟器架构。若因包含模拟器架构而导致编译报错,请使用lipo -thin
指令剔除可执行文件中的模拟器架构。无需将动态库解压文件直接拖到工程中,因解压包含有ATAuthSDK_D.framework.dSYM符号文件,该文件是线上crash符号翻译专用,如果放到工程中会影响App上架审核,只需将ATAuthSDK_D.framework拖进工程即可。
添加主库。
方式一:在Xcode中Targets > General > Frameworks,Libraries, and Embedded Content,添加主库ATAuthSDK_D.framework。
说明添加主库时Embed选择Embed & Sign类型。
方式二:
在Targets > Build Phases > Link Binary With Libraries和Embed Frameworks,添加主库ATAuthSDK_D.framework。
添加ATAuthSDK.bundle资源文件。
主项目右键添加ATAuthSDK.framework > ATAuthSDK.bundle资源⽂件,否则⼀键登录授权页面默认的图片或icon不显示。
或在Targets > Build Phases > Copy Bundle Resources,添加ATAuthSDK.bundle。
交互流程详解
完整的功能交互流程请参见一键登录交互流程。
SDK方法说明
获取认证实例(sharedInstance)
/**
* 获取该类的单例实例对象
* @return 单例实例对象
*/
+ (instancetype _Nonnull )sharedInstance;
使用示例
TXCommonHandler *handller = [TXCommonHandler sharedInstance];
必调方法:设置SDK密钥(setAuthSDKInfo)
/**
* 初始化SDK调用参数,App生命周期内调用一次
* @param info app对应的密钥
* @param complete 结果异步回调到主线程,成功时resultDic=@{resultCode:600000, msg:...},其他情况时"resultCode"值请参考PNSReturnCode
*/
- (void)setAuthSDKInfo:(NSString * _Nonnull)info complete:(void(^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
使用示例
[[TXCommonHandler sharedInstance] setAuthSDKInfo:@"xxxx"
complete:^(NSDictionary * _Nonnull resultDic) {
NSLog(@"设置密钥结果:%@", resultDic);
}];
必调方法:一键登录获取Token(getLoginTokenWithTimeout)
/**
* 获取一键登录Token,调用该接口首先会弹起授权页,点击授权页的登录按钮获取Token
* @warning 注意的是,如果前面没有调用 accelerateLoginPageWithTimeout:complete: 接口,该接口内部会自动先帮我们调用,成功后才会弹起授权页,所以有一个明显的等待过程
* @param timeout 接口超时时间,单位s,默认为3.0s
* @param controller 唤起自定义授权页的容器,内部会对其进行验证,检查是否符合条件
* @param model 自定义授权页面选项,可为nil,采用默认的授权页面,具体请参考TXCustomModel.h文件
* @param complete 结果异步回调到主线程,"resultDic"里面的"resultCode"值请参考PNSReturnCode,如下:
*
* 授权页控件点击事件:700000(点击授权页返回按钮)、700001(点击切换其他登录方式)、
* 700002(点击登录按钮事件,根据返回字典里面的 "isChecked"字段来区分check box是否被选中,只有被选中的时候内部才会去获取Token)、700003(点击check box事件)、700004(点击协议富文本文字)
接口回调其他事件:600001(授权页唤起成功)、600002(授权页唤起失败)、600000(成功获取Token)、600011(获取Token失败)、
* 600015(获取Token超时)、600013(运营商维护升级,该功能不可用)、600014(运营商维护升级,该功能已达最大调用次数).....
*/
- (void)getLoginTokenWithTimeout:(NSTimeInterval)timeout controller:(UIViewController *_Nonnull)controller model:(TXCustomModel *_Nullable)model complete:(void (^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
使用示例
[[TXCommonHandler sharedInstance] getLoginTokenWithTimeout:3.0
controller:self
model:model
complete:^(NSDictionary * _Nonnull resultDic) {
NSLog(@"一键登录结果:%@", resultDic);
}];
必调方法:注销登录页面(cancelLoginVCAnimated)
/**
* 注销授权页,建议用此方法,对于移动卡授权页的消失会清空一些数据
* @param flag 是否添加动画
* @param complete 成功返回
*/
- (void)cancelLoginVCAnimated:(BOOL)flag complete:(void (^_Nullable)(void))complete;
使用示例
[[TXCommonHandler sharedInstance] cancelLoginVCAnimated:YES complete:nil];
选调方法:一键登录预取号(accelerateLoginPageWithTimeout)
/**
* 加速一键登录授权页弹起,防止调用 getLoginTokenWithTimeout:controller:model:complete: 等待弹起授权页时间过长
* @param timeout 接口超时时间,单位:秒,默认为3.0s
* @param complete 结果异步回调到主线程,成功时resultDic=@{resultCode:600000, msg:...},其他情况时"resultCode"值请参考PNSReturnCode
*/
- (void)accelerateLoginPageWithTimeout:(NSTimeInterval)timeout complete:(void (^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
使用示例
[[TXCommonHandler sharedInstance] accelerateLoginPageWithTimeout:3.0 complete:^(NSDictionary * _Nonnull resultDic) {
NSLog(@"为后面授权页拉起加个速,加速结果:%@", resultDic);
}];
其他接口说明
选调方法:获取版本号
/**
* 获取当前SDK版本号
* @return 字符串,SDK版本号
*/
- (NSString *_Nonnull)getVersion;
使用示例
NSString *version = [[TXCommonHandler sharedInstance] getVersion];
选调方法:环境检查
/**
* 检查当前环境是否支持一键登录或号码认证,resultDic返回 PNSCodeSuccess说明当前环境支持
* @param authType 服务类型 PNSAuthTypeVerifyToken 本机号码校验流程,PNSAuthTypeLoginToken 一键登录流程
* @param complete 结果异步回调到主线程,成功时resultDic=@{resultCode:600000, msg:...},其他情况时"resultCode"值请参考PNSReturnCode,只有成功回调才能保障后续接口调用
*/
- (void)checkEnvAvailableWithAuthType:(PNSAuthType)authType complete:(void (^_Nullable)(NSDictionary * _Nullable resultDic))complete;
使用示例
[[TXCommonHandler sharedInstance] checkEnvAvailableWithAuthType:PNSAuthTypeVerifyToken complete:^(NSDictionary * _Nullable resultDic) {
NSLog(@"环境检查结果:%@",resultDic);
}];
选调方法:设置checkbox选中状态
/**
* 授权页弹起后,修改checkbox按钮选中状态,当checkout按钮隐藏时,设置不生效
*/
- (void)setCheckboxIsChecked:(BOOL)isChecked;
使用示例
[[TXCommonHandler sharedInstance] setCheckboxIsChecked:YES];
选调方法:隐藏一键登录获取登录Token后的等待动画
/**
* 手动隐藏一键登录获取登录Token之后的等待动画,默认为自动隐藏,当设置 TXCustomModel 实例 autoHideLoginLoading = NO 时, 可调用该方法手动隐藏
*/
- (void)hideLoginLoading;
使用示例
[[TXCommonHandler sharedInstance] hideLoginLoading];
日志埋点控制对象
获取到该对象后可以进行相关的日志设置。
/**
* 获取日志埋点相关控制对象
*/
- (PNSReporter * _Nonnull)getReporter;
使用示例
PNSReporter *reporter = [[TXCommonHandler sharedInstance] getReporter];
控制台日志输出开关
/**
* 控制台日志输出开关,若开启会以PNS_LOGGER为开始标记对日志进行输出,Release模式记得关闭!
* @param enable 开关参数,默认为NO
*/
- (void)setConsolePrintLoggerEnable:(BOOL)enable;
使用示例
PNSReporter *reporter = [[TXCommonHandler sharedInstance] getReporter];
[reporter setConsolePrintLoggerEnable:YES];
设置日志及埋点上传开关
/**
* 设置日志及埋点上传开关,但不会对通过 setupUploader: 接口实现的自定义上传方法起作用
* @param enable 开关设置BOOL值,默认为YES
*/
- (void)setUploadEnable:(BOOL)enable;
使用示例
PNSReporter *reporter = [[TXCommonHandler sharedInstance] getReporter];
[reporter setUploadEnable:YES];
工具类TXCommonUtils
判断设备蜂窝网络是否开启(checkDeviceCellularDataEnable)
/**
判断当前设备蜂窝数据网络是否开启,即3G、4G
@return 结果
*/
+ (BOOL)checkDeviceCellularDataEnable;
判断当前上网卡是否是中国联通(isChinaUnicom)
/**
判断当前上网卡运营商是否是中国联通
@return 结果
*/
+ (BOOL)isChinaUnicom;
判断当前上网卡是否是中国移动(isChinaMobile)
/**
判断当前上网卡运营商是否是中国移动
@return 结果
*/
+ (BOOL)isChinaMobile;
判断当前上网卡是否是中国电信(isChinaTelecom)
/**
判断当前上网卡运营商是否是中国电信
@return 结果
*/
+ (BOOL)isChinaTelecom;
获取当前上网卡运营商名称(getCurrentCarrierName)
/**
获取当前上网卡运营商名称,比如中国移动、中国电信、中国联通
@return 结果
*/
+ (NSString *)getCurrentCarrierName;
获取当前上网网络类型(getNetworktype)
/**
获取当前上网卡网络类型,比如Wi-Fi,4G
@return 结果
*/
+ (NSString *)getNetworktype;
判断设备是否有SIM卡(simSupportedIsOK)
/**
判断当前设备是否有SIM卡
@return 结果
*/
+ (BOOL)simSupportedIsOK;
判断无线网络是否开启(isWWANOpen)
/**
判断无线网络是否开着(通过p0网卡判断,无Wi-Fi或有Wi-Fi情况下都能检测到)
@return 结果
*/
+ (BOOL)isWWANOpen;
判断无Wi-Fi下无线网络是否开启(reachableViaWWAN)
/**
判断无线网络是否开启(仅无Wi-Fi情况下)
@return 结果
*/
+ (BOOL)reachableViaWWAN;
获取设备当前网络私网IP地址(getMobilePrivateIPAddress)
/**
获取设备当前网络私网IP地址
@return 结果
*/
+ (NSString *)getMobilePrivateIPAddress:(BOOL)preferIPv4;
获取当前设备的唯一标识ID(getUniqueID)
/**
获取当前设备的唯一标识ID,用于埋点的精确查找使用
*/
+ (NSString *)getUniqueID;
通过颜色设置生成图片(imageWithColor)
/**
通过颜色设置生成图片,支持弧度设置,比如一键登录按钮背景图片
*/
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size isRoundedCorner:(BOOL )isRounded radius:(CGFloat)radius;
UI页面接口说明
全屏授权页面设计规范
① 状态栏 | prefersStatusBarHidden: 状态栏是否隐藏,默认为NO。 preferredStatusBarStyle: 状态栏主题风格,默认UIStatusBarStyleDefault。 | |
② 导航栏 |
| |
③ Logo区 |
| |
④ Slogan |
| |
⑤ 掩码栏 |
| |
⑥ 登录按钮 |
| |
⑦ 切换到其他方式 |
| |
⑧ 自定义控件区(如其他方式登录) |
| |
⑨ 协议栏 |
| |
其他全屏页面属性 |
|
弹窗授权页面设计规范
① 标题栏 |
| |
其他弹窗页面属性 |
|
其他部分的页面设计请参见全屏授权页面设计规范。
唤起授权页示例
//1. 设置SDK参数,App生命周期内调用一次即可
NSString *info = @"客户的密钥串";
__weak typeof(self) weakSelf = self;
//设置SDK参数,App生命周期内调用一次即可
[[TXCommonHandler sharedInstance] setAuthSDKInfo:info complete:^(NSDictionary * _Nonnull resultDic) {
[weakSelf showResult:resultDic];
}];
//2. 检测当前环境是否支持一键登录
__block BOOL support = YES;
[[TXCommonHandler sharedInstance] checkEnvAvailableWithAuthType:PNSAuthTypeLoginToken complete:^(NSDictionary * _Nullable resultDic) {
support = [PNSCodeSuccess isEqualToString:[resultDic objectForKey:@"resultCode"]];
}];
//3. 开始一键登录流程
//3.1 调用加速授权页弹起接口,提前获取必要参数,为后面弹起授权页加速
[[TXCommonHandler sharedInstance] accelerateLoginPageWithTimeout:timeout complete:^(NSDictionary * _Nonnull resultDic) {
if ([PNSCodeSuccess isEqualToString:[resultDic objectForKey:@"resultCode"]] == NO) {
[ProgressHUD showError:@"取号,加速授权页弹起失败"];
[weakSelf showResult:resultDic];
return ;
}
//3.2 调用获取登录Token接口,可以立马弹起授权页,model的创建需要放在主线程
[ProgressHUD dismiss];
[[TXCommonHandler sharedInstance] getLoginTokenWithTimeout:timeout controller:weakSelf model:model complete:^(NSDictionary * _Nonnull resultDic) {
NSString *code = [resultDic objectForKey:@"resultCode"];
if ([PNSCodeLoginControllerPresentSuccess isEqualToString:code]) {
[ProgressHUD showSuccess:@"弹起授权页成功"];
} else if ([PNSCodeLoginControllerClickCancel isEqualToString:code]) {
[ProgressHUD showSuccess:@"点击了授权页的返回"];
} else if ([PNSCodeLoginControllerClickChangeBtn isEqualToString:code]) {
[ProgressHUD showSuccess:@"点击切换其他登录方式按钮"];
} else if ([PNSCodeLoginControllerClickLoginBtn isEqualToString:code]) {
if ([[resultDic objectForKey:@"isChecked"] boolValue] == YES) {
[ProgressHUD showSuccess:@"点击了登录按钮,check box选中,SDK内部接着会去获取登录Token"];
} else {
[ProgressHUD showSuccess:@"点击了登录按钮,check box未选中,SDK内部不会去获取登录Token"];
}
} else if ([PNSCodeLoginControllerClickCheckBoxBtn isEqualToString:code]) {
[ProgressHUD showSuccess:@"点击check box"];
} else if ([PNSCodeLoginControllerClickProtocol isEqualToString:code]) {
[ProgressHUD showSuccess:@"点击了协议富文本"];
} else if ([PNSCodeSuccess isEqualToString:code]) {
//点击登录按钮获取登录Token成功回调
NSString *token = [resultDic objectForKey:@"token"];
//下面用Token去服务器换手机号,此处仅做参考
[PNSVerifyTopRequest requestLoginWithToken:token complete:^(BOOL isSuccess, NSString * _Nonnull msg, NSDictionary * _Nonnull data) {
NSString *popCode = [data objectForKey:@"code"];
NSDictionary *module = [data objectForKey:@"module"];
NSString *mobile = module[@"mobile"];
if ([popCode isEqualToString:@"OK"] && mobile.length > 0) {
[ProgressHUD showSuccess:@"一键登录成功"];
} else {
[ProgressHUD showSuccess:@"一键登录失败"];
}
dispatch_async(dispatch_get_main_queue(), ^{
[[TXCommonHandler sharedInstance] cancelLoginVCAnimated:YES complete:nil];
});
[weakSelf showResult:data];
}];
} else {
[ProgressHUD showError:@"获取登录Token失败"];
}
[weakSelf showResult:resultDic];
}];
}];
授权页全屏模式示例
支持横竖屏切换。
TXCustomModel *model = [[TXCustomModel alloc] init];
model.navColor = UIColor.orangeColor;
model.navTitle = [[NSAttributedString alloc] initWithString:@"一键登录(全屏)" attributes:@{NSForegroundColorAttributeName : UIColor.whiteColor,NSFontAttributeName : [UIFont systemFontOfSize:20.0]}];
//model.navIsHidden = NO;
model.navBackImage = [UIImage imageNamed:@"icon_nav_back_light"];
//model.hideNavBackItem = NO;
UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeSystem];
[rightBtn setTitle:@"更多" forState:UIControlStateNormal];
model.navMoreView = rightBtn;
model.privacyNavColor = UIColor.orangeColor;
model.privacyNavBackImage = [UIImage imageNamed:@"icon_nav_back_light"];
model.privacyNavTitleFont = [UIFont systemFontOfSize:20.0];
model.privacyNavTitleColor = UIColor.whiteColor;
model.logoImage = [UIImage imageNamed:@"taobao"];
//model.logoIsHidden = NO;
//model.sloganIsHidden = NO;
model.sloganText = [[NSAttributedString alloc] initWithString:@"一键登录slogan文案" attributes:@{NSForegroundColorAttributeName : UIColor.orangeColor,NSFontAttributeName : [UIFont systemFontOfSize:16.0]}];
model.numberColor = UIColor.orangeColor;
model.numberFont = [UIFont systemFontOfSize:30.0];
model.loginBtnText = [[NSAttributedString alloc] initWithString:@"一键登录" attributes:@{NSForegroundColorAttributeName : UIColor.whiteColor,NSFontAttributeName : [UIFont systemFontOfSize:20.0]}];
//model.autoHideLoginLoading = NO;
//model.privacyOne = @[@"《隐私1》",@"https://www.taobao.com/"];
//model.privacyTwo = @[@"《隐私2》",@"https://www.taobao.com/"];
model.privacyColors = @[UIColor.lightGrayColor, UIColor.orangeColor];
model.privacyAlignment = NSTextAlignmentCenter;
model.privacyFont = [UIFont fontWithName:@"PingFangSC-Regular" size:13.0];
model.privacyOperatorPreText = @"《";
model.privacyOperatorSufText = @"》";
//model.checkBoxIsHidden = NO;
model.checkBoxWH = 17.0;
model.changeBtnTitle = [[NSAttributedString alloc] initWithString:@"切换到其他方式" attributes:@{NSForegroundColorAttributeName : UIColor.orangeColor,NSFontAttributeName : [UIFont systemFontOfSize:18.0]}];
//model.changeBtnIsHidden = NO;
//model.prefersStatusBarHidden = NO;
model.preferredStatusBarStyle = UIStatusBarStyleLightContent;
//model.presentDirection = PNSPresentationDirectionBottom;
//授权页默认控件布局调整
//model.navBackButtonFrameBlock =
//model.navTitleFrameBlock =
model.navMoreViewFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGFloat width = superViewSize.height;
CGFloat height = width;
return CGRectMake(superViewSize.width - 15 - width, 0, width, height);
};
model.loginBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
frame.origin.y = 20;
return frame;
}
return frame;
};
model.sloganFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
return CGRectZero; //横屏时模拟隐藏该控件
} else {
return CGRectMake(0, 140, superViewSize.width, frame.size.height);
}
};
model.numberFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
frame.origin.y = 140;
}
return frame;
};
model.loginBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
frame.origin.y = 185;
}
return frame;
};
model.changeBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
return CGRectZero; //横屏时模拟隐藏该控件
} else {
return CGRectMake(10, frame.origin.y, superViewSize.width - 20, 30);
}
};
//model.privacyFrameBlock =
//添加自定义控件并对自定义控件进行布局
__block UIButton *customBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[customBtn setTitle:@"这是一个自定义控件" forState:UIControlStateNormal];
[customBtn setBackgroundColor:UIColor.redColor];
customBtn.frame = CGRectMake(0, 0, 230, 40);
model.customViewBlock = ^(UIView * _Nonnull superCustomView) {
[superCustomView addSubview:customBtn];
};
model.customViewLayoutBlock = ^(CGSize screenSize, CGRect contentViewFrame, CGRect navFrame, CGRect titleBarFrame, CGRect logoFrame, CGRect sloganFrame, CGRect numberFrame, CGRect loginFrame, CGRect changeBtnFrame, CGRect privacyFrame) {
CGRect frame = customBtn.frame;
frame.origin.x = (contentViewFrame.size.width - frame.size.width) * 0.5;
frame.origin.y = CGRectGetMinY(privacyFrame) - frame.size.height - 20;
frame.size.width = contentViewFrame.size.width - frame.origin.x * 2;
customBtn.frame = frame;
};
// 横竖屏切换
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskAllButUpsideDown;
// 仅支持竖屏
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskPortrait;
// 仅支持横屏
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskLandscape;
全屏模式下二次弹窗示例
TXCustomModel *model = [[TXCustomModel alloc] init];
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskPortrait;
model.navColor = [UIColor orangeColor];
NSDictionary *attributes = @{
NSForegroundColorAttributeName : [UIColor whiteColor],
NSFontAttributeName : [UIFont systemFontOfSize:20.0]
};
model.navTitle = [[NSAttributedString alloc] initWithString:@"一键登录" attributes:attributes];
model.navBackImage = [UIImage imageNamed:@"icon_nav_back_light"];
model.logoImage = [UIImage imageNamed:@"taobao"];
model.changeBtnIsHidden = YES;
model.privacyOne = @[@"协议1", @"https://www.taobao.com"];
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeSystem];
[button1 setTitle:button1Title forState:UIControlStateNormal];
[button1 addTarget:target1 action:selector1 forControlEvents:UIControlEventTouchUpInside];
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeSystem];
[button2 setTitle:button2Title forState:UIControlStateNormal];
[button2 addTarget:target2 action:selector2 forControlEvents:UIControlEventTouchUpInside];
model.privacyAlignment = NSTextAlignmentRight;
model.customViewBlock = ^(UIView * _Nonnull superCustomView) {
[superCustomView addSubview:button1];
[superCustomView addSubview:button2];
};
model.customViewLayoutBlock = ^(CGSize screenSize, CGRect contentViewFrame, CGRect navFrame, CGRect titleBarFrame, CGRect logoFrame, CGRect sloganFrame, CGRect numberFrame, CGRect loginFrame, CGRect changeBtnFrame, CGRect privacyFrame) {
button1.frame = CGRectMake(CGRectGetMinX(loginFrame),
CGRectGetMaxY(loginFrame) + 20,
CGRectGetWidth(loginFrame),
30);
button2.frame = CGRectMake(CGRectGetMinX(loginFrame),
CGRectGetMaxY(button1.frame) + 15,
CGRectGetWidth(loginFrame),
30);
};
model.privacyAlertIsNeedShow = YES;
model.privacyAlertMaskAlpha = 0.5;
model.privacyAlertMaskColor = UIColor.blackColor;
model.privacyAlertCornerRadiusArray = @[@10,@10,@10,@10];
model.privacyAlertBackgroundColor = UIColor.whiteColor;
model.privacyAlertAlpha = 1.0;
model.privacyAlertTitleBackgroundColor = UIColor.whiteColor;
model.privacyAlertContentBackgroundColor = UIColor.whiteColor;
model.privacyAlertTitleFont = [UIFont systemFontOfSize:16];
model.privacyAlertTitleColor = UIColor.blackColor;
model.privacyAlertContentColors = @[UIColor.grayColor, UIColor.orangeColor];
model.privacyAlertContentAlignment = NSTextAlignmentCenter;
UIImage *activeImage = [TXCommonUtils imageWithColor:UIColor.orangeColor size:CGSizeMake(UIScreen.mainScreen.bounds.size.width - 2 * 18, 50) isRoundedCorner:YES radius:10];
UIImage *hightLightImage = [TXCommonUtils imageWithColor:UIColor.grayColor size:CGSizeMake(UIScreen.mainScreen.bounds.size.width - 2 * 18, 50) isRoundedCorner:YES radius:10];
model.privacyAlertBtnBackgroundImages = @[activeImage, hightLightImage];
model.privacyAlertButtonTextColors = @[UIColor.whiteColor,UIColor.blueColor];
model.privacyAlertButtonFont = [UIFont systemFontOfSize:18];
model.privacyAlertCloseButtonIsNeedShow = YES;
model.privacyAlertMaskIsNeedShow = YES;
model.privacyAlertIsNeedAutoLogin = NO;
model.tapPrivacyAlertMaskCloseAlert = NO;
model.expandAuthPageCheckedScope = YES;
model.privacyAlertCloseButtonIsNeedShow = YES;
model.privacyAlertTitleFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
return CGRectMake(0, 20, frame.size.width, frame.size.height);
};
model.privacyAlertPrivacyContentFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
return CGRectMake(0, frame.origin.y+10, frame.size.width, frame.size.height);
};
model.privacyAlertButtonFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
return CGRectMake(frame.origin.x,superViewSize.height - 50 - 20, frame.size.width, 50);;
};
model.privacyAlertFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
return CGRectMake(40, (superViewSize.height - 150)*0.5, screenSize.width-80, 150);
};
授权页弹窗模式示例
支持横竖屏切换。
TXCustomModel *model = [[TXCustomModel alloc] init];
model.alertCornerRadiusArray = @[@10, @10, @10, @10];
//model.alertCloseItemIsHidden = YES;
model.alertTitleBarColor = UIColor.orangeColor;
model.alertTitle = [[NSAttributedString alloc] initWithString:@"一键登录(弹窗)" attributes:@{NSForegroundColorAttributeName : UIColor.whiteColor, NSFontAttributeName : [UIFont systemFontOfSize:20.0]}];
model.alertCloseImage = [UIImage imageNamed:@"icon_close_light"];
model.privacyNavColor = UIColor.orangeColor;
model.privacyNavBackImage = [UIImage imageNamed:@"icon_nav_back_light"];
model.privacyNavTitleFont = [UIFont systemFontOfSize:20.0];
model.privacyNavTitleColor = UIColor.whiteColor;
model.logoImage = [UIImage imageNamed:@"taobao"];
//model.logoIsHidden = NO;
//model.sloganIsHidden = NO;
model.sloganText = [[NSAttributedString alloc] initWithString:@"一键登录slogan文案" attributes:@{NSForegroundColorAttributeName : UIColor.orangeColor,NSFontAttributeName : [UIFont systemFontOfSize:16.0]}];
model.numberColor = UIColor.orangeColor;
model.numberFont = [UIFont systemFontOfSize:30.0];
model.loginBtnText = [[NSAttributedString alloc] initWithString:@"一键登录" attributes:@{NSForegroundColorAttributeName : UIColor.whiteColor, NSFontAttributeName : [UIFont systemFontOfSize:20.0]}];
//model.autoHideLoginLoading = NO;
//model.privacyOne = @[@"《隐私1》",@"https://www.taobao.com/"];
//model.privacyTwo = @[@"《隐私2》",@"https://www.taobao.com/"];
model.privacyColors = @[UIColor.lightGrayColor, UIColor.orangeColor];
model.privacyAlignment = NSTextAlignmentCenter;
model.privacyFont = [UIFont fontWithName:@"PingFangSC-Regular" size:13.0];
model.privacyOperatorPreText = @"《";
model.privacyOperatorSufText = @"》";
//model.checkBoxIsHidden = NO;
model.checkBoxWH = 17.0;
model.changeBtnTitle = [[NSAttributedString alloc] initWithString:@"切换到其他方式" attributes:@{NSForegroundColorAttributeName : UIColor.orangeColor,NSFontAttributeName : [UIFont systemFontOfSize:18.0]}];
//model.changeBtnIsHidden = NO;
//model.prefersStatusBarHidden = NO;
//model.preferredStatusBarStyle = UIStatusBarStyleDefault;
//model.presentDirection = PNSPresentationDirectionBottom;
CGFloat ratio = MAX(TX_SCREEN_WIDTH, TX_SCREEN_HEIGHT) / 667.0;
//实现该block,并且返回的frame的x或y大于0,则认为是弹窗谈起授权页
model.contentViewFrameBlock = ^CGRect(CGSize screenSize, CGSize contentSize, CGRect frame) {
CGFloat alertX = 0;
CGFloat alertY = 0;
CGFloat alertWidth = 0;
CGFloat alertHeight = 0;
if ([self isHorizontal:screenSize]) {
alertX = ratio * TX_Alert_Horizontal_Default_Left_Padding;
alertWidth = screenSize.width - alertX * 2;
alertY = (screenSize.height - alertWidth * 0.5) * 0.5;
alertHeight = screenSize.height - 2 * alertY;
} else {
alertX = TX_Alert_Default_Left_Padding * ratio;
alertWidth = screenSize.width - alertX * 2;
alertY = TX_Alert_Default_Top_Padding * ratio;
alertHeight = screenSize.height - alertY * 2;
}
return CGRectMake(alertX, alertY, alertWidth, alertHeight);
};
//授权页默认控件布局调整
//model.alertTitleBarFrameBlock =
//model.alertTitleFrameBlock =
//model.alertCloseItemFrameBlock =
model.logoFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
return CGRectZero; //横屏时模拟隐藏该控件
} else {
frame.origin.y = 10;
return frame;
}
};
model.sloganFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
return CGRectZero; //横屏时模拟隐藏该控件
} else {
frame.origin.y = 110;
return frame;
}
};
model.numberFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
frame.origin.y = 20;
frame.origin.x = (superViewSize.width * 0.5 - frame.size.width) * 0.5 + 18.0;
} else {
frame.origin.y = 140;
}
return frame;
};
model.loginBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
frame.origin.y = 60;
frame.size.width = superViewSize.width * 0.5; //登录按钮最小宽度是其父视图的一半,再小就不生效了
} else {
frame.origin.y = 180;
}
return frame;
};
model.changeBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
if ([self isHorizontal:screenSize]) {
return CGRectZero; //横屏时模拟隐藏该控件
} else {
return CGRectMake(10, 240, superViewSize.width - 20, 30);
}
};
//model.privacyFrameBlock =
//添加自定义控件并对自定义控件进行布局
__block UIButton *customBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[customBtn setTitle:@"这是一个自定义控件" forState:UIControlStateNormal];
[customBtn setBackgroundColor:UIColor.redColor];
model.customViewBlock = ^(UIView * _Nonnull superCustomView) {
[superCustomView addSubview:customBtn];
};
model.customViewLayoutBlock = ^(CGSize screenSize, CGRect contentViewFrame, CGRect navFrame, CGRect titleBarFrame, CGRect logoFrame, CGRect sloganFrame, CGRect numberFrame, CGRect loginFrame, CGRect changeBtnFrame, CGRect privacyFrame) {
CGFloat padding = 15;
CGFloat x = 0;
CGFloat y = 0;
CGFloat width = 0;
CGFloat height = 0;
if ([self isHorizontal:screenSize]) {
x = CGRectGetMaxX(loginFrame) + padding;
y = padding;
width = contentViewFrame.size.width - x - padding;
height = CGRectGetMinY(privacyFrame) - y - padding;
} else {
x = padding;
y = MAX(CGRectGetMaxY(changeBtnFrame), CGRectGetMaxY(loginFrame)) + padding;
width = contentViewFrame.size.width - 2 * x;
height = CGRectGetMinY(privacyFrame) - y - padding;
}
customBtn.frame = CGRectMake(x, y, width, height);
};
// 横竖屏切换
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskAllButUpsideDown;
// 仅支持竖屏
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskPortrait;
// 仅支持横屏
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskLandscape;
二次隐私协议弹窗页面
配置二次隐私协议弹窗页面
方法 | 参数类型 | 说明 |
privacyAlertIsNeedShow | BOOL | 设置二次隐私协议弹窗是否显示。取值:
|
privacyAlertIsNeedAutoLogin | BOOL | 设置二次隐私协议弹窗点击按钮是否需要执行登录。取值:
|
privacyAlertEntryAnimation | CAAnimation | 设置二次隐私协议弹窗显示自定义动画,默认从下往上位移动画。 |
privacyAlertExitAnimation | CAAnimation | 设置二次隐私协议弹窗隐藏自定义动画,默认从上往下位移动画。 |
privacyAlertCornerRadiusArray | NSArray<NSNumber *> | 设置二次隐私协议弹窗的四个圆角值。 说明 顺序为左上,左下,右下,右上,需要填充4个值,不足4个值则无效,如果值小于等于0则为直角。 |
privacyAlertBackgroundColor | UIColor | 设置二次隐私协议弹窗背景颜色。 |
privacyAlertAlpha | CGFloat | 设置二次隐私协议弹窗透明度,默认值1.0。 说明 设置范围0.3~1.0。 |
privacyAlertTitleFont | UIFont | 设置二次隐私协议弹窗标题文字大小。 |
privacyAlertTitleColor | UIColor | 设置二次隐私协议弹窗标题文字颜色。 |
privacyAlertTitleBackgroundColor | UIColor | 设置二次隐私协议弹窗标题背景颜色。 |
privacyAlertTitleAlignment | NSTextAlignment | 设置二次隐私协议弹窗标题位置,默认居中。 |
privacyAlertContentFont | UIFont | 设置二次隐私协议弹窗协议内容文字大小,默认值13 dp,最小值12 dp。 |
privacyAlertContentBackgroundColor | UIColor | 设置二次隐私协议弹窗协议内容背景颜色。 |
privacyAlertContentColors | NSArray<UIColor *> | 设置二次隐私协议弹窗协议内容颜色数组。 说明 默认值[#999999,#1890FF],[非点击文案颜色,点击文案颜色]。 |
privacyAlertContentAlignment | NSTextAlignment | 设置二次隐私协议弹窗协议文案居中、居左,默认居左。 |
privacyAlertBtnBackgroundImages | NSArray<UIImage *> | 设置二次隐私协议弹窗按钮背景图片。 |
privacyAlertButtonTextColors | NSArray<UIColor *> | 设置二次隐私协议弹窗按钮文字颜色。 |
privacyAlertButtonFont | UIFont | 设置二次隐私协议弹窗按钮文字大小,默认值18 dp,最小值10 dp。 |
privacyAlertCloseButtonIsNeedShow | BOOL | 设置二次隐私协议弹窗关闭按钮是否显示。
|
privacyAlertCloseButtonImage | UIImage | 设置二次隐私协议弹窗右侧关闭按钮图片。 |
privacyAlertMaskIsNeedShow | BOOL | 设置二次隐私协议弹窗背景蒙层是否显示。
|
tapPrivacyAlertMaskCloseAlert | BOOL | 设置二次隐私协议弹窗点击背景蒙层是否关闭弹窗。
|
privacyAlertMaskColor | UIColor | 设置二次隐私协议弹窗蒙版背景颜色。 |
privacyAlertMaskAlpha | CGFloat | 设置二次隐私协议弹窗蒙版透明度,默认值0.5。 说明 设置范围0.3~1.0。 |
privacyAlertOperatorColor | UIColor | 二次隐私协议弹窗协议运营商协议内容颜色,优先级最高,如果privacyAlertOperatorColors不设置,则取privacyAlertContentColors中的点击文案颜色,privacyAlertContentColors不设置,则是默认色。 |
privacyAlertOneColor | UIColor | 二次隐私协议弹窗协议1内容颜色,优先级最高,如果privacyAlertOneColors不设置,则取privacyAlertContentColors中的点击文案颜色,privacyAlertContentColors不设置,则是默认色。 |
privacyAlertTwoColor | UIColor | 二次隐私协议弹窗协议2内容颜色,优先级最高,如果privacyAlertTwoColors不设置,则取privacyAlertContentColors中的点击文案颜色,privacyAlertContentColors不设置,则是默认色。 |
privacyAlertThreeColor | UIColor | 二次隐私协议弹窗协议3内容颜色,优先级最高,如果privacyAlertThreeColors不设置,则取privacyAlertContentColors中的点击文案颜色,privacyAlertContentColors不设置,则是默认色。 |
privacyAlertPreText | NSString | 二次隐私协议弹窗协议整体文案,前缀部分文案,如果不赋值,默认使用privacyPreText。 |
privacyAlertSufText | NSString | 二次隐私协议弹窗协议整体文案,后缀部分文案,如果不赋值,默认使用privacySufText。 |
privacyAlertMaskEntryAnimation | CAAnimation | 设置二次隐私协议弹窗蒙版显示动画,默认渐显动画。 |
privacyAlertMaskExitAnimation | CAAnimation | 设置二次隐私协议弹窗蒙版消失动画,默认渐隐动画。 |
privacyAlertFrameBlock | PNSBuildFrameBlock | 设置二次隐私协议弹窗尺寸。 说明 默认值:20 px,(SH-100)*0.5 px,(SW-40) px,100 px。不能超出父视图,高度不小于50 px,宽度不小于0 px。 |
privacyAlertTitleFrameBlock | PNSBuildFrameBlock | 设置二次隐私协议弹窗标题尺寸。 说明 不能超出父视图,最小宽度100 px,最小高度15 px。 |
privacyAlertPrivacyContentFrameBlock | PNSBuildFrameBlock | 设置二次隐私协议弹窗内容尺寸。 说明 从标题顶部位置开始,不能超出父视图。 |
privacyAlertButtonFrameBlock | PNSBuildFrameBlock | 设置二次隐私协议弹窗确认并继续按钮尺寸。 说明 居中显示,不能超出父视图。最小宽度40 px,最小高度20 px。 |
privacyAlertCloseFrameBlock | PNSBuildFrameBlock | 设置二次隐私协议弹窗右侧关闭按钮尺寸。 说明 不能超出父视图。 |
privacyAlertBtnContent | NSString | 二次隐私协议弹窗按钮文字内容。默认值:同意。 |
privacyAlertTitleContent | NSString | 二次隐私协议弹窗标题文字内容。默认值:请阅读并同意以下条款。 |
privacyAlertCustomViewBlock | Block | 二次授权页弹窗自定义控件添加。 |
privacyAlertCustomViewLayoutBlock | Block | 二次授权页设置自定义添加控件的frame。 |