iOS XMPP协议即时通讯(Openfire服务器版)(佟力)
一、什么是XMPP
XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的 IM(IM:instant messaging,即时消息)协议之一。 XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。XMPP即时通信协议,采用C/S体系结构。基本的网络形式是客户端连接到服务器,然后由服务器去连接到另一个客户端进行两个客户端之间的通信。而他们传输的是XML流。
XMPP工作原理说明: 所有从一个客户端到另一个客户端的消息和数据都要通过服务器。
1、客户端连接服务器
2、服务器利用本地目录系统的证书对其认证
3、客户端制定目标地址,让服务器告知目标状态
4、服务器查找,连接并进行相互认证
5、客户端间进行交互
二、搭建服务器(Openfire)
通过上述的了解,我们知道要想进行通信,我们必须要有一个服务器。服务器端采用Openfire作为服务器。允许多个客户端同时登录并且并发的连接到一个服务器上。服务器对每个客户端的连接进行认证,对认证通过的客户端创建会话,客户端与服务器端之间的通信就在该会话的上下文中进行。
首先安装Openfire
![](https://img.haomeiwen.com/i1151289/5a664651b6bc3652.png)
![](https://img.haomeiwen.com/i1151289/55e3cdbe8cab3408.png)
![](https://img.haomeiwen.com/i1151289/74a772817ed530c1.png)
![](https://img.haomeiwen.com/i1151289/5243adcbbc688b14.png)
注:如果Openfire一直打不开,请参考 http://blog.csdn.net/winer888/article/details/49886281
![](https://img.haomeiwen.com/i1151289/4f3d086a32ab1b8b.png)
![](https://img.haomeiwen.com/i1151289/345d5ba5087618be.png)
![](https://img.haomeiwen.com/i1151289/3ce45cb68562d32e.png)
![](https://img.haomeiwen.com/i1151289/f5888caa83d7c601.png)
![](https://img.haomeiwen.com/i1151289/39a8a337b97725f8.png)
然后我们要创建数据库,首先安装XAMPP。安装成功后,点击XAMPP图标
![](https://img.haomeiwen.com/i1151289/83f3bcb650f853b1.png)
![](https://img.haomeiwen.com/i1151289/ff89a4f60a5c7c3a.png)
![](https://img.haomeiwen.com/i1151289/3f7c0a92daf1d016.png)
![](https://img.haomeiwen.com/i1151289/d227732e6525d14c.png)
由于我们的服务器是Openfire,所以这个数据库格式要是Openfire的数据库格式。
![](https://img.haomeiwen.com/i1151289/9bfc1a7ff3b9dfe8.png)
![](https://img.haomeiwen.com/i1151289/98587605c920fe76.png)
![](https://img.haomeiwen.com/i1151289/bb38ec83cb0ca0b4.png)
![](https://img.haomeiwen.com/i1151289/096a5f237a1fd573.png)
然后进入到XAMPP界面。导入数据库格式
![](https://img.haomeiwen.com/i1151289/5f29a471b76d7c61.png)
然后我们继续配置Openfire,修改数据库URL和用户名密码。
![](https://img.haomeiwen.com/i1151289/79b1a968551f1576.png)
特性设置选择初始设置,点击继续。
![](https://img.haomeiwen.com/i1151289/ea49bc46ac1c118c.png)
点击登录到管理控制台,输入用户名(admin)和密码。这样就进入了Openfire的后台管理控制平台。
三、安装和使用Spark客户端
Spark是一个实时通讯客户端。我们可以通过Spark来进行即时通讯。安装好Spark后,登录Spark
![](https://img.haomeiwen.com/i1151289/d298e161356e1804.png)
![](https://img.haomeiwen.com/i1151289/7460f10213b59979.png)
通过登录admin账号,也就可以说明,Openfire的服务器配置是成功的。
四、代码实现客户端
服务器用Openfire实现了,下面我们用代码创建即时通讯客户端
1、前期准备
新建一个工程,导入XMPP框架到工程,进入XMPP框架下XMPPConfig.h文件中,将服务器IP地址,端口号、域名、resource做一下修改。
![](https://img.haomeiwen.com/i1151289/3c66d88bc4d7219c.png)
然后导入一些框架
CoreData.framework、libxml2.tbd、libresolv.tbd、libidn.a
![](https://img.haomeiwen.com/i1151289/7169af991a7d528c.png)
修改一下Header Search Path
![](https://img.haomeiwen.com/i1151289/ef008d3f6c331636.png)
添加一个PCH文件,命名为PrefixHeader.pch,修改一下路径
![](https://img.haomeiwen.com/i1151289/cc0a78fc02234362.png)
然后在PCH文件中添加 #import头文件
command+b一下,会有一个红色报错,点击红色报错,由于重名,所以进所以将SCNetworkReachabilityFlags改成SCNetworkReachabilityFlags1,
command+b后没有报错。这样我们的准备工作就做好了
![](https://img.haomeiwen.com/i1151289/2cfe4657bcb9f2c8.png)
![](https://img.haomeiwen.com/i1151289/42fcb3cdcfd6a3c7.png)
2、创建一个管理类,便于我们去将代码分类管理
创建一个XMPPManager单例类,继承于NSObject。这个类是这个工程中的核心功能代码。
首先要在XMPPManager中创建一个通信通道属性,即XMPPStream。这个实例是传输数据的,只有通信通道是连通的那么才可以进行数据的传输,XMPPStream也是XMPP的核心类。在XMPPManager.m中的init方法中,进行初始化XMPPStream,并指定服务器IP、端口和设置代理
![](https://img.haomeiwen.com/i1151289/20c53da855e13147.png)
然后遵循XMPPStreamDelegate协议。
不管我们做什么操作,首先一定要让客户端通过账号和服务器连接,并且连接成功。
![](https://img.haomeiwen.com/i1151289/19467182ef735785.png)
与服务器的连接状态是通过代理方法返回,有连接成功和连接超时
![](https://img.haomeiwen.com/i1151289/ac5d0526accdc8a5.png)
3、登录功能
如果服务器连接成功,那么就可以进行登录操作了。登录操作其实就是要从服务器中验证一下账号和密码是否匹配。
在连接成功的方法中,验证账号和密码
![](https://img.haomeiwen.com/i1151289/90270587413b9e10.png)
验证的结果也是通过代理方法返回,如果验证成功的话需要给服务器发送一个上线状态
![](https://img.haomeiwen.com/i1151289/6b56988860aee029.png)
如果验证成功,就可以在Openfire后台管理控制平台看到,那个用户变绿了,即上线了。
4、注册功能
注册和登录类似,在之前都要确保与服务器连接。连接服务器后,需要将注册的密码传给服务器,进行注册
![](https://img.haomeiwen.com/i1151289/c951ef58ad8888e7.png)
注册后的结果也是代理方法可以返回的
![](https://img.haomeiwen.com/i1151289/478fd06586340563.png)
5、获取好友列表
好友列表,我们需要通过花名册类去获取,即XMPPRoster。
首先在manager单例类中创建XMPPRoster实例,激活通信通道,并设置代理
![](https://img.haomeiwen.com/i1151289/51584140c85f2b40.png)
遵循XMPPRosterDelegate协议。其中有三个代理方法
![](https://img.haomeiwen.com/i1151289/9b3e5ae1c8958161.png)
在检索到好友的代理方法中,执行一次只会有一个好友。
![](https://img.haomeiwen.com/i1151289/09548f568d6fdde6.png)
然后在FriendTableView中显示。具体代码见Demo
6、添加好友功能
首先通过好友的账号,将其封装成JID对象,然后调用addUser:withNicknama 方法,添加好友
![](https://img.haomeiwen.com/i1151289/665e83115dbb4342.png)
7、接受到好友请求
当A账号添加B账号为好友,那么B就应该得到一个好友请求。然后对其进行选择,同意或者拒绝。这个会通过代理方法回调
![](https://img.haomeiwen.com/i1151289/81ab96e464b53105.png)
在这个代理方法中,要做同意好友请求或者拒绝好友请求,这里我用了alertController进行选择
![](https://img.haomeiwen.com/i1151289/4e37384f32387637.png)
8、好友聊天--发送消息和接受到消息
要想发送消息,首先要知道对方的JID,这里的JID是上个界面传过来的。通过调用通信通道的sendElement:方法就可以进行发送消息
![](https://img.haomeiwen.com/i1151289/cb85a0a67f65680b.png)
发送后,就会通过代理方法回调。好友给我们发送的消息同样也有代理方法回调
![](https://img.haomeiwen.com/i1151289/5f1a86e4be610574.png)
在这里通过调用showMessage: 方法把消息进行封装后放进数组中
![](https://img.haomeiwen.com/i1151289/90056787c5bd1066.png)
9、好友聊天之历史聊天记录
现在如果获取聊天记录呢?其实我们的聊天记录都保存在服务器中,通过coreData的方式保存。
我们首先要在XMPPManager中创建一个信息归档对象,即XMPPMessageArchiving。在init方法中初始化XMPPMessageArchiving、激活通信通道以及创建数据管理器
![](https://img.haomeiwen.com/i1151289/becb5674db3e74d9.png)
在进入聊天记录界面时,我们要先检索一下历史聊天记录。显示在tableView中。
![](https://img.haomeiwen.com/i1151289/684b9ae3b7780817.png)
![](https://img.haomeiwen.com/i1151289/9a4c0f2d11fa6a10.png)
具体的cell中的显示代码,请参考Demo.
注:1、如果Openfire服务器一直打不开请参考 http://blog.csdn.net/winer888/article/details/49886281
参考代码下载链接 http://pan.baidu.com/s/1geIhcEv
如果问题,请加QQ2912653129,备注写解决问题,和我单独沟通哦。