版权声明
本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd/latest_articles;
微信公众号:陈怀哲(chenhuaizhe2016);
无需授权即可转载,但请自觉保留以上版权声明。
![](https://img.haomeiwen.com/i530099/ccb74ec6592ff29f.png)
1. 创建工程,完成简单页面的搭建
![](https://img.haomeiwen.com/i530099/015215be19365cda.png)
2.在登录页面(主页面)完成属性连线
![](https://img.haomeiwen.com/i530099/90dd5bff3413830e.png)
![](https://img.haomeiwen.com/i530099/cdaeca73c67da0ed.png)
3.创建文件夹,导入xmpp框架,配置工程
![](https://img.haomeiwen.com/i530099/34838e1a79535ddb.png)
![](https://img.haomeiwen.com/i530099/eb9a3b8c202d4978.png)
![](https://img.haomeiwen.com/i530099/407fa3dbfa8793ef.png)
![](https://img.haomeiwen.com/i530099/64c45dcffa760373.png)
pch文件中要导入UIKit框架
![](https://img.haomeiwen.com/i530099/4e719ec38cf3f5d6.png)
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>
![](https://img.haomeiwen.com/i530099/f9b78720d83a55a3.png)
![](https://img.haomeiwen.com/i530099/d8c551918013506f.png)
<a href="http://www.jianshu.com/p/b401ad6ba1a7">到这里,一个简单的能注册和登录的xmpp就完成了。聊天和好友功能稍后会跟上。这个时候你已经可以打开你电脑上的openfile来查看登录你的登录状态了。如果你还不会openfile服务器的配置,点击这里查看</a>
<em>注意:用户名和密码暂时都是根据服务器得到的,自己可以配置服务器来得到</em>
网友评论
<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>