iOS開發(fā)--搞定煩躁的驗證碼

我們開發(fā)的愛啪啪里面幾乎都有登陸注冊系統(tǒng),這時候就少不了驗證碼的發(fā)揮了。每次都得寫這些重復(fù)的代碼勾怒,沒有營養(yǎng)又不得不寫。今天下班時間声旺,將驗證碼這一功能封裝一下笔链。
準備:Mob -- SDK
我們公司采用的短信驗證系統(tǒng)時候Mob的SDK。
所以下面代碼出現(xiàn)的網(wǎng)絡(luò)請求都是Mob SDK 中的方法腮猖。
首先看下Mob 給的代碼示例:

/**
 *  @from                    v1.1.1
 *  @brief                   獲取驗證碼(Get verification code)
 *
 *  @param method            獲取驗證碼的方法(The method of getting verificationCode)
 *  @param phoneNumber       電話號碼(The phone number)
 *  @param zone              區(qū)域號鉴扫,不要加"+"號(Area code)
 *  @param customIdentifier  自定義短信模板標識 該標識需從官網(wǎng)http://www.mob.com上申請,審核通過后獲得澈缺。(Custom model of SMS.  The identifier can get it  from http://www.mob.com  when the application had approved)
 *  @param result            請求結(jié)果回調(diào)(Results of the request)
 */

[SMSSDK getVerificationCodeByMethod:SMSGetCodeMethodSMS phoneNumber:@"159****1689"
                                                               zone:@"86"
                                                   customIdentifier:nil
                                                             result:^(NSError *error){
       if (!error) {
            NSLog(@"獲取驗證碼成功");
        } else {
            NSLog(@"錯誤信息:%@",error);
        }];




[SMSSDK commitVerificationCode:self.verifyCodeField.text phoneNumber:_phone zone:_areaCode result:^(NSError *error) {
 
            if (!error) {
                NSLog(@"驗證成功");
            }
            else
            {
                NSLog(@"錯誤信息:%@",error);
            }
        }];

好了幔妨,準備活動做完了,我們來理一理這個驗證碼怎么做谍椅。

準備的類:UIButton NSTimer
其實實現(xiàn)這個功能有很多方法,思路也是很清楚
在用戶 按下 獲取驗證碼的時候古话,令button 的title 倒計時改變(NSTimer)并令button userInteractionEnabled = NO 當計時結(jié)束的時候 釋放計時器雏吭,并且button的title改成原本的樣子和userInteractionEnabled = YES
實現(xiàn)起來很簡單。
不過我們怎么封裝這個驗證碼的方法呢陪踩。
1.自定義button類
2.使用button的Category 來實現(xiàn)封裝這個功能杖们。(樓主 采用這種方法)
雖然在button 的 結(jié)構(gòu)里搞了一些網(wǎng)絡(luò)請求,有點不合理肩狂。但整體上摘完,實際效果是不錯的。

我們來看下具體的操作
h文件

#import <UIKit/UIKit.h>

typedef void(^handelBlock)(NSError *error);
@interface UIButton (VerificationCode)

//獲取驗證碼
- (void)getCode:(NSString *)phone
          block:(handelBlock)block;
//驗證驗證碼
- (void)VerificationCode:(NSString *)phone
                    Code:(NSString *)code
                   block:(handelBlock)block;
@end

m文件

#import "UIButton+VerificationCode.h"
#import <SMS_SDK/SMSSDK.h>
#import <objc/runtime.h>

const NSString *beginTimeKey;
const NSString *timerKey;
@implementation UIButton (VerificationCode)

#pragma mark --  public
//獲取驗證碼
- (void)getCode:(NSString *)phone
          block:(handelBlock)block {
    self.userInteractionEnabled = NO;
    [SMSSDK getVerificationCodeByMethod:SMSGetCodeMethodSMS phoneNumber:phone zone:@"86" customIdentifier:nil result:^(NSError *error) {
        block(error);
    }];
    [self configureTimer];
     
}
//驗證驗證碼
- (void)VerificationCode:(NSString *)phone
                    Code:(NSString *)code
                   block:(handelBlock)block {
    [SMSSDK commitVerificationCode:code  phoneNumber:phone zone:@"86" result:^(NSError *error) {
        block(error);
    }];

}

#pragma mark 計時器
- (void)configureTimer {
    NSInteger beginTime = 60;

    NSTimer *timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeClock) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    [self setTimer:timer];
    [self setBeginTime:beginTime];

}
- (void)timeClock {
    [self setBeginTime:([self beginTime]-1)];
    NSInteger beginTime = [self beginTime];
    NSTimer *timer = [self timer];
    if (beginTime == 0) {
        [timer invalidate];
        self.userInteractionEnabled = YES;
        [self setTitle:@"獲取驗證碼" forState:UIControlStateNormal];

    }else {
        self.userInteractionEnabled = NO;
        [self setTitle:[NSString stringWithFormat:@"%lds",(long)beginTime] forState:UIControlStateNormal];
    }
    
    
}
#pragma mark -- set get
- (NSInteger)beginTime {
    return [objc_getAssociatedObject(self, &beginTimeKey) integerValue];
}
- (void)setBeginTime:(NSInteger)beginTime {
    objc_setAssociatedObject(self, &beginTimeKey, @(beginTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSTimer *)timer {
    return objc_getAssociatedObject(self, &timerKey);
}
- (void)setTimer:(NSTimer *)timer {
     objc_setAssociatedObject(self, &timerKey, timer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

這邊驗證驗證碼的方法放在button的類目里面傻谁,有點不是很合理孝治。但如果分散了其他代碼里面,又很惡心审磁。多以索性就一起放在這個類目里面谈飒。用起來挺爽噠。

222.gif

讓我們一起來消滅重復(fù)沒有營養(yǎng)的代碼吧0.0

代碼下載-- github地址:https://github.com/dongqihouse/VerificationCode.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末态蒂,一起剝皮案震驚了整個濱河市杭措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钾恢,老刑警劉巖手素,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸳址,死亡現(xiàn)場離奇詭異,居然都是意外死亡泉懦,警方通過查閱死者的電腦和手機稿黍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祠斧,“玉大人闻察,你說我怎么就攤上這事∽练妫” “怎么了辕漂?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吴超。 經(jīng)常有香客問我钉嘹,道長,這世上最難降的妖魔是什么鲸阻? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任跋涣,我火速辦了婚禮,結(jié)果婚禮上鸟悴,老公的妹妹穿的比我還像新娘陈辱。我一直安慰自己,他們只是感情好细诸,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布沛贪。 她就那樣靜靜地躺著,像睡著了一般震贵。 火紅的嫁衣襯著肌膚如雪利赋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天猩系,我揣著相機與錄音媚送,去河邊找鬼。 笑死寇甸,一個胖子當著我的面吹牛塘偎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拿霉,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼式塌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了友浸?” 一聲冷哼從身側(cè)響起峰尝,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎收恢,沒想到半個月后武学,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祭往,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年火窒,在試婚紗的時候發(fā)現(xiàn)自己被綠了硼补。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡熏矿,死狀恐怖已骇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情票编,我是刑警寧澤褪储,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站慧域,受9級特大地震影響鲤竹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昔榴,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一辛藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧互订,春花似錦吱肌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坟瓢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犹撒,已是汗流浹背折联。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留识颊,地道東北人诚镰。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像祥款,于是被迫代替她去往敵國和親清笨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評論 25 707
  • 謹以此文刃跛,獻給天下已經(jīng)遠行的父親 你們在比遠方更遠的地方抠艾,是否依然安好 又是父親節(jié),總有一些孩子如我桨昙,驚覺父親已孑...
    風(fēng)雨俠客閱讀 384評論 2 2
  • 對音樂無熱愛检号,平時也聽聽流行歌曲和那些說不上來節(jié)奏的所謂搖滾腌歉,而對于外文流行歌曲更是只聽名字,無奈心聽第二遍齐苛,在英...
    DDM兜兜麥閱讀 172評論 0 0
  • 美國華盛頓郵報最近評選出十大奢侈品:竟然無一與物質(zhì)有關(guān)翘盖。 1.生命的覺悟。 2.一顆自由凹蜂,喜悅與充滿愛的心馍驯。 3....
    奢奢閱讀 327評論 0 0