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

  • 相关阅读:
    高精度计算模板
    P1108 低价购买 [DP][统计方案]
    POJ3349 Snowflake Snow Snowflakes [哈希]
    P1312 Mayan游戏 [深搜][模拟]
    P1378 油滴扩展[深搜]
    P1514 引水入城[搜索,线段覆盖]
    TYVJ1391 走廊泼水节
    【BZOJ1196】公路修建问题
    【BZOJ3624】免费道路
    【BZOJ2429】聪明的猴子
  • 原文地址:https://www.cnblogs.com/lidongxiao/p/4950004.html
Copyright © 2020-2023  润新知