iOS 登陆的实现四种方式

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解析

page1image5840 page1image6000 page1image6160 page1image6320

用户输入用户名和密码,点击登录。。。我们把用户名和密码(用post 方式或者get方式,get方式多用于测试看你需要)传给服务器,服务器 进行判断,然后返回一个接口给我们(这里服务器返回的json接口,正 确就返回一个正确的接口给我们,错误就返回一个错误的接口给我们)。 我们拿到接口去解析,判断是否登录成功做相应的操作。

关于json解析,可以网上找找资料先看看,我就只知道[]是数组,{} 是字典,iOS有自带的json解析的。

以前一直说接口文档,接口什么,可自己从来都是模糊的,比如说一个 类的接口,我就认为是这个类的方法。。可是,我的boss给我的登录接 口的文档的时候,我才知道,哦,接口文档原来是这样子的呀。。嘻嘻。。。

1. 2. 3. 4.

[
{

"result": {
    "RUrl":   "http://localhost/pad_4078_B7DA_676D3F
page2image4456

E52763",

page2image5064

5.
6.
7.
8.
9.
10. ] 11. 12. l 13. n 14. n

(1)

  1. #import <UIKit/UIKit.h>

  2. #import "ByValueUrl.h"

  3. @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{

  1. 3  static XMPPManager *_share=nil;

  2. 4  static dispatch_once_t onceToken;

  3. 5  dispatch_once(&onceToken, ^{

6
7 });
8 return _share; 9}

_share=[[XMPPManager alloc] init];
10 -(id)init
11 {
  1. 12  if (self=[super init]) {

  2. 13  [self setupStream];

  3. 14  }

  4. 15  return self;

16 }
17 - (void)setupStream
18 {
19 xmppStream = [[XMPPStream alloc] init]; 20 [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];

  1. 21      [xmppStream setHostName:@"127.0.0.1"];
    
  2. 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

page9image7896 page9image8056 page9image8216

基于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?

  1. - (BOOL)application:(UIApplication *)application openURL:(NS URL *)url sourceApplication:(NSString *)sourceApplication an notation:(id)annotation

  2. {

  3. return [TencentOAuth HandleOpenURL:url];

  4. }

5.
6. - (BOOL)application:(UIApplication *)application handleOpenU

RL:(NSURL *)url

page10image6792

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等,看官方文档说明。 

posted @ 2015-11-09 15:11  木子东晓东  阅读(2190)  评论(0编辑  收藏  举报