亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS開發用戶登錄注冊模塊所遇到的問題

2020-07-26 03:29:10
字體:
來源:轉載
供稿:網友

最近和另外一位同事負責公司登錄和用戶中心模塊的開發工作,開發周期計劃兩周,減去和產品和接口的協調時間,再減去由于原型圖和接口的問題,導致強迫癥糾結癥狀高發,情緒不穩定耗費的時間,能在兩周基本完成也算是個不小的奇跡了。本文就總結一下如何滿足產品需要的情況下,高效開發一個登錄注冊模塊。

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);//鍵盤高度216NSTimeInterval 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 HooUserManagerSingletonM(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.其他。

  其實為了更好的用戶體驗,我們還會提供其他功能,如明文顯示密碼選擇按鈕、從服務器讀取郵箱格式提示、錯誤字符糾正、當然還有最重要的動畫效果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲精品小早川怜子66| 97久久精品人人澡人人爽缅北| 欧美极品美女电影一区| 国产97在线播放| 丝袜美腿精品国产二区| 亚洲综合中文字幕在线观看| 国产精品成人在线| 亚洲老头老太hd| 亚洲国产另类 国产精品国产免费| 一区二区欧美激情| 狠狠干狠狠久久| 国产成人精品一区| 欧美亚洲午夜视频在线观看| 91精品视频在线播放| 欧美成人一区在线| 亚洲精品美女久久久| 亚洲日本成人网| 国产+成+人+亚洲欧洲| 国产日韩精品一区二区| 国产精品成人国产乱一区| 欧美在线一级视频| 亚洲综合av影视| 欧美亚洲另类视频| 91国产一区在线| 欧美性理论片在线观看片免费| 97免费视频在线播放| 亚洲iv一区二区三区| 国产精品久久久久9999| 日韩欧美国产黄色| 欧美日韩成人精品| xxxx欧美18另类的高清| 欧美最猛性xxxxx免费| 国产精品亚洲视频在线观看| 日韩精品中文字| 久久精品国产91精品亚洲| 欧美华人在线视频| 国产精品入口免费视频一| 中文综合在线观看| 中文字幕日韩欧美在线视频| 97婷婷大伊香蕉精品视频| 亚洲人成网站色ww在线| 日韩av在线免费观看| 欧美极度另类性三渗透| 美女久久久久久久久久久| 欧美性jizz18性欧美| 精品国产一区二区三区四区在线观看| 黑人极品videos精品欧美裸| 91在线精品播放| 亚洲成人久久久久| 久久久av一区| 久久久亚洲国产天美传媒修理工| 国产欧美日韩专区发布| 亚洲欧美日韩天堂一区二区| 亚洲欧美日韩中文视频| 国产91免费观看| 国产在线精品自拍| 日韩美女主播视频| 91爱爱小视频k| 国内揄拍国内精品| 亚洲va电影大全| 欧美成人合集magnet| 欧美在线一级va免费观看| 欧洲亚洲女同hd| 色七七影院综合| 91在线视频导航| 成人网欧美在线视频| 国产在线精品成人一区二区三区| 亚洲激情 国产| 最近2019年好看中文字幕视频| 久久精品视频播放| 日韩免费在线视频| 国产欧美va欧美va香蕉在| 色综合视频网站| 国产精品视频xxx| 国产精品成人一区二区三区吃奶| 欧美日韩成人精品| 日韩亚洲欧美中文高清在线| 国产精品第三页| 精品爽片免费看久久| 欧美大成色www永久网站婷| 亚洲欧美日韩中文在线制服| 亚洲欧美日韩一区二区在线| 久久精品国产亚洲| 亚洲成人激情在线观看| 日韩av免费在线观看| 91亚洲国产精品| 国产日韩精品综合网站| 久久视频在线播放| 亚洲石原莉奈一区二区在线观看| 亚洲欧美国产日韩中文字幕| 国产精品白丝av嫩草影院| 国产精品久久99久久| 在线观看国产精品91| 久久精品国产亚洲精品2020| 尤物九九久久国产精品的特点| 亚洲国产成人久久| 国产精品一区二区电影| 亚洲国产免费av| 亚洲第一页在线| 久久久久久久久久亚洲| 日韩美女在线观看一区| 久久久女女女女999久久| 久久久999成人| 91综合免费在线| 97视频人免费观看| 国语自产精品视频在线看| 激情懂色av一区av二区av| 国产成人综合精品| 久久国产精彩视频| 欧美做受高潮1| 国产精品视频最多的网站| 久久69精品久久久久久国产越南| 国产成人精品久久亚洲高清不卡| 欧美性xxxxx极品娇小| 久久久女女女女999久久| 66m—66摸成人免费视频| 欧美激情videos| 亚洲偷欧美偷国内偷| 欧美裸体xxxx极品少妇| 国产精品免费在线免费| 国产欧美精品一区二区三区介绍| 亚洲一区精品电影| 久久久99免费视频| 成人97在线观看视频| 国产一区二区三区18| 蜜臀久久99精品久久久无需会员| 4k岛国日韩精品**专区| 国产97人人超碰caoprom| 2018日韩中文字幕| 欧洲成人免费aa| 日韩电影大全免费观看2023年上| 欧美一级视频在线观看| 亚洲国产精品国自产拍av秋霞| 欧美大片在线看免费观看| 欧美精品做受xxx性少妇| 欧美日韩色婷婷| 日韩欧美在线第一页| 国产精品影院在线观看| 九九久久国产精品| 日韩成人免费视频| 欧美日韩在线影院| 一区二区三区四区视频| 国产一级揄自揄精品视频| 日韩中文av在线| 国产成人鲁鲁免费视频a| 国产精品三级美女白浆呻吟| 亚洲精品xxxx| 日本精品一区二区三区在线播放视频| 成人av色在线观看| 欧美亚洲成人免费| 日韩av综合中文字幕| 欧美激情影音先锋| 亚洲午夜国产成人av电影男同| 欧美黑人一区二区三区| 国内精品免费午夜毛片| 亚洲黄色www| 日韩精品在线免费播放| 欧美日本中文字幕| 亚洲色图欧美制服丝袜另类第一页| 欧美性xxxxx| 久久久久久久久中文字幕| 538国产精品一区二区免费视频| 国产精品久久久久福利| 日本精品一区二区三区在线播放视频|