iOS激情详解之登录注册(XMPP)

来源:互联网 发布:sql从入门到精通光盘 编辑:程序博客网 时间:2024/04/30 00:22

    在登录注册之前,要明白三个架构:服务器,客户端1,客户端2(这里我们用spark来模拟) 明白三个架构关系才能更好明白登陆注册的原理.

    利用XMPP,XMPP是基于点对点的即时通讯协议(俗称第三方).

需要配置环境等一些列环境, 具体的配置请参考:
1. 导入 libxml2 和 libresolv框架 和 XMPP第三方类库
2. 路径 输入:    /usr/include/libxml2
3. . 如果有错就先检查是否导入UIKit框架
//  //  XMPPManager.h  //  XMPP_WDX//  //  Created by WDX on 15/10/20.  //  Copyright (c) 2015年 wangdongxu. All rights reserved.  //    #import <Foundation/Foundation.h>    // 导入第三方类  #import "XMPPConfig.h"    // 导入第三方全局.h文件  #import "XMPPFramework.h"    @interface XMPPManager : NSObject<XMPPStreamDelegate>    /**  *  流, 客户端与服务器的通道          所有的操作都是基于通道的  */  @property (nonatomic, strong) XMPPStream *xmppStrem; // XMPPStream 是通道        // 这里用单例 因为都使用同一个通道  + (XMPPManager *)shareManager;      // 登录  - (void)loginWithUserNameString:(NSString *)userName password:(NSString *)password;      // 注册  - (void)registWhithUserName:(NSString *)userName password:(NSString *)password; 

XMMPPManager.m
// typedef 枚举  typedef NS_ENUM(NSUInteger, ConnectToServerPurpose){      ConnectToServerPurposeLogin,      ConnectToServerPurposeRegister  };      @interface XMPPManager ()    // 枚举变量  @property (nonatomic) ConnectToServerPurpose connectToServ;      //  记录 登录密码  @property (nonatomic, strong) NSString *loginPassword;    // 记录注册密码  @property (nonatomic, strong) NSString *registerPassword;          @end    @implementation XMPPManager      // 实现单例方法  //+ (XMPPManager *)shareManager  //{  //    static XMPPManager *manager = nil;  //    if (manager == nil) {  //        manager = [[XMPPManager alloc] init];  //    }  //    return  manager;  //}        + (XMPPManager *)shareManager  {      static XMPPManager *manager = nil;      static dispatch_once_t onceToken;      dispatch_once (&onceToken, ^{          manager = [[[self class] alloc] init];      });      return manager;        }      /**   初始化的同时 设置域名 和 端口    */  - (instancetype)init  {      if (self = [super init]) {                    // 初始化通道          self.xmppStrem = [[XMPPStream alloc] init];            // 设置域名          self.xmppStrem.hostName = kHostName;          // 端口号          self.xmppStrem.hostPort = kHostPort;                    // 添加代理          [self.xmppStrem addDelegate:self delegateQueue:dispatch_get_main_queue()];      }      return self;  }      // 用户名密码登录  - (void)loginWithUserNameString:(NSString *)userName password:(NSString *)password  {            // 登录是 建立在连接的基础上的            // 记录登录密码      self.loginPassword = password;            // 枚举变量赋值      self.connectToServ = ConnectToServerPurposeLogin;           // 调用连接服务器的方法      [self connectToServiceWithUserName:userName];        }    // 连接服务器  (是谁在连接, 记录身份)  - (void)connectToServiceWithUserName:(NSString *)userName  {      // 设置连接请求的身份            // jidWithUser:userName domain:kDomin resource:kResource      // 1. 这个方法获取身份信息      XMPPJID *myJid = [XMPPJID jidWithUser:userName domain:kDomin resource:kResource];      // domain 是只读属性, 不能用.语法            // 2. 把获取的主机信息给通道的一个身份属性      self.xmppStrem.myJID = myJid;        // 3. 获取身份信息以后 调用连接服务器方法      [self connectToService];        }    #pragma mark--- 连接服务器方法  - (void)connectToService  {            // 进来先判断            // 如果已经连接 或者 正在连接 就断开连接      if ([self.xmppStrem isConnected] || [self.xmppStrem isConnecting]) {                    // 断开通道的连接, 执行新的连接          [self disConnect];                }                  NSError *error = nil;      // 通道去执行连接的方法      [self.xmppStrem connectWithTimeout:30 error:&error];      if (error) {          NSLog(@"连接失败");      }  }       #pragma mark---断开连接  - (void)disConnect  {            // 保证用户下线            //1. 生成下线状态 , unavaiable      XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavaiable"];            // 将元素插入xml文件      [self.xmppStrem sendElement:presence];            //断开与服务器连接的方法      [self.xmppStrem disconnect];  }      #pragma mark--- XMLPPStreamDelegate 代理方法    // 连接超时  - (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender  {      NSLog(@"连接超时  ⌚ %s, %d", __FUNCTION__, __LINE__);  }      #warning  在连接成功的方法里面 登录 注册  - (void)xmppStreamDidConnect:(XMPPStream *)sender  {      NSLog(@"连接成功  %s, %d", __FUNCTION__, __LINE__);                  switch (self.connectToServ) {          case ConnectToServerPurposeLogin:              // 连接成功 在这里登录认定              [self.xmppStrem authenticateWithPassword:self.loginPassword error:nil];              break;                        case ConnectToServerPurposeRegister:              // 连接成功, 注册              [self.xmppStrem registerWithPassword:self.registerPassword error:nil];              break;          default:              break;      }  }      - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error  {      NSLog(@"断开连接成功  %s, %d", __FUNCTION__, __LINE__);  }      // 未认定  - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error  {       NSLog(@"未登录  %s, %d", __FUNCTION__, __LINE__);  }      // Authenticate 认定  - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender  {       NSLog(@"已经登录  %s, %d", __FUNCTION__, __LINE__);                  // Authenticate --- 认证      // 在通道设置上线状态      XMPPPresence *present = [XMPPPresence presenceWithType:@"available"];      // 将元素插入xml文件      [self.xmppStrem sendElement:present];        }    /****************************************************************/    // 注册开始  // 注册开始  - (void)registWhithUserName:(NSString *)userName password:(NSString *)password  {      self.registerPassword = password;      self.connectToServ = ConnectToServerPurposeRegister;            // 还需要调用上面的连接到服务器的方法, 记录本机信息和用户信息      [self connectToServiceWithUserName:userName];        }      - (void)xmppStreamDidRegister:(XMPPStream *)sender  {      NSLog(@"注册成功  %s, %d", __FUNCTION__, __LINE__);  }    - (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error  {      NSLog(@"注册失败 %s, %d", __FUNCTION__, __LINE__);  }  <span><span class="keyword">@end</span><span></span></span>
// 登录控制器.m
//  //  LoginViewController.m  //  XMPP_WDX //  //  Copyright (c) 2015年 wangdongxu. All rights reserved.  //    #import "LoginViewController.h"  #import "XMPPManager.h"  @interface LoginViewController ()<XMPPStreamDelegate>    @end    @implementation LoginViewController    - (void)viewDidLoad {      [super viewDidLoad];      // Do any additional setup after loading the view.      self.passwordTF.secureTextEntry = YES;          }      #pragma mark--- 登录按钮<span style="font-family:'Helvetica Neue';"> <span style="font-family:'Helvetica Neue';">(拖拽</span>)</span>- (IBAction)LoginMySelfBtn:(UIButton *)sender {                  // 调用单例方法      [[XMPPManager shareManager] loginWithUserNameString:self.userNameTF.text password:self.passwordTF.text];        }      - (void)didReceiveMemoryWarning {      [super didReceiveMemoryWarning];      // Dispose of any resources that can be recreated.  }    /*   @end 
// 注册控制器.m
    //      //  RegeistViewController.m      //  XMPP_WDX     //            //  Copyright (c) 2015年 wangdongxu. All rights reserved.      //            #import "RegeistViewController.h"      #import "XMPPManager.h"      @interface RegeistViewController ()<XMPPStreamDelegate>            @end            @implementation RegeistViewController            - (void)viewDidLoad {          [super viewDidLoad];          // Do any additional setup after loading the view.                }            #pragma mark--- 注册按钮      - (IBAction)regeistButton:(UIButton *)sender {                    [[XMPPManager shareManager] registWhithUserName:self.userName.text password:self.password.text];                }                        //- (void)xmppStreamDidRegister:(XMPPStream *)sender      //{      //    NSLog(@"注册成功  %s, %d", __FUNCTION__, __LINE__);      //}      //      //- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error      //{      //    NSLog(@"注册失败 %s, %d", __FUNCTION__, __LINE__);      //}                        - (void)didReceiveMemoryWarning {          [super didReceiveMemoryWarning];          // Dispose of any resources that can be recreated.      }            /*           @end  





0 0
原创粉丝点击