×

iOS中XMPP简单聊天实现 注册和登录

96
陈怀哲
2015.08.04 20:05* 字数 582

版权声明
本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd/latest_articles;
微信公众号:陈怀哲(chenhuaizhe2016);
无需授权即可转载,但请自觉保留以上版权声明。

目录

1. 创建工程,完成简单页面的搭建

页面搭建

2.在登录页面(主页面)完成属性连线

登录页面
注册页面

3.创建文件夹,导入xmpp框架,配置工程

导入静态库
加上-lxml2
/usr/include/libxml2 或者 $(SDKROOT)/usr/include/libxml2
创建pch文件后,加上pch文件的路径:工程名/pch文件名

pch文件中要导入UIKit框架

导入框架,配置工程,创建文件夹等

4.封装xmppManager类

接口文件:
#import <Foundation/Foundation.h>
<code>#</code>import "XMPPFramework.h"
  // 该类主要封装了xmpp的常用方法
@interface XMPPManager : NSObject<XMPPStreamDelegate>
//通信管道,输入输出流
@property(nonatomic,strong)XMPPStream *xmppStream;
//单例方法
+(XMPPManager *)defaultManager;
//登录的方法
-(void)loginwithName:(NSString *)userName andPassword:(NSString *)password;
//注册
-(void)registerWithName:(NSString *)userName andPassword:(NSString *)password;
-(void)logout;
@end
实现文件:

单例:

#pragma mark 单例方法的实现
+(XMPPManager *)defaultManager{
    static XMPPManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[XMPPManager alloc]init];
    });
    return manager;
}

重写init方法:

-(instancetype)init{
    if ([super init]){
   //1.初始化xmppStream,登录和注册的时候都会用到它
    self.xmppStream = [[XMPPStream alloc]init];
     //设置服务器地址,这里用的是本地地址(可换成公司具体地址)
    self.xmppStream.hostName = @"127.0.0.1";
//    设置端口号
    self.xmppStream.hostPort = 5222;
//    设置代理
    [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
    }
    return self;
}

注销的实现:


-(void)logout{
//表示离线不可用
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
//向服务器发送离线消息
    [self.xmppStream sendElement:presence];
 //断开链接
    [self.xmppStream disconnect];
}

接下来实现登录的方法:

<pre> 1.初始化一个xmppStream
2.连接服务器(成功或者失败)
3.成功的基础上,服务器验证(成功或者失败)
4.成功的基础上,发送上线消息</pre>

-(void)loginwithName:(NSString *)userName andPassword:(NSString *)password
{
//标记连接服务器的目的
    self.connectServerPurposeType = ConnectServerPurposeLogin;
//这里记录用户输入的密码,在登录(注册)的方法里面使用
    self.password = password;
//  创建xmppjid(用户0,  @param NSString 用户名,域名,登录服务器的方式(苹果,安卓等)

    XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"chenyuan" resource:@"iPhone8"];
    self.xmppStream.myJID = jid;
    //连接到服务器
    [self connectToServer];

   
    
}

连接到服务器的方法:

-(void)connectToServer{
    //如果已经存在一个连接,需要将当前的连接断开,然后再开始新的连接
    if ([self.xmppStream isConnected]) {
        [self logout];
    }
    NSError *error = nil;
    [self.xmppStream connectWithTimeout:30.0f error:&error];
    if (error) {
        NSLog(@"error = %@",error);
    }
}

连接到服务器有可能成功或者失败,所以有相对应的代理方法,首先要在遵循协议:<XMPPStreamDelegate>

xmppStream的代理方法:

//连接服务器失败的方法
-(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{
    NSLog(@"连接服务器失败的方法,请检查网络是否正常");
}</code></pre>                    <pre><code>//连接服务器成功的方法
-(void)xmppStreamDidConnect:(XMPPStream *)sender
{
    NSLog(@"连接服务器成功的方法");
//登录
    if (self.connectServerPurposeType == ConnectServerPurposeLogin) {
        NSError *error = nil;
//向服务器发送密码验证 //验证可能失败或者成功
        [sender authenticateWithPassword:self.password error:&error];
    }
//注册
    else{
        //向服务器发送一个密码注册(成功或者失败)
        [sender registerWithPassword:self.password error:nil];
    }
}

连接成功后,需要进行验证,注册和登录都需要,就写在一起了。

//验证成功的方法
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    NSLog(@"验证成功的方法");
    /**
     *  unavailable 离线
       available  上线
       away  离开
       do not disturb 忙碌
     */
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
    [self.xmppStream sendElement:presence];
}
</code></pre>
<pre><code>//验证失败的方法
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
    NSLog(@"验证失败的方法,请检查你的用户名或密码是否正确,%@",error);
}

注册:

-(void)registerWithName:(NSString *)userName andPassword:(NSString *)password{
    self.password = password;
//0.标记连接服务器的目的
    self.connectServerPurposeType = ConnectServerPurposeRegister;
//1. 创建一个jid
    XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"chenyuan" resource:@"iPhone8"];
 //2.将jid绑定到xmppStream
    self.xmppStream.myJID = jid;
 //3.连接到服务器
    [self connectToServer];
    
}

注册也有代理方法:

#pragma mark 注册成功的方法
-(void)xmppStreamDidRegister:(XMPPStream *)sender{
    NSLog(@"注册成功的方法");
}

#pragma mark 注册失败的方法
-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
{
    NSLog(@"注册失败执行的方法");
}

到这里简单的XMPPManager工具类就封装完了。接下来就是在登录页面和注册页面完成登录和注册。
需要注意的是:xmppStream设置代理的方法:addDelegate: delegateQueue:

    [[XMPPManager defaultManager].xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];

它可以添加多个代理,所以通过设置代理
在登录页面当检测到登录成功时,可以在登录验证成功的方法里面push到下一个页面;
在注册页面注册成功时可以在代理方法里面实现pop回主页面。

<strong> 下面是登录页面和注册页面的实现文件: </strong>

登录页面
注册页面

<a href="http://www.jianshu.com/p/b401ad6ba1a7">到这里,一个简单的能注册和登录的xmpp就完成了。聊天和好友功能稍后会跟上。这个时候你已经可以打开你电脑上的openfile来查看登录你的登录状态了。如果你还不会openfile服务器的配置,点击这里查看</a>

<em>注意:用户名和密码暂时都是根据服务器得到的,自己可以配置服务器来得到</em>

iOS必备技能
Web note ad 1