美文网首页iOSiOS -- Demo产品
iOS中XMPP简单聊天实现 注册和登录

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

作者: 陈怀哲 | 来源:发表于2015-08-04 20:05 被阅读9224次

版权声明
本文由陈怀哲首发自简书: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中XMPP简单聊天实现 注册和登录

    版权声明本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd...

  • XMPP实现1

    XMPP代码实现 XMPP需要注意的地方 我们主要实现四个功能: 1.注册 2.登录 3.获取好友列表 4.聊天(...

  • iOS中XMPP简单聊天实现 好友和聊天

    字数1793 阅读9834 评论32 喜欢119 好友和聊天流程图 在看这篇文章之前,你需要配置好服务器,以及完成...

  • iOS中XMPP简单聊天实现 好友和聊天

    版权声明本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd...

  • iOS—XMPP登录、聊天

    通常的做法是我们会新建一个专门针对 xmpp 库的管理类,来处理所有的关于 xmpp 类的调用,这也是对封装的一点...

  • iOS---------XMPP实现简单聊天--------服务

    mac上搭建openfire服务器一、下载并安装openfire1.到 http://www.igniterea...

  • 登录注册UI ---- 1

    转载自 iOS登录界面和注册界面 一、登录和注册界面实现效果图: 一、实现原理 1、输入框的实现原理:把两个无边框...

  • iOS记录 ---XMPP之注册登录

    需要在本地配置好openfire服务器 将XMPP框架拖入工程,一拖入就编译的话是会报错的,需要配置一下 配置一些...

  • Session

    在文章Cookie与登录注册中,我们已经实现了简单的注册和登录功能,并且登录后服务器会给客户端发送一个Cookie...

  • iOS基于XMPP实现聊天(一)

    iOS基于XMPP实现聊天(一) 写在前面:目前此文为记录所用,后面会持续更新下去。目前公司项目在聊天这块实现了文...

网友评论

  • 江江江123: self.connectServerPurposeType 这个东西在哪定义的?
  • applixy:不是很懂,请教下博主,IOS消息推送不是只需要调用苹果的推送服务就可以了吗?最近在用xmpp协议搭建安卓端和服务端,并且还要保证安卓端和服务端的有效连接,是不是IOS端的框架内部只需要封装和解析xmpp报文就可以了,不需要考虑消息的实时推送这些问题?
    陈怀哲:@applixy ios的推送是走APNS
  • macfai:楼主,文章不错,如果能用markdown 语法把代码的高亮显示就更好了,这样看着真是难受:joy:
    陈怀哲:@macfai 恩 是我用的markdown语法用错了,已经改过来了,谢谢你
    macfai:@陈怀哲:smile:电脑看的,是高亮的,就是那个代码都挤在一起了,不知道是不是浏览器问题,用的safari
    陈怀哲:@macfai 已经用了markdown,是不是因为你用的是手机看的吧,所以没有高亮显示
  • Counting_S:登录认证报错,求指教
    <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>
  • MichellRich:目前用第三方的居多,在XMPP的基础上已经定义好很多的协议:smile:
  • coder_hong:我登陆spark需要服务器 我怎么填
    _锋:@coder_hong localhost
  • workcaodao:你好 用xmpp做im 实际中好吗,对了还问下 思维导图用的什么软件
    陈怀哲:@workcaodao 嗯
    workcaodao:@9f2e536b78fd 谢了,第三方指的是融云、环信 等这些吧
    陈怀哲:@workcaodao 其实在实际中做im还是直接用第三方的比较多,思维导图推荐开源的XMind,或者MindNode、iThoughtX
  • 49043a795ae0:能发个 demo 么?
    陈怀哲:@future_so https://github.com/chenhuaizhe/XMPPDemo
  • 林鱼禾:demo 能再分享吗?
    陈怀哲:https://github.com/chenhuaizhe/XMPPDemo
    陈怀哲:@尘恍若梦 时间太长了,demo不知道能不能找到了
  • bcee5dd5dd26:简单易懂,赞一个
  • 50d32502d098:最近剛好也在寫xmpp的連線 非常有幫助 希望可以持續教學 讓小弟學習 :+1:
  • 陈怀哲:@ce8b08e2b14a 如果有错误的地方及时告诉我一下,谢谢
  • ce8b08e2b14a:@9f2e536b78fd 麻烦问一下,你的第一张图是用哪个软件做的呀
    1c7d043302da:@Duke陛下 我都知道是Xmind:cry:
  • 陈怀哲:@叶舞清风 应该不影响吧,如果不行就更新一下
  • 叶舞清风:点击注册和登录没有后续啊,我的版本太低了
  • 叶舞清风:我的才8.1版本
  • 叶舞清风:你的是8.4版本的?
  • 叶舞清风:@9f2e536b78fd 嗯啊,我才学
  • 陈怀哲:@叶舞清风 嗯,有什么问题可以一起交流下
  • 叶舞清风:学习,明天要好好学习一下

本文标题:iOS中XMPP简单聊天实现 注册和登录

本文链接:https://www.haomeiwen.com/subject/pcmvqttx.html