在項(xiàng)目中很多時(shí)候需要登錄注冊(cè)功能坤邪,手機(jī)發(fā)送驗(yàn)證碼,郵箱驗(yàn)證等功能罚缕,也有第三方登錄的功能艇纺,第三方登錄單獨(dú)放在一章來(lái)說(shuō)一下,這里先說(shuō)一下其他的功能邮弹。
我們選用的第三方工具是BMOB黔衡,其實(shí)也有MOB,友盟等可以實(shí)現(xiàn)腌乡,具體看這里盟劫。今天我們使用bmob給我們提供的SDK來(lái)完成這個(gè)功能。
要使用第三方有兩種辦法
下載官方的SDK導(dǎo)入工程与纽,然后導(dǎo)入我們要使用的frameworks框架
使用cocoa pods進(jìn)行導(dǎo)入捞高,如果有同學(xué)不會(huì)使用cocoapods 可以點(diǎn)擊這里,cocoa pods是個(gè)很好用的工具渣锦。
還有很重要一點(diǎn)硝岗,使用第三方的時(shí)候記得一定要在你的info里面添加App Transport Security Settings這樣一個(gè)鍵值,同時(shí)把它設(shè)置成字典袋毙,然后把里面的key換成Allow Arbitrary Loads型檀,然后把他的bool值設(shè)置成YES,不然你是無(wú)法請(qǐng)求獲取到網(wǎng)絡(luò)數(shù)據(jù)的听盖。有很多時(shí)候發(fā)現(xiàn)自己沒(méi)寫錯(cuò)胀溺,但是就是無(wú)法發(fā)送郵箱驗(yàn)證等,就是因?yàn)檫@個(gè)緣故
首先我們看一下官方文檔如何導(dǎo)入SDK皆看,如果有同學(xué)知道如何導(dǎo)入就可以跳過(guò)這一步仓坞。
- 首先注冊(cè)一個(gè)bmob的賬號(hào),然后創(chuàng)建一個(gè)應(yīng)用腰吟,名字可以起為你的項(xiàng)目名无埃。
- 然后點(diǎn)擊下載SDK,選擇iOS毛雇,下載完成之后返回你的項(xiàng)目嫉称。把里面的BmobSDK.framework拖到你的工程里面的工具文件夾內(nèi)。
- 接下來(lái)我們返回bmob看一下官方文檔介紹是如何使用BMOB的SDK的灵疮。
- 我們選擇iOS快速入門然后我們按照步驟來(lái)進(jìn)行操作织阅。
- 里面的Application ID是一個(gè)很重要的東西,他可以和你的工程進(jìn)行連接起來(lái)震捣,要記好它荔棉。
- 接下來(lái)要導(dǎo)入要使用到的系統(tǒng)框架
- 然后我們來(lái)添加要使用的庫(kù)闹炉,在官方文檔里寫的有我們需要引入哪些庫(kù)
Xcode更新之后dylib后綴的已經(jīng)更新后綴為tbd的文件格式了,所以不要因?yàn)榘l(fā)愁找錯(cuò)文件润樱,一定要導(dǎo)全才行剩胁,不然會(huì)有很多報(bào)紅。
-
最后一步祥国,在你應(yīng)用的APPdelegate里面導(dǎo)入#import <BmobSDK/Bmob.h>同時(shí)把你應(yīng)用的APPid拷貝進(jìn)來(lái)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; [self.window makeKeyAndVisible]; UINavigationController *nac = [[UINavigationController alloc]initWithRootViewController:[[RegisterViewController alloc]init]]; self.window.rootViewController = nac; [Bmob registerWithAppKey:@"你的APPid"]; return YES; }
http://docs.bmob.cn/ios/developdoc/index.html?menukey=develop_doc&key=develop_ios#index_(7%A1%06
好,我們導(dǎo)入完成之后就可以開(kāi)始使用第三方工具了晾腔,再次點(diǎn)擊
官方文檔好吧舌稀,這個(gè)傲嬌的鏈接后面有半個(gè)括號(hào)不讓我用鏈接,體諒一下灼擂。然后找到用戶管理壁查。
里面有注冊(cè)用戶的方法,它使用的類名是BmobUser剔应,可以點(diǎn)進(jìn)去看一下睡腿,因?yàn)槲臋n可能有的時(shí)候過(guò)時(shí)它使用了新的方法屬性來(lái)代替了這個(gè)屬性,我們這里直接拷貝
BmobUser *bUser = [[BmobUser alloc] init];
[bUser setUserName:@"小明"];
[bUser setPassword:@"123456"];
[bUser setObject:@18 forKey:@"age"];
[bUser signUpInBackgroundWithBlock:^ (BOOL isSuccessful, NSError *error){
if (isSuccessful){
NSLog(@"Sign up successfully");
} else {
NSLog(@"%@",error);
}
}];
我們運(yùn)行就可以直接創(chuàng)建了一個(gè)小明的用戶峻贮,密碼是123456席怪。當(dāng)然不能固定的創(chuàng)建,然后我們創(chuàng)建3個(gè)TextField纤控,一個(gè)是賬號(hào)挂捻,一個(gè)是密碼,一個(gè)是郵箱船万,來(lái)獲取注冊(cè)人的3個(gè)信息刻撒,要設(shè)置郵箱的時(shí)候記得進(jìn)入你的應(yīng)用里面,打開(kāi)郵箱驗(yàn)證耿导,才能實(shí)現(xiàn)声怔。
好,我們把上面那些代碼給刪掉舱呻,沒(méi)用的東西醋火,然后進(jìn)入你的注冊(cè)頁(yè)面
BmobUser *bUser = [[BmobUser alloc] init];
bUser.username = self.UserNumber.text;
bUser.email = self.Email.text;
[bUser setPassword:self.passworld.text];
[bUser signUpInBackgroundWithBlock:^ (BOOL isSuccessful, NSError *error){
if (isSuccessful){
NSLog(@"注冊(cè)成功");
} else {
NSLog(@"注冊(cè)失敗可能有重復(fù)用戶,錯(cuò)誤信息:%@",error);
}
}];
通過(guò)這三個(gè)方法來(lái)設(shè)置用戶的賬號(hào)名箱吕,密碼名胎撇,郵箱,我的三個(gè)TextField設(shè)置的都是屬性殖氏,我們來(lái)做一個(gè)簡(jiǎn)單的判斷晚树,比如輸入的值不能為空,然后如果注冊(cè)成功雅采,就寫一個(gè)Alert提示框來(lái)提示一下用戶注冊(cè)成功爵憎,如果注冊(cè)失敗慨亲,就提示一下可能有重復(fù)用戶等,如果想要賬號(hào)的一些格式宝鼓,都可以對(duì)對(duì)應(yīng)的TextField的格式進(jìn)行判斷刑棵。注冊(cè)成功,提示請(qǐng)到郵箱進(jìn)行驗(yàn)證愚铡,然后返回登錄蛉签。
然后是登錄頁(yè)面,登錄頁(yè)面其實(shí)只有一句方法沥寥,其他都是一些做的判斷
[BmobUser loginWithUsernameInBackground:self.UserNumber.text password:self.passworld.text block:^(BmobUser *user, NSError *error) {
//登陸后返回的用戶信息
NSLog(@"%@",user.email);
if (user!=nil) {
NSLog(@"登陸成功");
//跳轉(zhuǎn)控制器
}else{
NSLog(@"沒(méi)有該用戶");
}
}
如果遺忘了密碼碍舍,來(lái)進(jìn)行找回密碼操作,這里我們直接在設(shè)置一個(gè)找回密碼的控制器邑雅。
在這里我們?cè)O(shè)置兩個(gè)TextField片橡,分別是用戶名和郵箱名。來(lái)進(jìn)行審核淮野,如果審核通過(guò)捧书,bmob會(huì)給他的郵箱發(fā)一封郵件,讓它重置密碼骤星,如果審核不通過(guò)经瓷,就提示錯(cuò)誤。
- (void)backPass
{
//獲得到當(dāng)前用戶
BmobUser *bUser = [BmobUser getCurrentUser];
//確認(rèn)賬號(hào)名正確
bUser.username = self.UserNumber.text;
if (bUser) {
//進(jìn)行操作
//bmob中重置密碼的方法
[BmobUser requestPasswordResetInBackgroundWithEmail:self.email.text];
[BmobUser requestPasswordResetInBackgroundWithEmail:bUser.email];
UIAlertController *alertcontroller = [UIAlertController alertControllerWithTitle:@"提示" message:@"請(qǐng)進(jìn)入郵箱驗(yàn)證" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alert = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[self presentViewController:alertcontroller animated:YES completion:^{
}];
[alertcontroller addAction:alert];
}else{
//對(duì)象為空時(shí)洞难,可打開(kāi)用戶注冊(cè)界面
UIAlertController *alertcontroller = [UIAlertController alertControllerWithTitle:@"提示" message:@"賬號(hào)或郵箱不正確" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alert = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[self presentViewController:alertcontroller animated:YES completion:^{
}];
[alertcontroller addAction:alert];
}
}
然后可以看到bmob已經(jīng)給你發(fā)送了一封郵件
點(diǎn)開(kāi)就可以重設(shè)密碼了嚎。
然后我們看一下BMOB是如何給手機(jī)發(fā)短信,進(jìn)行驗(yàn)證碼驗(yàn)證的廊营。
好歪泳,讓我們?cè)俅未蜷_(kāi)官方文檔,點(diǎn)擊短信服務(wù)露筒。
首先呐伞,他告訴我們,如果你要使用短信服務(wù)的時(shí)候慎式,請(qǐng)點(diǎn)擊你的應(yīng)用伶氢,然后在短信里面設(shè)置一個(gè)短信的格式
設(shè)置好模板,我們返回繼續(xù)看文檔
-
里面有一個(gè)可以直接給用戶發(fā)短信的方法瘪吏,驗(yàn)證碼格式就是你在云端寫的一個(gè)模板癣防,要傳的參數(shù),就是你具體要發(fā)送給哪個(gè)手機(jī)用戶的字符串掌眠。好蕾盯,我們就先試試能不能發(fā)短信。
UITextField *field = [[UITextField alloc]initWithFrame:CGRectMake(100, 200, 200, 45)]; field.tag = 100; field.placeholder = @"請(qǐng)輸入手機(jī)號(hào)"; field.borderStyle = UITextBorderStyleRoundedRect; field.clearButtonMode = YES; [self.view addSubview:field]; UITextField *smsField = [[UITextField alloc]initWithFrame:CGRectMake(100, 350, 200, 45)]; smsField.placeholder = @"請(qǐng)輸入驗(yàn)證碼"; smsField.tag = 101; smsField.borderStyle =UITextBorderStyleRoundedRect; smsField.clearButtonMode = YES; smsField.hidden = YES; smsField.alpha = 0; [self.view addSubview:smsField];
在這里我們最好把這個(gè)發(fā)送方法放在一個(gè)按鈕的觸發(fā)方法里蓝丙,不然他沒(méi)辦法在輸入完成之后獲得這個(gè)電話號(hào)碼
我送你們個(gè)按鈕吧级遭。望拖。
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.backgroundColor = [UIColor colorWithRed:0.522 green:1.000 blue:0.846 alpha:1.000];
button.highlighted = YES;
[button setTitle:@"發(fā)送驗(yàn)證碼" forState:UIControlStateNormal];
button.frame = CGRectMake(100, 280, 100, 45);
[self.view addSubview:button];
[button addTarget:self action:@selector(request:) forControlEvents:UIControlEventTouchUpInside];
好,我們把發(fā)送短信的方法放進(jìn)去挫鸽。
- (void)request:(UIButton *)sender
{
UITextField *field = [self.view viewWithTag:100];
UITextField *smsField = [self.view viewWithTag:101];
//請(qǐng)求驗(yàn)證碼
[BmobSMS requestSMSCodeInBackgroundWithPhoneNumber:field.text andTemplate:@"你在BMOB里面設(shè)置的短信模板的名字" resultBlock:^(int number, NSError *error) {
if (error) {
NSLog(@"%@",error);
} else {
//獲得smsID
UIButton *button = [self.view viewWithTag:103];
[UIView animateWithDuration:1 animations:^{
button.hidden = NO;
smsField.hidden = NO;
button.alpha = 1;
smsField.alpha = 1;
} completion:^(BOOL finished) {
}];
}
}];
}
輸完手機(jī)號(hào)之后點(diǎn)擊確認(rèn)就可以給手機(jī)發(fā)送一條固定的短信说敏,內(nèi)容都是定義好的(不要發(fā)著玩,只有100條丢郊,后面要收費(fèi)的)盔沫。
如果輸入手機(jī)有誤,就提示手機(jī)號(hào)不存在枫匾。
那接下來(lái)我們看手機(jī)驗(yàn)證碼架诞,bmob系統(tǒng)會(huì)在后臺(tái)把你在輸入框里填寫的驗(yàn)證碼和后臺(tái)發(fā)送的驗(yàn)證碼進(jìn)行比較,來(lái)判斷婿牍,所以設(shè)置一個(gè)驗(yàn)證碼的輸入框,在這里來(lái)進(jìn)行比較惩歉。
UIButton *enable = [UIButton buttonWithType:UIButtonTypeCustom];
enable.backgroundColor = [UIColor colorWithRed:0.522 green:1.000 blue:0.846 alpha:1.000];
enable.highlighted = YES;
enable.hidden = YES;
enable.alpha = 0;
[enable setTitle:@"確認(rèn)" forState:UIControlStateNormal];
enable.frame = CGRectMake(100, 430, 100, 45);
[self.view addSubview:enable];
[enable addTarget:self action:@selector(enable:) forControlEvents:UIControlEventTouchUpInside];
- (void)enable:(UIButton *)sender
{
UITextField *field = [self.view viewWithTag:100];
UITextField *smsField = [self.view viewWithTag:101];
//驗(yàn)證
[BmobSMS verifySMSCodeInBackgroundWithPhoneNumber:field.text andSMSCode:smsField.text resultBlock:^(BOOL isSuccessful, NSError *error) {
if (isSuccessful) {
NSLog(@"成功");
LoginViewController *nac = [[LoginViewController alloc]init];
[self.navigationController pushViewController:nac animated:YES];
} else {
NSLog(@"%@",error);
}
}];
}
這樣我們就能做個(gè)簡(jiǎn)單的驗(yàn)證碼判斷了等脂,如果要使用到驗(yàn)證身份,比如我長(zhǎng)時(shí)間沒(méi)有登錄淘寶了撑蚌,或者我在異地登錄的時(shí)候上遥,可以設(shè)置給用戶設(shè)置的綁定的手機(jī)號(hào)發(fā)送一個(gè)驗(yàn)證碼來(lái)進(jìn)行驗(yàn)證登錄,判斷身份争涌,或者驗(yàn)證碼申請(qǐng)注冊(cè)賬號(hào)里面都可以來(lái)做一些判斷粉楚。
然后給大家附上demo,自己隨便寫的亮垫,不要嫌棄丑陋
這里是鏈接