一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - IOS開發用戶登錄注冊模塊所遇到的問題

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

2021-01-05 12:21華過的痕跡 IOS

最近和另外一位同事負責公司登錄和用戶中心模塊的開發工作。通過本文給大家分享IOS開發用戶登錄注冊模塊所遇到的問題,感興趣的朋友一起學習吧

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

1.利用繼承解決界面重復性功能。通常登錄注冊會有一個獨立的設計,而模塊內部會有有相似的背景,相似的導航欄樣式,相似返回和退出行為,相似的輸入框,按鈕樣式等。

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

比如上面的的注冊和登錄模塊,就有相同的返回按鈕,相同的背景,相同的導航欄樣式,甚至相同的按鈕和輸入框樣式。所以為了加快我們的開發,我們完全先定義一個父控制器,然后通過的繼承實現多態,從而實現我們快速設計頁面和基本功能的實現。下圖是我的個人項目《丁丁印記》的登錄注冊模塊的目錄結構,其中hooentrybaseviewcontroller就定義了這個模塊通用的行為和樣式:

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

2.彈出鍵盤和退出鍵盤機制開發。

這點使我們開發者容易忽略的一點,我也因為看到一些app因為彈出鍵盤遮擋輸入,導致怒刪app的行為。這模塊的設計就根據產品的設計來決定采用什么代碼實現我們的目的了。

•單擊空白區域退出鍵盤代碼:

?
1
2
3
4
5
6
7
8
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];
}

•避免鍵盤遮擋,登錄表單或按鈕上移代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (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登錄圖標。

?
1
2
3
4
if (![qqapi isqqinstalled]) {
self.qqloginbutton.hidden = yes;
self.qqloginlabel.hidden = yes;
}

4.特殊情景處理。這容易是一個空白點,通常年輕的開發的者不會考慮到這一塊,而通常產品和ue也不太會記得定義清楚臨界點的行為。

•  加載狀態。當用戶發起登錄或者注冊請求時需要給用戶友好的提示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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];
}
}];
}
}

•  賬號或者密碼各種錯誤判斷

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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分鐘后恢復按鈕的可點擊狀態。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- (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。

  下面這段代碼,用來持久化用戶信息

-

?
1
2
3
4
5
6
7
8
(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.對外開發用戶信息的接口。封裝我們的模塊。對外提供我們的接口,通常其他頁面需要判斷用戶是否登錄,也可能需要用戶的唯一標示符來請求數據。這一塊如果我們做的混亂,則容易導致其他頁面獲取用戶信息的隨意性,比如給他們開發了讀取沙盒里讀取用戶信息的字段。我們應該在登錄模塊統一其他頁面獲取這些用戶信息的行為。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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.其他。

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

延伸 · 閱讀

精彩推薦
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5272021-01-16
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111302021-03-15
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
主站蜘蛛池模板: 韩日视频在线 | 天天干女人 | 亚洲欧美日韩国产精品一区 | 91精品婷婷国产综合久久8 | 污漫日本E同人 | crdy在线看亚洲 | 丝瓜视频成人在线观看 | 王雨纯 羞羞 | 99网站在线观看 | 亚洲区精品久久一区二区三区 | 饭冈加奈子乳喷cead144 | 美女主播免费观看 | free性俄罗斯护士 | 国产精品青青青高清在线密亚 | 国产麻豆精品原创 | 日韩欧美中文字幕一区二区三区 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 国产美女亚洲精品久久久综合91 | 91亚洲一区二区在线观看不卡 | 麻生希在线观看 | 干露露视频 性感写真 | 日本中文字幕一区二区三区不卡 | 婷婷丁香视频 | 国产区香蕉精品系列在线观看不卡 | 日韩一区二区三区精品 | 亚洲欧美日韩久久一区 | 亚洲六月丁香六月婷婷色伊人 | 国产成人黄网在线免 | meyd—447佐山爱在线 | 国产福利在线免费观看 | 色老板免费在线观看 | 国产乱人乱精一区二区视频密 | 四虎影视永久免费视频观看 | 114级毛片免费观看 1024亚洲天堂 | 精品国产自在现线拍国语 | 色琪琪久久草在线视频 | 久久中文字幕亚洲精品最新 | 欧美在线观看网址 | 91视频一区 | 鬼吹灯天星术在线高清观看 | 石原莉奈adn093店长未婚妻 |