1、XMPP环境搭建

http://www.cnblogs.com/fearlessyyp/p/5506644.html

第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功。

2、工程中添加XMPP

2、工程中添加XMPP

1、创建新工程
2、导入XMPP框架
3、引入XMPP需要的依赖库 libxml   libresolv
4、设置路径:在工程的"Build Settings"页中找到"Header Search Path"项,添加"/usr/include/libxml2"。在"Other Linker Flags"项,添加"-lxml2"

http://www.cnblogs.com/fearlessyyp/p/5510003.html

三、XMPP实现登录、注册

  1、Main.storyboard搭建界面

2、初始化XMPP通道

  XMPPFramework框架中有一个XMPPConfig.h文件,里面宏定义了连接服务器用到的参数,可对照着自己的服务器参数修改宏

 1 //
 2 //  XMPPConfig.h
 3 //  XMPPSample
 4 //
 5 //  Created by lewis on 14-3-27.
 6 //  Copyright (c) 2014年 com.lanou3g. All rights reserved.
 7 //
 8
 9 #ifndef XMPPSample_XMPPConfig_h
10 #define XMPPSample_XMPPConfig_h
11
12 //openfire服务器IP地址
13 #define  kHostName      @"127.0.0.1"
14 //openfire服务器端口 默认5222
15 #define  kHostPort      5222
16 //openfire域名
17 #define kDomin @"127.0.0.1"
18 //resource
19 #define kResource @"iOS"
20 #endif

 初始化通道里用到的kHostName、kHostPort都是在XMPPConfig.h文件中定义的

  //初始化通道
         self.xmppStream = [[XMPPStream alloc] init];
         //openfire服务器IP地址
         self.xmppStream.hostName = kHostName;
         //openfire服务器端口 默认5222
         self.xmppStream.hostPort = kHostPort;
         //添加代理
         [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()
          ];

3、主要实现

  XMPPStream关键方法

  登录用到的方法

 注册用到的方法

封装了一个XMPPManager类

  XMPPManager.h  

 1 #import <Foundation/Foundation.h>
 2 #import "XMPPFramework.h"
 3
 4 @interface XMPPManager : NSObject
 5 /// 声明一个通道属性
 6 @property (nonatomic, strong)XMPPStream *xmppStream;
 7
 8 #pragma mark - 单例
 9 + (instancetype)sharedXMPPManager;
10
11 #pragma mark - 登录
12 - (void)loginWithUserName:(NSString *)userName
13                  password:(NSString *)password;
14
15 #pragma mark - 注册
16 - (void)registerWithUserName:(NSString *)userName
17                     password:(NSString *)password;
18 @end

XMPPManager.m

  #import "XMPPManager.h"

   static XMPPManager *xmppManager = nil;

   // 定义枚举值,用来区分当前的状态是登录还是注册
   typedef NS_ENUM(NSUInteger, ConnectToServerPurpose) {
       ConnectToServerPurposeLogin,  // 登录
       ConnectToServerPurposeRegister,  // 注册
   };

  @interface XMPPManager ()<XMPPStreamDelegate>
  /// 用户名
  @property (nonatomic, copy) NSString *userName;
  /// 密码
  @property (nonatomic, copy) NSString *password;

  /// 记录当前的状态是登录还是注册
  @property (nonatomic) ConnectToServerPurpose connectToServer;
  @end

  @implementation XMPPManager
  #pragma mark - 单例
  + (instancetype)sharedXMPPManager {
      static dispatch_once_t oneToken;
      dispatch_once(&oneToken, ^{
          xmppManager = [[XMPPManager alloc] init];
      });
      return xmppManager;
  }

  #pragma mark - 创建通道
  - (instancetype)init {
      if (self = [super init]) {
          // 初始化通道对象
          self.xmppStream = [[XMPPStream alloc] init];
          // 设置Openfire服务器主机名
          self.xmppStream.hostName = kHostName;
          // 设置服务器端口号
          self.xmppStream.hostPort = kHostPort;
          // 设置代理
          [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
      }
      return self;
  }

  #pragma mark - 登录
  - (void)loginWithUserName:(NSString *)userName
                   password:(NSString *)password {
      self.userName = userName;
      self.password = password;
      // 设置当前的状态为登录
      self.connectToServer = ConnectToServerPurposeLogin;
      // 连接服务器
      [self linkServer];

  }

  #pragma mark - 注册
  - (void)registerWithUserName:(NSString *)userName
                      password:(NSString *)password {
      self.userName = userName;
      self.password = password;
      // 设置当前的状态为注册
      self.connectToServer = ConnectToServerPurposeRegister;
      // 连接服务器
      [self linkServer];
  }

  #pragma mark - 连接服务器
  - (void)linkServer {
      // 要连接服务器,要有用户身份认证
      // 身份认证
      // 参数1:用户名
      // 参数2:domain是域名
      // 参数3:资源
      XMPPJID *jid = [XMPPJID jidWithUser:self.userName domain:kDomin resource:kResource];

      // 通过通道进行身份验证
      self.xmppStream.myJID = jid;

      // (根据项目需求来定)如果当前聊天工具处于连接状态,或者已经连接了,此时你需要去切断连接
      if ([self.xmppStream isConnected] || [self.xmppStream isConnecting]) {
          // 调用自定义方法
          [self disconnectionToServer];
      }

      // 连接超时
      NSError *error = nil;
      [self.xmppStream connectWithTimeout: error:&error];
      if (error) {
          NSLog(@"服务器连接超时");
      }
  }

  #pragma mark - 手动断开连接(自定义方法)
  - (void)disconnectionToServer {
      // 设置当前用户状态为下线
      XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
      // 告诉通道下线
     [self.xmppStream sendElement:presence];
     // 通道失去连接
     [self.xmppStream disconnect];
     NSLog(@"(自定义方法)断开连接");
 }

 #pragma mark -----------------以下XMPPStreamDelegate是协议中的方法----------------

 #pragma mark - 连接成功
 - (void)xmppStreamDidConnect:(XMPPStream *)sender {
     NSLog(@"服务器连接成功");
     // 校验密码
     switch (self.connectToServer) {
         case ConnectToServerPurposeLogin:
             // 校验登录密码
             [self.xmppStream authenticateWithPassword:self.password error:nil];
             break;
         case ConnectToServerPurposeRegister:
             // 注册
             [self.xmppStream registerWithPassword:self.password error:nil];
             break;
         default:
             break;
     }

 }

 #pragma mark - 连接超时
 - (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender {
     NSLog(@"服务器连接超时");
 }

 #pragma mark - 已经断开连接
 - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error {
     // 连接被断开的情况
     // 1、自己手动断开
     // 2、被动断开
     NSLog(@"已经断开连接");
 }

 #pragma mark - 用户认证失败
 - (void) xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error {
     NSLog(@"登录失败 %@", error);
 }

 #pragma mark - 认证成功
 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
     // 设置用户状态为上线
     XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
     // 告诉通道上线
     [self.xmppStream sendElement:presence];
     NSLog(@"用户已上线");

 }
 #pragma mark -----------------以上是XMPPStreamDelegate协议中的方法----------------
 // 关于注册是否成功的代理方法写在了RegisterViewController.m中

 @end

LoginViewController.m

 #import "LoginViewController.h"
  #import "XMPPManager.h"

  @interface LoginViewController ()
  /// 用户名
  @property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
  /// 密码
  @property (weak, nonatomic) IBOutlet UITextField *passwordTextField;

 @end

 @implementation LoginViewController

 - (void)viewDidLoad {
     [super viewDidLoad];

 }
 #pragma mark - 登录按钮的响应方法
 - (IBAction)loginAction:(UIButton *)sender {
     // 调用登录方法
     [[XMPPManager sharedXMPPManager] loginWithUserName:self.userNameTextField.text password:self.passwordTextField.text];
 }

 @end

RegisterViewController.m

 #import "RegisterViewController.h"
  #import "XMPPManager.h"

  @interface RegisterViewController ()<XMPPStreamDelegate>
  /// 用户名
  @property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
  /// 密码
  @property (weak, nonatomic) IBOutlet UITextField *passwordTextField;

 @end

 @implementation RegisterViewController

 - (void)viewDidLoad {
     [super viewDidLoad];

 }
 #pragma mark - 注册按钮点击事件
 - (IBAction)registerAction:(UIButton *)sender {
     XMPPManager *manager = [XMPPManager sharedXMPPManager];
     // 设置代理
     [manager.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
     // 调用注册方法
     [manager registerWithUserName:self.userNameTextField.text password:self.passwordTextField.text];

 }
 #pragma mark -----------------以下是XMPPStreamDelegate协议中的方法----------------
 #pragma mark - 注册成功, 返回登录界面
 - (void)xmppStreamDidRegister:(XMPPStream *)sender {
     NSLog(@"注册成功");
     [self dismissViewControllerAnimated:YES completion:nil];
 }

 #pragma mark - 注册失败
 - (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error {
     NSLog(@"注册失败 error = %@", error);
 }

 #pragma mark -----------------以上是XMPPStreamDelegate协议中的方法----------------
 @end

这个Openfire的界面可以查看数据库中的用户

UI进阶 即时通讯之XMPP登录、注册的更多相关文章

  1. UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天

    这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...

  2. UI进阶 即时通讯之XMPP环境搭建

    内容中包含 base64string 图片造成字符过多,拒绝显示

  3. UI进阶 即时通讯之卸载Openfire

    首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...

  4. 【即时通讯】XMPP调试与简单使用

    上篇讲了[即时通讯]即时通讯及XMPP概述及环境配置,接下来我们就要进行调试,看看是否可用! 在测试之前我们需要先事先保存一些东西,以便后面使用 —— 登录openfire后台 ——获取服务器名和端口 ...

  5. 【即时通讯】即时通讯及XMPP概述及…

    在讲解XMPP前,我们需要先了解什么是即时通讯技术: * 即时通讯技术(IM - InstantMessaging)支持用户在线实时交谈.当一方需要发送消息时,用户必须打开一个窗口,以便让用户与交流对 ...

  6. xmpp 登录注册小结

    将XMPPStream放在APPDelegate,以便全局访问 #pragma mark - XMPP相关的属性和方法定义 /** * 全局xmppstream,只读属性 */ @property ( ...

  7. iOS之即时通讯相关理解

    Socket: 1>Socket又称"套接字" 2>网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 3>应用程序通常通 ...

  8. Openfire XMPP Smack RTC IM 即时通讯 聊天 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)

    登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...

随机推荐

  1. location下的属性集锦

    location.protocol="http:"//即,协议 location.hostname="zhidao.baidu.com"//即,主机域名

  2. iOS中正则表达式的三种使用方式

    1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @“nijino_saki@163.com”: NSString *regex = @"[ ...

  3. TCP协议和UDP协议的区别

    1. TCP协议面向连接. UDP协议面向非连接 (有无链接)2. TCP协议传输速度慢. UDP协议传输速度快 (传输速度)3. TCP协议保证数据顺序. UDP协议不保证 (数据的有序性. 在IP ...

  4. (简单) HDU 1698 Just a Hook , 线段树+区间更新。

    Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...

  5. LPC2478的硬件IIC使用

    LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...

  6. S3C2440启动代码2440init.s彻底解析

    可以选择nand启动和nor启动,这两者之间的关系通过一个按键来选择 这个OM0有何玄机,在数据手册中有这么一段 位宽RAM启动了(当然,还得设置一些东西,下面就说), Nanaflash启动经历的过 ...

  7. jQuery-ui datepicker的使用演示代码

    这两天使用jquery做一个web端展示的工具,遇到了不少问题也学到了不少知识.其中有一个就是在页面中显示日期选择器的功能,通过百度直接使用的是jquery datepicker 看到一篇使用说明很不 ...

  8. Java Dwr3实现消息推送步骤详解

    DWR包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改 ...

  9. DOM:文档对象模型 --树模型

    文档:标签文档,对象:文档中每个元素对象,模型:抽象化的东西 一:window: 属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null ...

  10. Less-css预处理编译

    node编译 第一步:https://nodejs.org/en/  到node官网下载最新的node 第二步:和普通软件一样把node安装好 第三步:运行-cmd,准备安装less 全局安装(整个电 ...