Files
yinmeng-ios/xplan-ios/Main/Login/View/LoginViewController.m

579 lines
21 KiB
Mathematica
Raw Normal View History

2021-09-06 18:47:38 +08:00
//
// LoginViewController.m
// xplan-ios
//
// Created by zu on 2021/8/31.
//
#import "LoginViewController.h"
#import "LoginPresenter.h"
#import "LoginProtocol.h"
#import "UIImage+Utils.h"
#import "GCDHelper.h"
#import "XCHUDTool.h"
#import <Masonry/Masonry.h>
#import <ReactiveObjC.h>
#import <YYText.h>
#import <NTESQuickPass/NTESQuickPass.h>
//
#ifdef DEBUG
NSString *businessID = @"09c1214706c34f4798d3f05d86148608";
#else
NSString *businessID = @"09c1214706c34f4798d3f05d86148608";
#endif
typedef NS_ENUM(NSUInteger, XYLoginType) {
XYLoginTypeUnknow = 0, //
XYLoginTypeTelecom = 1, //
XYLoginTypeChinaMobile = 2, //
XYLoginTypeUnicom = 3 //
};
typedef NS_ENUM(NSInteger,XYThirdLoginType) {
XYThirdLoginWechat = 1, //
XYThirdLoginQQ = 2, // QQ
XYThirdLoginPhoneNum = 3, //
XYThirdLoginApple = 5, // id
};
@interface LLButtonView : UIView
//icon
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) UIImageView *logoImageView;
2021-09-06 18:47:38 +08:00
//title
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) UILabel *titleLabel;
2021-09-06 18:47:38 +08:00
@end
@implementation LLButtonView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self initView];
[self initContrations];
}
return self;
}
- (void)initView {
[self addSubview:self.logoImageView];
[self addSubview:self.titleLabel];
}
- (void)initContrations {
[self.logoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(36, 36));
make.centerX.left.mas_equalTo(self);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.mas_equalTo(self);
make.top.mas_equalTo(self.logoImageView.mas_bottom).offset(15);
}];
}
- (UIImageView *)logoImageView {
if (!_logoImageView) {
_logoImageView = [[UIImageView alloc] init];
_logoImageView.userInteractionEnabled = YES;
}
return _logoImageView;
}
- (UILabel *)titleLabel {
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.font = [UIFont systemFontOfSize:11];
_titleLabel.textColor = ThemeTextColor;
_titleLabel.textAlignment = NSTextAlignmentCenter;
}
return _titleLabel;
}
@end
@interface LoginViewController () <LoginProtocol>
@property (nonatomic, strong) UIImageView *appIcon;
/** */
@property (nonatomic, strong) UILabel *titleLabel;
/** */
@property (nonatomic, strong) UILabel *subTitleLabel;
@property (nonatomic, strong) UIView *contentView;
/** */
@property (nonatomic, strong) UIButton *loginButton;
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) UIStackView *stackView;
2021-09-06 18:47:38 +08:00
///
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) LLButtonView *qqButtonView;
2021-09-06 18:47:38 +08:00
///wx
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) LLButtonView *wxButtonView;
2021-09-06 18:47:38 +08:00
///qq
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) LLButtonView *phoneButtonView;
2021-09-06 18:47:38 +08:00
/** */
@property (nonatomic, strong) UIButton *agreeButton;
/** */
@property (nonatomic, strong) YYLabel *agreeLabel;
/** */
@property (nonatomic, strong) UIImageView *authBubbleView;
/** */
@property (nonatomic, strong) UILabel *authBubbleLabel;
@end
@implementation LoginViewController
- (LoginPresenter *)createPresenter {
return [[LoginPresenter alloc] init];
}
- (void)phoneQuickLoginSuccess {
2021-09-07 23:05:43 +08:00
[self.navigationController popToRootViewControllerAnimated:YES];
2021-09-06 18:47:38 +08:00
}
- (void)viewDidLoad {
[super viewDidLoad];
[self initView];
[self setUpConstraints];
[self setEvents];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self hideNavigationBar];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self showNavigationBar];
}
- (void)initView {
[self.view addSubview:self.appIcon];
[self.view addSubview:self.titleLabel];
[self.view addSubview:self.subTitleLabel];
[self.view addSubview:self.contentView];
[self.contentView addSubview:self.loginButton];
[self.contentView addSubview:self.stackView];
[self.view addSubview:self.agreeButton];
[self.view addSubview:self.agreeLabel];
[self.view addSubview:self.authBubbleView];
[self.authBubbleView addSubview:self.authBubbleLabel];
[self.stackView addArrangedSubview:self.qqButtonView];
[self.stackView addArrangedSubview:self.phoneButtonView];
[self.stackView addArrangedSubview:self.wxButtonView];
}
- (void)setUpConstraints {
[self.appIcon mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(110 + kSafeAreaTopHeight);
make.left.mas_equalTo(52);
make.width.mas_equalTo(100);
make.height.mas_equalTo(100);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.appIcon.mas_top).offset(28.5);
make.left.mas_equalTo(self.appIcon.mas_right).offset(7.5);
make.height.mas_equalTo(20);
make.right.mas_equalTo(-20);
}];
[self.subTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(13);
make.left.mas_equalTo(self.titleLabel.mas_left);
make.height.mas_equalTo(13);
make.right.mas_equalTo(-20);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view).offset(iPhoneXSeries ? 300 : 228);
make.left.right.bottom.mas_equalTo(0);
}];
[self.loginButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.mas_equalTo(self.view).inset(52);
make.top.mas_equalTo(70);
make.height.mas_equalTo(45);
}];
[self.stackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight - 60);
make.centerX.mas_equalTo(self.view);
make.height.mas_equalTo(65);
}];
[self.agreeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.loginButton.mas_bottom).offset(20);
make.height.mas_equalTo(40);
make.width.mas_equalTo(270);
make.centerX.mas_equalTo(self.view).mas_offset(15 - 6);
}];
[self.agreeButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.agreeLabel.mas_left).mas_offset(6);
make.centerY.mas_equalTo(self.agreeLabel.mas_centerY);
make.width.height.mas_equalTo(30);
}];
[self.authBubbleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.agreeButton).mas_offset((-16));
make.top.mas_equalTo(self.agreeButton.mas_bottom);
make.width.mas_equalTo(235);
make.height.mas_equalTo(29);
}];
[self.authBubbleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(8);
make.bottom.mas_equalTo(self.authBubbleView).mas_offset(-6);
}];
}
- (void)setEvents {
//
@weakify(self)
UITapGestureRecognizer *phoneTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)];
[self.phoneButtonView addGestureRecognizer:phoneTap];
UITapGestureRecognizer * qqTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)];
[self.qqButtonView addGestureRecognizer:qqTap];
UITapGestureRecognizer * wxTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickRecognizer:)];
[self.wxButtonView addGestureRecognizer:wxTap];
[[self.agreeButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
self.agreeButton.selected = !self.agreeButton.selected;
if (self.agreeButton.isSelected) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"hadAgree" forKey:@"kHadAgreePrivacy"];
[defaults synchronize];
[UIView animateWithDuration:0.5 animations:^{
self.authBubbleView.alpha = 0.0;
}];
}
}];
//
[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
@strongify(self)
if (self.agreeButton.isSelected) {
[self phoneQuickLogin];
} else {
[UIView animateWithDuration:0.5 animations:^{
self.authBubbleView.alpha = 1.0;
}];
}
}];
}
- (void)didClickRecognizer:(UITapGestureRecognizer *)tap {
UIView * view = tap.view;
if (self.agreeButton.isSelected) {
if ([view isEqual:self.phoneButtonView]) {
// InputPhoneLoginViewController *inputPhoneVC = [[InputPhoneLoginViewController alloc] init];
// [self.navigationController pushViewController:inputPhoneVC animated:YES];
} else if([view isEqual:self.qqButtonView]) {
[XCHUDTool showLoading];
// [GetCore(AuthCore) thirdLoginPlatform:SSDKPlatformTypeQQ];
} else if([view isEqual:self.wxButtonView]) {
[XCHUDTool showLoading];
// [GetCore(AuthCore) thirdLoginPlatform:SSDKPlatformTypeWechat];
}
} else {
[UIView animateWithDuration:0.5 animations:^{
self.authBubbleView.alpha = 1.0;
}];
}
}
- (void)phoneQuickLogin {
[XCHUDTool showLoading];
// 使shouldQuickLogin
@weakify(self)
NTESQuickLoginManager *qlManager = [NTESQuickLoginManager sharedInstance];
BOOL shouldQL = [qlManager shouldQuickLogin];
if (!shouldQL) {
[self phoneQuickLoginFail];
return;
}
[qlManager registerWithBusinessID:businessID timeout:3*1000 configURL:nil extData:nil completion:^(NSDictionary * _Nullable params, BOOL regSuccess) {
@strongify(self)
if (!regSuccess) {
dispatch_main_sync_safe(^{
[self phoneQuickLoginFail];
});
return;
}
NSString *token = [params objectForKey:@"token"];
[qlManager getPhoneNumberCompletion:^(NSDictionary * _Nonnull resultDic) {
@strongify(self)
NSNumber *boolNum = [resultDic objectForKey:@"success"];
BOOL getPhoneNumberSuccess = [boolNum boolValue];
if (!getPhoneNumberSuccess) {
dispatch_main_sync_safe(^{
[self phoneQuickLoginFail];
});
return;
}
[self configQuickLogin];
[qlManager CUCMCTAuthorizeLoginCompletion:^(NSDictionary * _Nonnull resultDic) {
@strongify(self)
NSNumber *boolNum = [resultDic objectForKey:@"success"];
BOOL authSuccess = [boolNum boolValue];
if (!authSuccess) {
dispatch_main_sync_safe(^{
NSString *resultCode = [resultDic objectForKey:@"resultCode"];
//
if ([resultCode isEqualToString:@"200020"] ||
[resultCode isEqualToString:@"10104"]) {
[XCHUDTool hideHUD];
} else {
[self phoneQuickLoginFail];
}
});
return;
}
dispatch_main_sync_safe(^{
@strongify(self)
// [TTStatisticsService trackEvent:@"one_click_login_succeed" eventDescribe:@"一键登录成功"];
// // acessToken
[XCHUDTool hideHUD];
[self dismissViewControllerAnimated:YES completion:nil];
[self.presenter phoneQuickLogin:resultDic[@"accessToken"] token:token];
});
}];
}];
}];
}
- (void)phoneQuickLoginFail {
[XCHUDTool showErrorWithMessage:@"一键登录失败,请检查手机网络状态。"];
}
- (void)configQuickLogin {
// 0: 1: 2. 3.
NSInteger currentCarrier = [[NTESQuickLoginManager sharedInstance] getCarrier];
NTESQuickLoginModel *CMModel = [[NTESQuickLoginModel alloc] init];
CMModel.currentVC = self;
CMModel.presentDirectionType = NTESPresentDirectionPresent;
if (currentCarrier == XYLoginTypeUnicom) { //
CMModel.logoImg = [UIImage imageNamed:@"login_unicom_mobile"];
}else if (currentCarrier == XYLoginTypeChinaMobile) { //
CMModel.logoImg = [UIImage imageNamed:@"login_china_mobile"];
}else { //
CMModel.logoImg = [UIImage imageNamed:@"login_ct_mobile"];
}
CMModel.backgroundColor = ThemeBackgroundColor;
CMModel.logoWidth = 95;
CMModel.logoHeight = 95;
CMModel.logoOffsetTopY = 30;
CMModel.navText = @"一键登录";
CMModel.navTextColor = UIColor.whiteColor;
CMModel.navTextFont = [UIFont boldSystemFontOfSize:18];
CMModel.navReturnImg = [UIImage imageNamed:@"common_nav_back"];
CMModel.navBgColor = ThemeBackgroundColor;
CMModel.logBtnHeight = 45;
CMModel.logBtnRadius = 45.f / 2;
CMModel.logBtnOffsetTopY= 260;
CMModel.logBtnOriginLeft = 52;
CMModel.logBtnOriginRight = 52;
CMModel.logBtnUsableBGColor = ThemeDefaultColor;
CMModel.logBtnText = @"本机号码一键登录";
CMModel.logBtnTextColor = UIColor.whiteColor;
CMModel.logBtnTextFont = [UIFont systemFontOfSize:18 weight:UIFontWeightMedium];
CMModel.numberOffsetTopY = 170;
CMModel.numberColor = UIColor.whiteColor;
CMModel.numberFont = [UIFont boldSystemFontOfSize:20];
CMModel.brandColor = UIColor.whiteColor;
CMModel.uncheckedImg = [UIImage imageNamed:@"common_checkbox_uncheck"];
CMModel.checkedImg = [UIImage imageNamed:@"common_checkbox_checked"];
CMModel.checkboxWH = 20;
CMModel.privacyColor = ThemeTextColor;
CMModel.appPrivacyText = @"登录即代表同意《默认》,并授权音游获取本机号码。";
CMModel.privacyState = YES;
CMModel.privacyFont = [UIFont systemFontOfSize:12];
CMModel.protocolColor = ThemeDefaultColor;
CMModel.backActionBlock = ^{ //
[XCHUDTool hideHUD];
};
dispatch_main_sync_safe(^{
[[NTESQuickLoginManager sharedInstance] setupModel:CMModel];
});
}
- (UIImageView *)appIcon {
if (!_appIcon) {
_appIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"login_appIcon"]];
}
return _appIcon;
}
- (UILabel *)titleLabel{
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18];
_titleLabel.text = AppName;
_titleLabel.textColor = ThemeTextColor;
}
return _titleLabel;
}
- (UILabel *)subTitleLabel {
if (!_subTitleLabel) {
_subTitleLabel = [[UILabel alloc] init];
_subTitleLabel.font = [UIFont systemFontOfSize:13];
_subTitleLabel.text = @"来音游打游戏,争夺更多赏金!";
_subTitleLabel.textColor = ThemeTextColor;
_subTitleLabel.textAlignment = NSTextAlignmentLeft;
}
return _subTitleLabel;
}
- (UIButton *)loginButton{
if (!_loginButton) {
_loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
_loginButton.layer.masksToBounds = YES;
_loginButton.layer.cornerRadius = 45/2.f;
[_loginButton setTitle:@"本机号码一键登录" forState:UIControlStateNormal];
[_loginButton setTitle:@"本机号码一键登录" forState:UIControlStateSelected];
_loginButton.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightMedium];
[_loginButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
UIImage *image = [UIImage gradientColorImageFromColors:@[ThemeButtonGradientStartColor,ThemeButtonGradientEndColor] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(KScreenWidth - 52 * 2, 45)];
[_loginButton setBackgroundImage:image forState:UIControlStateNormal];
}
return _loginButton;
}
- (UIButton *)agreeButton {
if (!_agreeButton) {
_agreeButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_agreeButton setImage:[UIImage imageNamed:@"common_checkbox_uncheck"] forState:UIControlStateNormal];
[_agreeButton setImage:[UIImage imageNamed:@"common_checkbox_checked"] forState:UIControlStateSelected];
}
return _agreeButton;
}
- (YYLabel *)agreeLabel {
if (!_agreeLabel) {
_agreeLabel = [[YYLabel alloc] init];
_agreeLabel.font = [UIFont systemFontOfSize:12];
_agreeLabel.numberOfLines = 0;
_agreeLabel.attributedText = [self privacyAttributedStr];
_agreeLabel.textAlignment = NSTextAlignmentCenter;
[_agreeLabel sizeToFit];
}
return _agreeLabel;
}
- (NSMutableAttributedString *)privacyAttributedStr{
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@"登录即代表同意"];
attString.yy_color = ThemeTextColor;
NSString *userString = @"《用户服务协议》";
NSMutableAttributedString *userAttString = [[NSMutableAttributedString alloc] initWithString:userString attributes:@{NSForegroundColorAttributeName:ThemeDefaultColor}];
@weakify(self)
[userAttString yy_setTextHighlightRange:NSMakeRange(0, userAttString.length) color:nil backgroundColor:nil userInfo:nil tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
@strongify(self);
//
// [self goToWebview:HtmlUrlKey(kUserProtocalURL)];
} longPressAction:nil];
NSMutableAttributedString *andString = [[NSMutableAttributedString alloc] initWithString:@"和"];
andString.yy_color = ThemeTextColor;
NSString *protocolString = @"《隐私政策》";
NSMutableAttributedString *privateString = [[NSMutableAttributedString alloc] initWithString:protocolString attributes:@{NSForegroundColorAttributeName:ThemeDefaultColor}];
[privateString yy_setTextHighlightRange:NSMakeRange(0, privateString.length) color:nil backgroundColor:nil userInfo:nil tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
@strongify(self);
//
// [self goToWebview:HtmlUrlKey(kPrivacyURL)];
} longPressAction:nil];
[attString appendAttributedString:userAttString];
[attString appendAttributedString:andString];
[attString appendAttributedString:privateString];
return attString;
}
- (UIImageView *)authBubbleView {
if (!_authBubbleView) {
_authBubbleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"login_auth_bubble"]];
_authBubbleView.contentMode = UIViewContentModeScaleAspectFit;
_authBubbleView.alpha = 0;
}
return _authBubbleView;
}
- (UILabel *)authBubbleLabel {
if (!_authBubbleLabel) {
_authBubbleLabel = [[UILabel alloc] init];
_authBubbleLabel.text = @"同意隐私政策和用户协议后,才可以注册登录哦~";
_authBubbleLabel.font = [UIFont systemFontOfSize:10];
_authBubbleLabel.textColor = UIColor.whiteColor;
}
return _authBubbleLabel;
}
- (UIView *)contentView {
if (!_contentView) {
_contentView = [[UIView alloc] init];
}
return _contentView;
}
- (UIStackView *)stackView {
if (!_stackView) {
_stackView = [[UIStackView alloc] init];
_stackView.distribution = UIStackViewDistributionEqualSpacing;
_stackView.spacing = 43;
_stackView.axis = UILayoutConstraintAxisHorizontal;
_stackView.alignment = UIStackViewAlignmentFill;
}
return _stackView;
}
- (LLButtonView *)phoneButtonView {
if (!_phoneButtonView) {
_phoneButtonView = [[LLButtonView alloc] init];
_phoneButtonView.logoImageView.image = [UIImage imageNamed:@"login_phone"];
_phoneButtonView.titleLabel.text = @"手机";
}
return _phoneButtonView;
}
- (LLButtonView *)qqButtonView {
if (!_qqButtonView) {
_qqButtonView = [[LLButtonView alloc] init];
_qqButtonView.logoImageView.image = [UIImage imageNamed:@"login_qq"];
_qqButtonView.titleLabel.text = @"QQ";
}
return _qqButtonView;
}
- (LLButtonView *)wxButtonView {
if (!_wxButtonView) {
_wxButtonView = [[LLButtonView alloc] init];
_wxButtonView.logoImageView.image = [UIImage imageNamed:@"login_wechat"];
_wxButtonView.titleLabel.text = @"微信";
}
return _wxButtonView;
}
@end