iOS 登陆的实现四种方式 一. 网页加载:
http://www.cnblogs.com/tekkaman/archive/2013/02/21/2920218.ht ml
【iOS登陆的实现】
ASSUMPTION: iOS端加载Web页,然后用户输入用户名密码登陆,
WebServer会把用户登陆信息记载在Cookie。那么iOS客户端如何取到
Cookie中的登陆信息。
1、客户端监
听 NSHTTPCookieManagerCookiesChangedNotification。
2、当Web页登陆成功后,由于Cookie会变化,在
NSHTTPCookieManagerCookiesChangedNotification这个点上从
Cookie中取出登陆信息,保存下来(keychain,或DOC下)。
3、以后客户端每次启动或进入前台时,把登陆Cookie添加到
NSHTTPCookieStorage中。则以的新建WebView时会自动带上此Cookie。
4、当由客户端发起的请求,譬如ASIHTTPRequest时,会自动从
NSHTTPCookieStorage中取Cookie。
【注册的非网页实现】
Client提供用户输入账户、密码、邮箱的控件,然后Client通过HTTP请
求把这些信息发送给Server。即注册完成。注册完成后,返回到登陆界面,
让用户使用刚才注册的账户登陆。这种机制的问题的是register与login不同
步。有些做的好的网站在register后即自动登陆。
二.服务器请求
http://www.cnblogs.com/ios8/archive/2013/11/11/ios-login-json.htm
l
iOS-登录认证/json解析
用户输入用户名和密码,点击登录。。。我们把用户名和密码(用post
方式或者get方式,get方式多用于测试看你需要)传给服务器,服务器
进行判断,然后返回一个接口给我们(这里服务器返回的json接口,正
确就返回一个正确的接口给我们,错误就返回一个错误的接口给我们)。
我们拿到接口去解析,判断是否登录成功做相应的操作。
关于json解析,可以网上找找资料先看看,我就只知道[]是数组,{}
是字典,iOS有自带的json解析的。
以前一直说接口文档,接口什么,可自己从来都是模糊的,比如说一个
类的接口,我就认为是这个类的方法。。可是,我的boss给我的登录接
口的文档的时候,我才知道,哦,接口文档原来是这样子的呀。。嘻嘻。。。
1.
2.
3.
4.
[
{
"result": {
"RUrl": "http://localhost/pad_4078_B7DA_676D3F
E52763",
5.
6.
7.
8.
9.
10. ]
11.
12. l
13. n
14. n
(1)
#import <UIKit/UIKit.h>
#import "ByValueUrl.h"
-
@interface LogInViewController : UIViewController <UITextFie
ldDelegate>{
4.
5. UIActivityIndicatorView *activityIndicatorView;
}
}
"errMsg": "",
"result": "OK",
"sid": "B67D78_B7DA_676D3FE52763"
jsondata[0][‘result’].result: OK,登录成功,打开RUrl FAIL,登录失败,取:errMsg
6. 7.
8.
9.
10.
11.
12.
13.
14.
15.
16. 17. 18.
UITextField *userNameTF;//用户名 UITextField *passWordTF;//密码 NSDictionary *resultDic2;
UIView *view1;//等待转圈的view }
@property(weak,nonatomic)IBOutletUIButton*loginButton;/ /登录按钮 @property(strong,nonatomic)NSString*homeURL;//登录成功拿到 的url
@end
(2)
1.
2.
3.
4.
5.
6.
7.
8. 9. 10.
11. 12. 13.
14. 15.
16.
17. 18.
- (IBAction)login:(id)sender {
[self initaAtivityIndicatorView];
[activityIndicatorView startAnimating];//开始动画
// 定时器(设置时间为3秒)
// [NSTimer scheduledTimerWithTimeInterval:3.0 target:sel
f selector:@selector(timerFired:) userInfo:nil repeats:NO];
//加载一个NSURL对象
NSURL *url = [NSURL URLWithString:[NSString stringWithFo
rmat:@"http://192.168.9.1/pb/l?user=%@&pwd=%@",userNameTF.te
xt,passWordTF.text]];//这里的url输入自己的就可以,这里用的get
方式,get方式都是明文,用post方式好一点
NSLog(@"userNameTF:%@-",userNameTF.text);
NSLog(@"passWordTF:%@-",passWordTF.text);
NSURLRequest *request = [[NSURLRequest alloc]initWithURL
:url];
NSData *data = [NSURLConnection sendSynchronousRequest:r
equest returningResponse:nil error:nil]; //将请求的url数据放
到NSData对象中
NSString *dataStr = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"str-%@",dataStr);
19.
20. 21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
//IOS5自带解析类NSJSONSerialization从response中解析出数据 放到字典中
NSError *error;
NSMutableArray *array = [NSJSONSerialization JSONObjectW ithData:data options:NSJSONReadingMutableLeaves error:&error ];
NSDictionary *resultDic1 = [array objectAtIndex:0]; resultDic2 = [resultDic1 objectForKey:@"result"]; NSString *str = [resultDic2 objectForKey:@"result"]; NSLog(@"str -%@",str);
if ([str isEqualToString:@"FAIL"] ) { NSLog(@"shibai-%@",str);
// 定时器(设置时间为3秒)
[NSTimer scheduledTimerWithTimeInterval:3.0 target:s
elf selector:@selector(logInFail) userInfo:nil repeats:NO];
}else{
self.homeURL = [resultDic2 objectForKey:@"RUrl"];
NSLog(@"url - %@",self.homeURL);
// 定时器(设置时间为3秒)
[NSTimer scheduledTimerWithTimeInterval:3.0 target:s
elf selector:@selector(logInOK) userInfo:nil repeats:NO];
}
}
//登录失败
-(void)logInFail{
[activityIndicatorView stopAnimating];//结束动画
NSString *msg = [resultDic2 objectForKey:@"errMsg"];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@
"登录失败
56.
57.
58.
59.
60.
61.
62.
63.
64.
1.
1.
[alert show];
[view1 removeFromSuperview];
}
//登录成功
-(void)logInOK{
跳转到首页就可以了
[activityIndicatorView stopAnimating];//结束动画
" message:msg delegate:self cancelButtonTitle:@"OK" otherBut
tonTitles: nil nil];
三.XMPP实现登陆注册
1.创建一个单例模式来管理xmpp的连接和操作
1 +(XMPPManager *)share
2{
3 static XMPPManager *_share=nil;
4 static dispatch_once_t onceToken;
5 dispatch_once(&onceToken, ^{
6
7 });
8 return _share;
9}
_share=[[XMPPManager alloc] init];
10 -(id)init
11 {
12 if (self=[super init]) {
13 [self setupStream];
14 }
15 return self;
16 }
17 - (void)setupStream
18 {
19 xmppStream = [[XMPPStream alloc] init];
20 [xmppStream addDelegate:self
delegateQueue:dispatch_get_main_queue()];
21 [xmppStream setHostName:@"127.0.0.1"];
22 [xmppStream setHostPort:5222];
23 }
2.登录和注册都需要使用用户名进行连接服务器,
-(void)login
{
[self connect];
}
-(void)reg
{
isReg=YES;
[self connect];
}
- (BOOL)connect
{
if (xmppStream.isConnected) {
[self disconnect];
}
if (![xmppStream isDisconnected]) {
return YES; }
if (self.userName == nil) {
return NO;
}
[xmppStream setMyJID:[XMPPJID
jidWithString:self.userName]];
NSError *error = nil;
if (![xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error])
{
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Error connecting"
message:@"See console for error details."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
return NO; }
return YES; }
3.在连接代理中判断是登录还是注册,发送不同命令
//成功连接服务器
- (void)xmppStream:(XMPPStream *)sender
socketDidConnect:(GCDAsyncSocket *)socket
{
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
}
//连接服务器失败
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender
withError:(NSError *)error
{
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
}
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
NSError *error = nil;
if (isReg)
{
if (![xmppStream registerWithPassword:self.pwd
error:&error])
{
} }
else
{
if (![xmppStream authenticateWithPassword:self.pwd
error:&error])
{
} }
}
4.处理登录或注册代理函数
//登录成功
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
[self goOnline];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"登录成功" 录成功"
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}
//登录失败
- (void)xmppStream:(XMPPStream *)sender
didNotAuthenticate:(NSXMLElement *)error
{
message:@"登
delegate:nil
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"密码错误" 码错误"
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}
message:@"密 delegate:nil
//注册成功
- (void)xmppStreamDidRegister:(XMPPStream *)sender
{
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"注册成功"
册成功" cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
isReg=NO; }
//注册失败
- (void)xmppStream:(XMPPStream *)sender
didNotRegister:(NSXMLElement *)error
{
message:@"注
delegate:nil
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
NSLog(@"%@",[[error elementForName:@"error"]
stringValue]);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"注册失败"
册失败" cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
isReg=NO; }
message:@"注 delegate:nil
5.登录或注册的用户名必须“username@主机名”这种格式 转载请注明:http://www.cnblogs.com/bandy/p/3756492.html
四.第三方登陆SDK授权
http://blog.csdn.net/jichunw/article/details/41284293?utm_source=t uicool&utm_medium=referral
基于iOS实现APP的第三方QQ登陆,接入第三方SDK时的一个基本的步 骤:
1,找到相关的开放平台,QQ互联平台,http://connect.qq.com/; 2,注册成功后创建自己的APP,填写一堆基本信号后获得一个App_Key,
就是你APP的唯一识别码; 3,下载对应的SDK,并且阅读其中的开发文档或demo,通常看开发文
档比较直观,如果看demo,有些SDK的demo简直不忍直视; 4,嵌入SDK中对应功能,测试成功后提交第三方平台审核,等审核通
过后就可以正式接入第三方SDK的功能了; 5,完成所有功能后就提交AppStore审核吧,大概一周左右即可。
一,QQ登录授权开发: 1,按照开发文档导入SDK,然后把注册成功后获取到的Key加入到Url
Schemes中,例如:tencent1101737816,注意这些文档写的很清楚;
2,在AppDelegate.m中实现下面方法,注意,直接复制代码,两者写 其一即可,当然了别忘了引入头文件,这是用作返回APP时候用的回调 函数。
[objc] view plaincopyprint?
- (BOOL)application:(UIApplication *)application openURL:(NS URL *)url sourceApplication:(NSString *)sourceApplication an notation:(id)annotation
{
return [TencentOAuth HandleOpenURL:url];
}
5.
6. - (BOOL)application:(UIApplication *)application handleOpenU
RL:(NSURL *)url
7. {
8. return [TencentOAuth HandleOpenURL:url];
9. }
3,注册并授权,注意授权这里会出现问题
[objc] view plaincopyprint?
1. <span style="white-space:pre"> </span>NSArray *_permissio
ns = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_INFO, kO
PEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_US
ER_INFO, nil nil];
[objc] view plaincopyprint?
1. <span style="white-space:pre"> </span>[_tencentOAuth auth
orize:_permissions inSafari:NO]; //授权</span>
4 ,实 现 登 录 成 功 与 否 的 回 调 函 数 ,实 现 协 议 T e n c e n t S e s s i o n D e l e g a t e ,
代码如下:
[objc] view plaincopyprint?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
- (void)tencentDidLogin {
_labelTitle.text = @"登录完成";
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.acc essToken length]){
// 记录登录用户的OpenID、Token以及过期时间 _labelAccessToken.text = _tencentOAuth.accessToken;
}else{
_labelAccessToken.text = @"登录不成功 没有获取
accesstoken";
}
} -(void)tencentDidNotLogin:(BOOL)cancelled
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
5,如果代码能走到登录完成这里,并且获得了accesstoken,那说明我
们的登录流程就走完了,剩下的旧是获取用户具体的信息了,如昵称,
城市等等;
6,如何获取昵称呢,文档提供了这样一个方法
[objc] view plaincopyprint?
1. [_tencentOAuth getUserInfo];
但是返回类型是个BOOL类似,很多朋友就郁闷了,这是什么情况,经
过看代码,发现如果开发者调用了这个方法,如果成功则会实现下面协
议TencentSessionDelegate里面的回调函数:
[objc] view plaincopyprint?
1.
2.
3.
4.
5.
6.
-(void)getUserInfoResponse:(APIResponse *)response
{
// NSLog(@"respons:%@",response.jsonResponse);
self.name.text = [response.jsonResponse objectForKey:@"n ickname"];
}
{
if (cancelled){
}
_labelTitle.text = @"用户取消登录";
}else{
_labelTitle.text = @"登录失败";
}
-(void)tencentDidNotNetWork
{
_labelTitle.text=@"无网络连接,请设置网络";
}
这样就能得到我们想要的昵称等信息,到这里就算完成了我们的QQ登
录授权了,剩下的就是发给后台这些登录信息,并且保持授权成功后的
token等,看官方文档说明。