比來和別的一名同事擔任公司登錄和用戶中間模塊的開辟任務,開辟周期籌劃兩周,減去和產物和接口的調和時光,再減去因為原型圖和接口的成績,招致強制症糾結症狀多發,情感不穩固消耗的時光,能在兩周根本完成也算是個不小的事業了。本文就總結一下若何知足產物須要的情形下,高效開辟一個登錄注冊模塊。
1.應用繼續處理界面反復性功效。平日登錄注冊會有一個自力的設計,而模塊外部會有有類似的配景,類似的導航欄款式,類似前往和加入行動,類似的輸出框,按鈕款式等。
好比下面的的注冊和登錄模塊,就有雷同的前往按鈕,雷同的配景,雷同的導航欄款式,乃至雷同的按鈕和輸出框款式。所認為了加速我們的開辟,我們完整先界說一個父掌握器,然後經由過程的繼續完成多態,從而完成我們疾速設計頁面和根本功效的完成。下圖是我的小我項目《丁丁印記》的登錄注冊模塊的目次構造,個中HooEntryBaseViewController就界說了這個模塊通用的行動和款式:
2.彈出鍵盤和加入鍵盤機制開辟。
這點使我們開辟者輕易疏忽的一點,我也由於看到一些APP由於彈出鍵盤遮擋輸出,招致怒刪APP的行動。這模塊的設計就依據產物的設計來決議采取甚麼代碼完成我們的目標了。
•單擊空白區域加入鍵盤代碼:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithtarget:self action:@selector(closeKeyboard:)]; tap.numberOfTapsRequired = 1; tap.numberOfTouchesRequired = 1; [self.view addGestureRecognizer:tap]; - (void)closeKeyboard:(id)sender { [self.view endEditing:YES]; }
•防止鍵盤遮擋,登錄表單或按鈕上移代碼:
- (void)textViewDidBeginEditing:(UITextField *)textView { CGRect frame = textView.frame; int offset = frame.origin.y + 120 - (self.view.frame.size.height - 216.0);//鍵盤高度216 NSTimeInterval animationDuration = 0.30f; [UIView beginAnimations:@"ResizeForKeyBoard" context:nil]; [UIView setAnimationDuration:animationDuration]; float width = self.view.frame.size.width; float height = self.view.frame.size.height; if(offset > 0) { CGRect rect = CGRectMake(0.0f, -offset,width,height); self.view.frame = rect; } [UIView commitAnimations]; }
3.接入第三方登錄,必需要斷定用戶能否裝置該第三方客戶端,不然蘋果能夠審核沒法經由過程。血的經驗。
好比我的APP《丁丁印記》接入了QQ登錄功效,法式會客戶端能否裝置了QQ,假如未裝置則隱蔽QQ登錄圖標。
if (![QQApi isQQInstalled]) { self.QQLoginButton.hidden = YES; self.QQLoginLabel.hidden = YES; }
4.特別情形處置。這輕易是一個空白點,平日年青的開辟的者不會斟酌到這一塊,而平日產物和UE也不太會記得界說清晰臨界點的行動。
• 加載狀況。當用戶提議登錄或許注冊要求時須要給用戶友愛的提醒。
#pragma mark - 登錄按鈕點擊 - (IBAction)login:(UIButton *)sender { if([self.userNameTextField.text isEmpty] || [self.passwordTextField.text isEmpty]){ [SVProgressHUD showErrorWithStatus:@"用戶名或暗碼不克不及為空"]; }else{ __weak typeof(self) weakSelf = self; [[HooUserManager manager] LoginWithUserName:self.userNameTextField.text andPassword:self.passwordTextField.text block:^(BmobUser *user, NSError *error) { __strong __typeof(weakSelf)strongSelf = weakSelf; if (error) { [SVProgressHUD showErrorWithStatus:@"登錄掉敗"]; }else if(user){ [SVProgressHUD showSuccessWithStatus:@"登錄勝利"]; [strongSelf loginSuccessDismiss]; } }]; } }
• 賬號或許暗碼各類毛病斷定
NSString *emailStr; NSString *phoneStr; NSString *passwordStr = weakSelf.passwordView.inputTextField.text; emailStr = weakSelf.accountView.inputTextField.text; if (![NSString validateEmail:emailStr] || !emailStr.length) { [weakSelf showErrorTipViewWithMessage:@"郵箱格局毛病"]; return; } } else { phoneStr = weakSelf.accountView.inputTextField.text; if (phoneStr.length < 5) { [weakSelf showErrorTipViewWithMessage:@"手機長度毛病")]; return; } if ([weakSelf.accountView.countryCode isEqualToString:@"+86"]) { if (![phoneStr isValidateMobileNumber]) { [weakSelf showErrorTipViewWithMessage:@"手機號碼格局毛病")]; return; } } } if (passwordStr.length < kPasswordMinLength) { [weakSelf showErrorTipViewWithMessage:ATLocalizedString(@"暗碼長度跨越少於6個字符")]; return; } if (passwordStr.length > kPasswordMaxLength) { [weakSelf showErrorTipViewWithMessage:@"暗碼長度跨越20個字符")]; return; }
5.手機找回暗碼,發送驗證碼按鈕的處置。這個行動也輕易被產物疏忽須要我們開辟者自動想到,然後跟產物肯定這個需求,然後肯定按鈕的觸發後的行動,不然用戶能夠屢次點擊發送驗證碼,這會形成辦事器累贅,而且能夠前往給用戶多條短信,形成困擾。上面這段代碼可以完成單擊驗證碼按鈕,然後倒計時2分鐘後恢復按鈕的可點擊狀況。
- (void)verifedCodeButtonWithTitle:(NSString *)title andNewTitle:(NSString *)newTitle { WS(weakSelf); __block int timeout = kTimeout; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); dispatch_source_set_event_handler(_timer, ^{ if(timeout<=0){ dispatch_source_cancel(_timer); dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf setTitle:title forState:UIControlStateNormal]; weakSelf.userInteractionEnabled = YES; }); }else{ int seconds = timeout; NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds]; dispatch_async(dispatch_get_main_queue(), ^{ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1]; [weakSelf setTitle:[NSString stringWithFormat:@"%@(%@)",newTitle,strTime] forState:UIControlStateNormal]; [UIView commitAnimations]; weakSelf.userInteractionEnabled = NO; }); timeout--; } }); dispatch_resume(_timer); }
5.用戶登錄信息和狀況耐久化。我們平日會有營業層處置登錄的數據的耐久,而且應用單例,然則不克不及依附單例記載用狀況,由於用戶能夠會加入,所以須要從沙盒去讀取用戶狀況的字段能否存在,如用戶的ID,或許AccessToken。
上面這段代碼,用來耐久化用戶信息
-
(void)saveUserInfoWithData:(NSDictionary *)dict { NSString *userID = dict[kUserId]; NSString *email = dict[kEmail]; NSString *mobile = dict[kMobile]; [HooNSUserDefaultSerialzer setObject:memberID forKey:kUserID]; [HooNSUserDefaultSerialzer setObject:email forKey:kEmail]; [HooNSUserDefaultSerialzer setObject:mobile forKey:kMobile]; }
5.對外開辟用戶信息的接口。封裝我們的模塊。對外供給我們的接口,平日其他頁面須要斷定用戶能否登錄,也能夠須要用戶的獨一標示符來要求數據。這一塊假如我們做的凌亂,則輕易招致其他頁面獲得用戶信息的隨便性,好比給他們開辟了讀取沙盒裡讀取用戶信息的字段。我們應當在登錄模塊同一其他頁面獲得這些用戶信息的行動。
#import <Foundation/Foundation.h> #import "HooSingleton.h" @interface HooUserManager : NSObject @property (nonatomic, strong) NSString *userID; SingletonH(Manager) /** * Verify user if login or not * * @return if login in return YES ,otherwise return NO */ - (BOOL)isUserLogin; /** * login out */ - (void)loginOut; @end #import "HooUserManager.h" #import "HooNSUserDefaultSerialzer.h" static NSString * const kMobile = @"Mobile"; static NSString * const kEmail = @"Email"; static NSString * const kUserID = @"UserID"; @implementation HooUserManager SingletonM(Manager) #pragma mark - getter and setter - (NSString *)userID { NSString *userID = [HooNSUserDefaultSerialzer objectForKey:kUserID]; return userID; } - (BOOL)isUserLogin { NSString *userID = [HooNSUserDefaultSerialzer objectForKey:kUserID]; if (userID.length) { return YES; } return NO; } - (void)loginOut { [HooNSUserDefaultSerialzer removeObjectForKey:kMobile]; [HooNSUserDefaultSerialzer removeObjectForKey:kEmail]; [HooNSUserDefaultSerialzer removeObjectForKey:kUseID]; } @end
6.其他。
其實為了更好的用戶體驗,我們還會供給其他功效,如明文顯示暗碼選擇按鈕、從辦事器讀取郵箱格局提醒、毛病字符改正、固然還有最主要的動畫後果。
【IOS開辟用戶登錄注冊模塊所碰到的成績】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!