一、什么是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
注:如果Openfire一直打不开,请参考 http://blog.csdn.net/winer888/article/details/49886281
然后我们要创建数据库,首先安装XAMPP。安装成功后,点击XAMPP图标
由于我们的服务器是Openfire,所以这个数据库格式要是Openfire的数据库格式。
然后进入到XAMPP界面。导入数据库格式
然后我们继续配置Openfire,修改数据库URL和用户名密码。
特性设置选择初始设置,点击继续。
点击登录到管理控制台,输入用户名(admin)和密码。这样就进入了Openfire的后台管理控制平台。
三、安装和使用Spark客户端
Spark是一个实时通讯客户端。我们可以通过Spark来进行即时通讯。安装好Spark后,登录Spark
通过登录admin账号,也就可以说明,Openfire的服务器配置是成功的。
四、代码实现客户端
服务器用Openfire实现了,下面我们用代码创建即时通讯客户端
1、前期准备
新建一个工程,导入XMPP框架到工程,进入XMPP框架下XMPPConfig.h文件中,将服务器IP地址,端口号、域名、resource做一下修改。
然后导入一些框架
CoreData.framework、libxml2.tbd、libresolv.tbd、libidn.a
修改一下Header Search Path
添加一个PCH文件,命名为PrefixHeader.pch,修改一下路径
然后在PCH文件中添加 #import头文件
command+b一下,会有一个红色报错,点击红色报错,由于重名,所以进所以将SCNetworkReachabilityFlags改成SCNetworkReachabilityFlags1,
command+b后没有报错。这样我们的准备工作就做好了
2、创建一个管理类,便于我们去将代码分类管理
创建一个XMPPManager单例类,继承于NSObject。这个类是这个工程中的核心功能代码。
首先要在XMPPManager中创建一个通信通道属性,即XMPPStream。这个实例是传输数据的,只有通信通道是连通的那么才可以进行数据的传输,XMPPStream也是XMPP的核心类。在XMPPManager.m中的init方法中,进行初始化XMPPStream,并指定服务器IP、端口和设置代理
然后遵循XMPPStreamDelegate协议。
不管我们做什么操作,首先一定要让客户端通过账号和服务器连接,并且连接成功。
与服务器的连接状态是通过代理方法返回,有连接成功和连接超时
3、登录功能
如果服务器连接成功,那么就可以进行登录操作了。登录操作其实就是要从服务器中验证一下账号和密码是否匹配。
在连接成功的方法中,验证账号和密码
验证的结果也是通过代理方法返回,如果验证成功的话需要给服务器发送一个上线状态
如果验证成功,就可以在Openfire后台管理控制平台看到,那个用户变绿了,即上线了。
4、注册功能
注册和登录类似,在之前都要确保与服务器连接。连接服务器后,需要将注册的密码传给服务器,进行注册
注册后的结果也是代理方法可以返回的
5、获取好友列表
好友列表,我们需要通过花名册类去获取,即XMPPRoster。
首先在manager单例类中创建XMPPRoster实例,激活通信通道,并设置代理
遵循XMPPRosterDelegate协议。其中有三个代理方法
在检索到好友的代理方法中,执行一次只会有一个好友。
然后在FriendTableView中显示。具体代码见Demo
6、添加好友功能
首先通过好友的账号,将其封装成JID对象,然后调用addUser:withNicknama 方法,添加好友
7、接受到好友请求
当A账号添加B账号为好友,那么B就应该得到一个好友请求。然后对其进行选择,同意或者拒绝。这个会通过代理方法回调
在这个代理方法中,要做同意好友请求或者拒绝好友请求,这里我用了alertController进行选择
8、好友聊天--发送消息和接受到消息
要想发送消息,首先要知道对方的JID,这里的JID是上个界面传过来的。通过调用通信通道的sendElement:方法就可以进行发送消息
发送后,就会通过代理方法回调。好友给我们发送的消息同样也有代理方法回调
在这里通过调用showMessage: 方法把消息进行封装后放进数组中
9、好友聊天之历史聊天记录
现在如果获取聊天记录呢?其实我们的聊天记录都保存在服务器中,通过coreData的方式保存。
我们首先要在XMPPManager中创建一个信息归档对象,即XMPPMessageArchiving。在init方法中初始化XMPPMessageArchiving、激活通信通道以及创建数据管理器
在进入聊天记录界面时,我们要先检索一下历史聊天记录。显示在tableView中。
具体的cell中的显示代码,请参考Demo.
注:1、如果Openfire服务器一直打不开请参考 http://blog.csdn.net/winer888/article/details/49886281
参考代码下载链接 http://pan.baidu.com/s/1geIhcEv
如果问题,请加QQ2912653129,备注写解决问题,和我单独沟通哦。