我們開發(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的類目里面傻谁,有點不是很合理孝治。但如果分散了其他代碼里面,又很惡心审磁。多以索性就一起放在這個類目里面谈飒。用起來挺爽噠。
讓我們一起來消滅重復(fù)沒有營養(yǎng)的代碼吧0.0
代碼下載-- github地址:https://github.com/dongqihouse/VerificationCode.git