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解析
用户输入用户名和密码,点击登录。。。我们把用户名和密码(用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等,看官方文档说明。
iOS 登陆的实现四种方式的更多相关文章
- iOS 中 延迟操作四种方式
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- ios页面间传递参数四种方式
ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...
- iOS中常用的四种数据持久化方法简介
iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...
- IOS研究之IOS7四种后台机制
IOS 7中,实际上APP拥有四种后台模式.不管是哪一种后台机制,均须要利用苹果给予的对应后台接口实现.IOS7系统中,开发人员能够灵活利用多种后台接口(API)实现更加智能的应用操作. 对获取 ...
- ipa包如何打包?ios打包ipa的四种方法分享
今天带来的内容是ios打包ipa的四种方法.总结一下,目前.app包转为.ipa包的方法有以下几种,下面一起来看看吧! 1.Apple推荐的方式,即实用xcode的archive功能 Xco ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...
- ASP.NET MVC之下拉框绑定四种方式(十)
前言 上两节我们讲了文件上传的问题,关于这个上传的问题还未结束,我也在花时间做做分割大文件处理以及显示进度的问题,到时完成的话再发表,为了不耽误学习MVC其他内容的计划,我们今天开始好好讲讲关于MVC ...
- iOS 收起键盘的几种方式
iOS 收起键盘的几种方式 1.一般的view上收起键盘 // 手势 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ ...
随机推荐
- poj1375Intervals(点到圆的切线)
链接 貌似这样的叫解析几何 重点如何求得过光源到圆的切线与地板的交点x坐标,可以通过角度及距离来算,如图, 根据距离和半径可以求得角度a.b.r,自然也可以求得d1,d2. 至于方向问题,在求r得时候 ...
- poj1584A Round Peg in a Ground Hole
链接 题意甚是难懂!这是第二遍做这道题了,依旧无法理解题意,搜了下题意... 首先需要判断是不是为凸多边形.(从一个顶点走一遍即可,要注意顺逆时针,题目中没有指明) 其次看一下圆是不是能够放入多边形内 ...
- jQuery中$.post()的使用
$.post()方法是jquery本身对ajax的一个简单封装,其效果等价于: $.ajax({ url:url, type:"POST", data:data, dataType ...
- kafka - topic
http://www.cnblogs.com/yurunmiao/p/5550906.html http://www.cnblogs.com/chushiyaoyue/p/5695826.html
- 例题:输入您的出生日期,判断你的星座,主要练习使用datetime类及if else语句。很实用
while (true) { Console.WriteLine("请输入您的生日(年-月-日)");//提示输入 string x = Console.ReadLine();// ...
- java视频格式转换代码
http://blog.163.com/zzf_fly/blog/static/20958915820127217443816/ package com.gkzx.online.action; imp ...
- 使用分布式数据库集群做大数据分析之OneProxy
一.十亿数据,轻松秒出 实时监控领域有两个显著的特点,一是数据来源很多而且数据量大,有来自监控摄像头.GPS.智能设备等:二是需要实时处理.我们的客户在做实时处理时,就遇到这样的问题.客户的某个数据表 ...
- noip2016题解汇总
[uoj#260]玩具谜题 传送门 http://uoj.ac/problem/260 分析 模拟. int n,m; int dir[N]; char nam[N][L]; int a[M],s[M ...
- 能源项目xml文件标签释义--<mvc:annotation-driven>
<mvc:annotation-driven />的可选配置 <mvc:annotation-driven message-codes-resolver ="bean re ...
- (11)lambda表达式用法
* lambda 简述 lambda只是一个表达式,函数体比def简单很多 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lam ...