Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // BTMobileLoginInitialViewController.m
- // BT24
- //
- // Created by Pedro Pereira on 27/08/2018.
- // Copyright © 2018 ebankIT. All rights reserved.
- //
- #import <ebankITCore/EBKProfileSelectionViewModel.h>
- #import "BTMobileLoginInitialViewController.h"
- #import "BTMobileLoginViewModel.h"
- #import "BTValidator.h"
- #import "AppDelegate.h"
- #import "GroupCredentials.h"
- #import "BTCustomTokenManager.h"
- #import "ShortcutEventHandler.h"
- #import "ContractProfileSelectionViewController.h"
- #import "CustomerDetailsViewModel.h"
- #import "BTCustomerDetailsManager.h"
- #import "Constants.h"
- #import "BTLanguageManager.h"
- #import "BTMobileLoginRegisterTokenViewController.h"
- #import "BTMobileLoginLevel2CredentialsViewController.h"
- #import "SessionInfo.h"
- #import "BTBiometricHelper.h"
- @interface BTMobileLoginInitialViewController () <ContractProfileSelectionViewControllerDelegate>
- @property (weak, nonatomic) IBOutlet EBKCustomTextField *userIDTextField;
- @property (weak, nonatomic) IBOutlet EBKCustomTextField *mobilePassword;
- @property (weak, nonatomic) IBOutlet UILabel *forgetPassword;
- @property (weak, nonatomic) IBOutlet UIImageView *touchIDImage;
- @property (weak, nonatomic) IBOutlet EBKCustomTextField *passwordToken;
- @property (weak, nonatomic) IBOutlet UIButton *actionButton;
- @property (weak, nonatomic) IBOutlet UIImageView* biomericImage;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *topViewConstrain;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomViewHeightConstrain;
- @property (weak, nonatomic) IBOutlet UIView *biometricSugestionView;
- @property (weak, nonatomic) IBOutlet UIImageView *biometricTypeSugestionImage;
- @property (weak, nonatomic) IBOutlet UILabel *biometricSugestionLabel;
- @property (nonatomic, strong) UserProfile *selectedProfile;
- @property (nonatomic, strong) EBKProfileSelectionViewModel *profileSelectionViewModel;
- @property (strong, nonatomic) CustomerDetailsViewModel* customerVM;
- @property (strong, nonatomic) BTMobileLoginViewModel *mobileLoginVM;
- @property (strong, nonatomic) EBKLoginViewModel *loginVM;
- @property (nonatomic) BOOL isLogin;
- @property (nonatomic) BOOL hasTwoFactor;
- @end
- @implementation BTMobileLoginInitialViewController
- static const int vascoAccessCodeTypeID = 36;
- static const int passwordAccessCodeTypeID = 1;
- static const int SMSAccessCodeTypeID = 21;
- static const int mobileTokenAccessCodeTypeID = 37;
- static const CGFloat KlogoViewFinalHeight = 0.41;
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.mobileLoginVM = [[BTMobileLoginViewModel alloc] initWithDelegate:self];
- self.loginVM = [[EBKLoginViewModel alloc] initWithDelegate:self];
- [self.navigationController setNavigationBarHidden:YES animated:NO];
- UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lostPasswordTapped:)];
- [self.forgetPassword addGestureRecognizer:tapGestureRecognizer];
- self.forgetPassword.userInteractionEnabled = YES;
- if(![[BTCustomTokenManager sharedManager] isCustomTokenActive]){
- [self setupUIForRegisterToken];
- self.isLogin = NO;
- }else{
- [self setupUIForLogin];
- self.isLogin = YES;
- }
- self.profileSelectionViewModel = [[EBKProfileSelectionViewModel alloc] initWithDelegate:self];
- self.customerVM = [[CustomerDetailsViewModel alloc] initWithDelegate:self];
- UITapGestureRecognizer *viewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissControls:)];
- [viewTap setNumberOfTapsRequired:1];
- [viewTap setCancelsTouchesInView:NO];
- [self.view addGestureRecognizer:viewTap];
- [self setupInitialUI];
- }
- - (void)viewWillAppear:(BOOL)animated{
- [super viewWillAppear:animated];
- [self.navigationController setNavigationBarHidden:YES animated:NO];
- }
- -(void)setupInitialUI{
- CGRect screenRect = [[UIScreen mainScreen] bounds];
- CGFloat screenHeight = screenRect.size.height;
- self.topViewConstrain.constant = screenHeight;
- self.bottomViewHeightConstrain.constant = screenHeight * (1-KlogoViewFinalHeight);
- }
- -(void)viewDidAppear:(BOOL)animated{
- [super viewDidAppear:animated];
- [self executeAnimation];
- [self.mobileLoginVM getServerDate];
- }
- -(void)executeAnimation{
- CGRect screenRect = [[UIScreen mainScreen] bounds];
- CGFloat screenHeight = screenRect.size.height;
- self.topViewConstrain.constant = screenHeight * KlogoViewFinalHeight;
- [UIView animateWithDuration:2
- animations:^{
- [self.view layoutIfNeeded];
- }];
- }
- -(void)lostPasswordTapped:(UIGestureRecognizer*) gesture{
- [[BTCustomTokenManager sharedManager] nukeCustomToken];
- [self setupUIForRegisterToken];
- self.isLogin = NO;
- }
- -(void)setupUIForRegisterToken{
- [self.userIDTextField initCustomTextFieldWithLabel:NSLocalizedString(@"login_user_id", nil)
- type:StringTextFieldType
- tooltip:nil
- andTheme:@"BTViewTheme"];
- [self.userIDTextField setRules: @[[[BTValidator alloc] initWithType:TextFieldValidationTypeRequired
- andErrorText:NSLocalizedString(@"login_user_id_missing", nil)]]];
- [self.passwordToken initCustomTextFieldWithLabel:NSLocalizedString(@"login_passwordToken", nil)
- type:PasswordFieldType
- tooltip:nil
- andTheme:@"BTViewTheme"];
- [self.passwordToken setRules: @[[[BTValidator alloc] initWithType:TextFieldValidationTypeRequired
- andErrorText:NSLocalizedString(@"login_passwordToken_empty", nil)]]];
- [self.actionButton setLocalizedText:NSLocalizedString(@"login_next", nil)];
- self.mobilePassword.hidden = YES;
- self.forgetPassword.hidden = YES;
- self.passwordToken.hidden = NO;
- self.userIDTextField.hidden = NO;
- self.biomericImage.hidden = YES;
- }
- -(void)setupUIForLogin{
- [self.mobilePassword initCustomTextFieldWithLabel:NSLocalizedString(@"login_pin", nil)
- type:PasswordFieldType
- tooltip:nil
- andTheme:@"BTViewTheme"];
- [self.mobilePassword setRules: @[[[BTValidator alloc] initWithType:TextFieldValidationTypeRequired
- andErrorText:NSLocalizedString(@"login_pin_empty", nil)],
- [[BTValidator alloc] initWithType:InputRegexValidation
- andRegexPattern:kPINRegex
- andErrorText:NSLocalizedString(@"pin_generic_error_info", nil)]]];
- [self.actionButton setLocalizedText:NSLocalizedString(@"login_button_enter", nil)];
- self.userIDTextField.hidden = YES;
- self.passwordToken.hidden = YES;
- self.mobilePassword.hidden = NO;
- self.forgetPassword.hidden = NO;
- self.biometricSugestionView.hidden = YES;
- //first Verify activeBiometrics
- if(![BTBiometricHelper isBiometricActiveOnSystem]){
- [[BTCustomTokenManager sharedManager] nukeBiometricToken];
- self.biometricSugestionView.hidden = NO;
- BTBiometricType biometricType = [BTBiometricHelper verifyBiometricTypeEvenNotEnrrolled];
- switch (biometricType) {
- case BTFaceID:
- self.biometricTypeSugestionImage.image = [UIImage imageNamed:@"face_id"];
- self.biometricSugestionLabel.text = NSLocalizedString(@"mobile_login_suggestion_faceID", nil);
- break;
- case BTTouchID:
- self.biometricTypeSugestionImage.image = [UIImage imageNamed:@"touch_id"];
- self.biometricSugestionLabel.text = NSLocalizedString(@"mobile_login_suggestion_touchID", nil);
- break;
- default:
- self.biometricSugestionView.hidden = YES;
- break;
- }
- }
- if([[BTCustomTokenManager sharedManager] isBiometricTokenActive]){
- //verify biometric type
- BTBiometricType biometricType = [BTBiometricHelper verifyBiometricType];
- switch (biometricType) {
- case BTFaceID:
- self.biomericImage.image = [UIImage imageNamed:@"face_id"];
- break;
- case BTTouchID:
- self.biomericImage.image = [UIImage imageNamed:@"touch_id"];
- break;
- default:
- self.biomericImage.hidden = YES;
- break;
- }
- self.biomericImage.hidden = NO;
- UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapedBiometric:)];
- [self.biomericImage addGestureRecognizer:tapGestureRecognizer];
- self.biomericImage.userInteractionEnabled = YES;
- //open the Biometric popUp
- [BTBiometricHelper doBiometricAuthWithResult:^(BOOL result) {
- dispatch_async(dispatch_get_main_queue(), ^{
- if(result){
- [self executeBiomtricLogin];
- }
- });
- }];
- }else{
- self.biomericImage.hidden = YES;
- }
- }
- -(void)tapedBiometric:(UITapGestureRecognizer *)sender {
- [BTBiometricHelper doBiometricAuthWithResult:^(BOOL result) {
- dispatch_async(dispatch_get_main_queue(), ^{
- if(result){
- [self executeBiomtricLogin];
- }
- });
- }];
- }
- -(void)executeBiomtricLogin{
- EBKLoginViewModelInput* loginInput = [EBKLoginViewModelInput new];
- EBKCredentialItem* credentialItem = [EBKCredentialItem new];
- NSMutableArray* credentialsArray = [NSMutableArray new];
- credentialItem.password = [[BTCustomTokenManager sharedManager] getTokenFromBiometric];
- credentialItem.otherLoginType = @(mobileTokenAccessCodeTypeID);
- [credentialsArray addObject:credentialItem];
- loginInput.loginType = OtherLogin;
- loginInput.username = [EBKKeyChainManager getUserAlias];
- loginInput.credentialsList = credentialsArray;
- [self.genericLoading startLoading];
- self.loginVM.loginInput = loginInput;
- }
- - (IBAction)nextButtonClick:(id)sender {
- [self.view endEditing:YES];
- if(!self.isLogin){
- //validate userID and password Token
- BOOL valid = [self.userIDTextField validate] && [self.passwordToken validate];
- if(valid){
- [self.mobileLoginVM callGetAliasAvailableCredentialsWithAliasValue:self.userIDTextField.textUnformated];
- [self.genericLoading startLoading];
- }
- }else{
- if([self.mobilePassword validate]){
- [self.mobileLoginVM callGetAliasAvailableCredentialsWithAliasValue:[EBKKeyChainManager getUserAlias]];
- [self.genericLoading startLoading];
- }
- }
- }
- -(void)callMobileLogin{
- EBKLoginViewModelInput* loginInput = [EBKLoginViewModelInput new];
- EBKCredentialItem* credentialItem = [EBKCredentialItem new];
- NSMutableArray* credentialsArray = [NSMutableArray new];
- credentialItem.password = [[BTCustomTokenManager sharedManager] getCurrentTokenWithPassword:self.mobilePassword.textUnformated];
- credentialItem.otherLoginType = @(mobileTokenAccessCodeTypeID);
- [credentialsArray addObject:credentialItem];
- loginInput.loginType = OtherLogin;
- loginInput.username = [EBKKeyChainManager getUserAlias];
- loginInput.credentialsList = credentialsArray;
- [self.genericLoading startLoading];
- self.loginVM.loginInput = loginInput;
- }
- - (void)groupCredentialsDidChange:(BTMobileLoginViewModel *)viewModel {
- //Verify both Primary credentials and level 1
- NSMutableArray* availableLevel1LoginCredentials = [NSMutableArray new];
- NSMutableArray* availableLevel2LoginCredentials = [NSMutableArray new];
- NSMutableArray* uniqueLevel1Credentials = [NSMutableArray new];
- NSMutableArray* uniqueLevel2Credentials = [NSMutableArray new];
- self.hasTwoFactor = NO;
- for(GroupCredentials* groupCredentials in viewModel.groupCredentials){
- NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF.isPrimary == 1 && SELF.level == 1"];
- NSArray* primaryCredentialsArray = [groupCredentials.listCredentials filteredArrayUsingPredicate:predicate];
- if(primaryCredentialsArray.count){
- NSMutableArray* tempArray = [NSMutableArray new];
- for(ListCredentials* credentials in primaryCredentialsArray){
- NSArray* uniqueAccessCodeTypes = [tempArray valueForKey:@"accessCodeTypeId"];
- if(!uniqueAccessCodeTypes.count){
- [tempArray addObject:credentials];
- [uniqueLevel1Credentials addObject:credentials.accessCodeTypeId];
- }else if(![uniqueAccessCodeTypes containsObject:credentials.accessCodeTypeId]){
- [tempArray addObject:credentials];
- [uniqueLevel1Credentials addObject:credentials.accessCodeTypeId];
- }
- }
- [availableLevel1LoginCredentials addObject:tempArray];
- }
- NSPredicate * predicateTwoLevel = [NSPredicate predicateWithFormat:@"SELF.isPrimary == 1 && SELF.level == 2"];
- NSArray* twoFActorCredentialsArray = [groupCredentials.listCredentials filteredArrayUsingPredicate:predicateTwoLevel];
- if(twoFActorCredentialsArray.count){
- NSMutableArray* tempArray = [NSMutableArray new];
- for(ListCredentials* credentials in twoFActorCredentialsArray){
- NSArray* uniqueAccessCodeTypes = [tempArray valueForKey:@"accessCodeTypeId"];
- if(!uniqueAccessCodeTypes.count){
- [tempArray addObject:credentials];
- [uniqueLevel2Credentials addObject:credentials.accessCodeTypeId];
- }else if(![uniqueAccessCodeTypes containsObject:credentials.accessCodeTypeId]){
- [tempArray addObject:credentials];
- [uniqueLevel2Credentials addObject:credentials.accessCodeTypeId];
- }
- }
- [availableLevel2LoginCredentials addObject:tempArray];
- }
- }
- /* This Logic makes not a lot o sense, however in BT the user either have password(dev phase only), password+SMS or Vasco we need to detect this and redirect a login to that credentials, so I will look for
- - "AccessCodeTypeId": 1, password
- - "AccessCodeTypeId": 36, vasco
- After this look for second level credentials we will force SMS only
- */
- //is password?
- BOOL hasPassword = [uniqueLevel1Credentials containsObject:@(passwordAccessCodeTypeID)];
- self.hasTwoFactor = [uniqueLevel2Credentials containsObject:@(SMSAccessCodeTypeID)];
- BOOL hasVasco = [uniqueLevel1Credentials containsObject:@(vascoAccessCodeTypeID)];
- [self.genericLoading stopLoading];
- if (self.isLogin) {
- [self callMobileLogin];
- }else{
- if(hasVasco){
- [self loginWithAccesCodeTypeID:@(vascoAccessCodeTypeID)];
- }else if(hasPassword){
- [self loginWithAccesCodeTypeID:@(passwordAccessCodeTypeID)];
- }else{
- //Error no credentials for this user
- [self.topAlertView showMessageWithText:NSLocalizedString(@"login_error_registration", @"")
- andType:BTErrorAlertType];
- }
- }
- NSLog(@"Credentials type validation finish ...");
- }
- -(void)loginWithAccesCodeTypeID:(NSNumber*)accesCodeTypeID{
- EBKLoginViewModelInput* loginInput = [EBKLoginViewModelInput new];
- EBKCredentialItem* credentialItem = [EBKCredentialItem new];
- NSMutableArray* credentialsArray = [NSMutableArray new];
- credentialItem.password = self.passwordToken.textUnformated;
- credentialItem.otherLoginType = accesCodeTypeID;
- [credentialsArray addObject:credentialItem];
- loginInput.loginType = OtherLogin;
- loginInput.username = self.userIDTextField.textUnformated;
- loginInput.credentialsList = credentialsArray;
- [self.genericLoading startLoading];
- self.loginVM.loginInput = loginInput;
- }
- - (void)getAliasAvailableCredentialsErrorDidChange:(BTMobileLoginViewModel *)viewModel {
- [self.genericLoading stopLoading];
- [self handleError:viewModel.getAliasAvailableCredentialsError
- withType:BTTopErrorView
- andId:0];
- }
- #pragma mark - login methods
- - (void)loginOutputDidChange:(EBKLoginViewModel *)viewModel {
- if(self.isLogin){
- [self handleLoginSuccessWithOutput:viewModel.loginOutput];
- }else{
- [self.genericLoading stopLoading];
- if(self.hasTwoFactor){
- //navigate to two factor
- UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
- BTMobileLoginLevel2CredentialsViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"BTMobileLoginLevel2CredentialsViewController"];
- [self.navigationController pushViewController:controller animated:YES];
- }else{
- //navigate to register token
- UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
- BTMobileLoginRegisterTokenViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"BTMobileLoginRegisterTokenViewController"];
- [self.navigationController pushViewController:controller animated:YES];
- }
- }
- }
- - (void)loginErrorDidChange:(EBKLoginViewModel *)viewModel {
- [self.genericLoading forceStopLoading];
- [self handleError:viewModel.loginError
- withType:BTTopErrorView
- andId:1];
- }
- - (void)handleLoginSuccessWithOutput:(LoginServiceOutput *)loginOutput {
- ApplicationPage *pageToNavigate;
- CustomerFavorite *favourite;
- NSDictionary *otherData;
- if ([[ShortcutEventHandler sharedHandler] shortcutAfterLogin]) {
- pageToNavigate = [[ShortcutEventHandler sharedHandler] shortcutAfterLogin].page;
- favourite = [ShortcutEventHandler sharedHandler].shortcutAfterLogin.favourite;
- otherData = [ShortcutEventHandler sharedHandler].shortcutAfterLogin.data;
- } else {
- pageToNavigate = [[ApplicationPagesManager sharedManager] tabController];
- }
- if (loginOutput.userProfiles.count == 1) {
- [self callSelectProfileServicesWithProfile:loginOutput.userProfiles.firstObject];
- [self.genericLoading stopLoading];
- } else if (loginOutput.userProfiles.count > 1 && !self.selectedProfile) {
- [self.genericLoading stopLoading];
- ApplicationPage *profileSelectionPage = [[ApplicationPagesManager sharedManager] contractProfileSelectionPage];
- UIStoryboard *storyboard = [UIStoryboard storyboardWithName:profileSelectionPage.storyboardName bundle:nil];
- ContractProfileSelectionViewController *vc = [storyboard instantiateViewControllerWithIdentifier:[ContractProfileSelectionViewController classString]];
- vc.delegate = self;
- vc.userProfiles = loginOutput.userProfiles;
- [self.profileSelectionViewModel addDelegateClass:vc];
- [self addCustomPushAnimationToViewController:vc];
- [self.genericLoading forceStopLoading];
- [self.navigationController pushViewController:vc animated:NO];
- } else {
- NSLog(@"NO PROFILE (SHOULD BE HANDLED BY MW)");
- }
- }
- - (void)callSelectProfileServicesWithProfile:(UserProfile *)selectedProfile {
- [self.genericLoading startLoading];
- EBKProfileSelectionViewModelInput *input = [EBKProfileSelectionViewModelInput new];
- input.profileToSelect = selectedProfile;
- [[SessionInfo sharedManager] setSelectProfileWith:selectedProfile];
- self.profileSelectionViewModel.profileSelectionInput = input;
- }
- - (void)profileSelectionOutputDidChange:(EBKProfileSelectionViewModel *)viewModel {
- self.profileSelectionViewModel = viewModel;
- [self initCustomerDetails];
- // [self handleProfileSelectionWithVM:self.profileSelectionViewModel];
- }
- -(void)initCustomerDetails{
- CustomerDetailsServiceInput* input = [[CustomerDetailsServiceInput alloc] init];
- input.alias = [EBKUserInfo getCustomerId];
- self.customerVM.customerDetailsInput = input;
- }
- -(void)customerDetailsOutputDidChange:(CustomerDetailsViewModel *)viewModel{
- [[BTCustomerDetailsManager sharedManager]initCustomerDetailsWithCustomerDetails:viewModel.customerDetailsOutput];
- [self handleProfileSelectionWithVM:self.profileSelectionViewModel];
- }
- -(void)handleProfileSelectionWithVM:(EBKProfileSelectionViewModel *)viewModel{
- [self.genericLoading stopLoading];
- self.selectedProfile = viewModel.profileSelectionInput.profileToSelect;
- [[SessionInfo sharedManager] setSelectProfileWith:self.selectedProfile];
- NSDictionary *colors = [Themes getThemeColors];
- [[EBKThemeManager sharedManager] loadWithColors:colors fonts:[Themes getFonts] buttons:[Themes getButtonsThemes] views:[Themes getViewsThemes]];
- [self handleLoginCompletion];
- }
- - (void)profileSelectionErrorDidChange:(EBKProfileSelectionViewModel *)viewModel{
- [self.genericLoading stopLoading];
- [self.customAlertView alertViewWithTitle:NSLocalizedString(@"error_generic_title", @"")
- andErrorText:viewModel.profileSelectionError.localizedDescription
- andButton1:NSLocalizedString(@"error_retry", nil)
- andButton2:NSLocalizedString(@"general_cancel", nil)
- andType:ErrorCustomAlertView
- andId:123];
- [self.customAlertView showAlertView];
- }
- - (void)handleLoginCompletion {
- [[ApplicationPagesManager sharedManager] configureManager];
- [[NSNotificationCenter defaultCenter] postNotificationName:kUpdateMenuNotification object:self];
- ApplicationPage *pageToNavigate;
- CustomerFavorite *favorite;
- NSDictionary *otherData;
- if ([[ShortcutEventHandler sharedHandler] shortcutAfterLogin]) {
- pageToNavigate = [[ShortcutEventHandler sharedHandler] shortcutAfterLogin].page;
- favorite = [ShortcutEventHandler sharedHandler].shortcutAfterLogin.favourite;
- otherData = [ShortcutEventHandler sharedHandler].shortcutAfterLogin.data;
- } else {
- pageToNavigate = [[ApplicationPagesManager sharedManager] tabController];
- }
- UIStoryboard *sb = [UIStoryboard storyboardWithName:pageToNavigate.storyboardName bundle:nil];
- BaseViewController *vc = [sb instantiateViewControllerWithIdentifier:pageToNavigate.pageId];
- AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
- [appDelegate.mainNavigationController setViewControllers:@[vc] animated:YES];
- // Clear page after logging in
- if ([[ShortcutEventHandler sharedHandler] shortcutAfterLogin]) {
- [ShortcutEventHandler sharedHandler].shortcutAfterLogin = nil;
- }
- [[NSNotificationCenter defaultCenter] postNotificationName:@"loginNotification" object:self];
- }
- -(void)customerDetailsErrorDidChange:(CustomerDetailsViewModel *)viewModel{
- [self.genericLoading stopLoading];
- [[NSNotificationCenter defaultCenter] postNotificationName:@"logoutNotification" object:self];
- }
- - (void)addCustomPushAnimationToViewController:(UIViewController *)viewController {
- CATransition* transition = [CATransition animation];
- transition.duration = 0.3;
- transition.type = kCATransitionPush;
- transition.subtype = [BTLanguageManager isCurrentLanguageRTL] ? kCATransitionFromLeft : kCATransitionFromRight;
- [viewController.view.layer addAnimation:transition forKey:kCATransition];
- }
- - (void)contractProfileSelectionViewController:(ContractProfileSelectionViewController *)viewController didSelectProfile:(UserProfile *)profile {
- [self callSelectProfileServicesWithProfile:profile];
- }
- - (void)dismissControls:(UITapGestureRecognizer *)sender {
- [self.view endEditing:YES];
- }
- - (IBAction)oldLogin:(id)sender {
- AppDelegate* appdelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
- [appdelegate setupOldLogin];
- //[self.mobileLoginVM getServerDate];
- }
- @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement