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
点击继续点击安装 安装成功后再偏好设置中就会有Openfire的图标。点击Openfire的图标
如果第一次安装Openfire,会发现Openfire的状态是停止的。点击Start Openfire,开启Openfire服务器
注:如果Openfire一直打不开,请参考 http://blog.csdn.net/winer888/article/details/49886281
当Status成为Running。 点击右边的Open Adimin Console。会进入Openfire的配置界面 选择中文,下一步服务器设置,如果是本机,域中填写127.0.0.1,其余的不用修改。下一步 选择标准数据库连接。下一步 这个地方需要我们链接一个数据库,在数据库驱动选项中选择MySQL。
然后我们要创建数据库,首先安装XAMPP。安装成功后,点击XAMPP图标
要开启XAMPP服务。点击Start All,然后当上面的MySQL Database、ProFTPD、Apache Web Server都变为绿色的Running就说明这些服务都已经开启了 点击Go To Application 进入XAMPP界面。选择左边的phpMyAdmin 新建一个数据库,并给数据库起一个名字由于我们的服务器是Openfire,所以这个数据库格式要是Openfire的数据库格式。
在前往文件夹中输入/usr/local 找到openfire文件夹,此时的Openfire文件夹是只读的。 右键显示简介,将共享和权限改成读与写 在openfire/resources/database/openfire_mysql.sql找到数据库格式文件。将这个文件复制到桌面然后进入到XAMPP界面。导入数据库格式
点击执行,这样就导入了Openfire数据库格式然后我们继续配置Openfire,修改数据库URL和用户名密码。
数据库URL,将[host-name]换成127.0.0.1。[database-name]换成数据库的名字。用户名默认root,密码无,点击继续特性设置选择初始设置,点击继续。
管理员账户,填写你的邮箱和密码(一定要记住哦)。点击继续,就配置好了Openfire服务器。点击登录到管理控制台,输入用户名(admin)和密码。这样就进入了Openfire的后台管理控制平台。
三、安装和使用Spark客户端
Spark是一个实时通讯客户端。我们可以通过Spark来进行即时通讯。安装好Spark后,登录Spark
服务器填写本机服务器地址127.0.0.1 登录成功后,进入Openfire后台管理界面,刷新页面,admin会变为绿色的,即上线状态(灰色为未上线状态)通过登录admin账号,也就可以说明,Openfire的服务器配置是成功的。
四、代码实现客户端
服务器用Openfire实现了,下面我们用代码创建即时通讯客户端
1、前期准备
新建一个工程,导入XMPP框架到工程,进入XMPP框架下XMPPConfig.h文件中,将服务器IP地址,端口号、域名、resource做一下修改。
注意:由于我们的服务器是本地的,所以填写127.0.0.1,域名要和Openfire填写域名一致。然后导入一些框架
CoreData.framework、libxml2.tbd、libresolv.tbd、libidn.a
修改一下Header Search Path
修改为/usr/include/libxml2添加一个PCH文件,命名为PrefixHeader.pch,修改一下路径
注意.pch在工程中的路径然后在PCH文件中添加 #import头文件
command+b一下,会有一个红色报错,点击红色报错,由于重名,所以进所以将SCNetworkReachabilityFlags改成SCNetworkReachabilityFlags1,
command+b后没有报错。这样我们的准备工作就做好了
修改前 修改后2、创建一个管理类,便于我们去将代码分类管理
创建一个XMPPManager单例类,继承于NSObject。这个类是这个工程中的核心功能代码。
首先要在XMPPManager中创建一个通信通道属性,即XMPPStream。这个实例是传输数据的,只有通信通道是连通的那么才可以进行数据的传输,XMPPStream也是XMPP的核心类。在XMPPManager.m中的init方法中,进行初始化XMPPStream,并指定服务器IP、端口和设置代理
然后遵循XMPPStreamDelegate协议。
不管我们做什么操作,首先一定要让客户端通过账号和服务器连接,并且连接成功。
连接服务器方法与服务器的连接状态是通过代理方法返回,有连接成功和连接超时
连接成功和超时3、登录功能
如果服务器连接成功,那么就可以进行登录操作了。登录操作其实就是要从服务器中验证一下账号和密码是否匹配。
在连接成功的方法中,验证账号和密码
验证的结果也是通过代理方法返回,如果验证成功的话需要给服务器发送一个上线状态
注意别忘了发送上线状态,available是上线状态如果验证成功,就可以在Openfire后台管理控制平台看到,那个用户变绿了,即上线了。
4、注册功能
注册和登录类似,在之前都要确保与服务器连接。连接服务器后,需要将注册的密码传给服务器,进行注册
向服务器注册需要在连接成功后注册后的结果也是代理方法可以返回的
5、获取好友列表
好友列表,我们需要通过花名册类去获取,即XMPPRoster。
首先在manager单例类中创建XMPPRoster实例,激活通信通道,并设置代理
在XMPPManger.m中的init方法中遵循XMPPRosterDelegate协议。其中有三个代理方法
在检索到好友的代理方法中,执行一次只会有一个好友。
要先判断是否两个人是否互为好友,再添加然后在FriendTableView中显示。具体代码见Demo
6、添加好友功能
首先通过好友的账号,将其封装成JID对象,然后调用addUser:withNicknama 方法,添加好友
7、接受到好友请求
当A账号添加B账号为好友,那么B就应该得到一个好友请求。然后对其进行选择,同意或者拒绝。这个会通过代理方法回调
如果有了好友请求,就会执行这个方法在这个代理方法中,要做同意好友请求或者拒绝好友请求,这里我用了alertController进行选择
8、好友聊天--发送消息和接受到消息
要想发送消息,首先要知道对方的JID,这里的JID是上个界面传过来的。通过调用通信通道的sendElement:方法就可以进行发送消息
chat代表聊天消息,addBody的消息体就是聊天消息发送后,就会通过代理方法回调。好友给我们发送的消息同样也有代理方法回调
在接收消息中要判断一下这个信息是否是这个好友发的在这里通过调用showMessage: 方法把消息进行封装后放进数组中
在发送了消息代理方法中,调用这个方法9、好友聊天之历史聊天记录
现在如果获取聊天记录呢?其实我们的聊天记录都保存在服务器中,通过coreData的方式保存。
我们首先要在XMPPManager中创建一个信息归档对象,即XMPPMessageArchiving。在init方法中初始化XMPPMessageArchiving、激活通信通道以及创建数据管理器
由于通过coredata存储聊天记录,所有要创建数据管理器在进入聊天记录界面时,我们要先检索一下历史聊天记录。显示在tableView中。
图1图2
具体的cell中的显示代码,请参考Demo.
注:1、如果Openfire服务器一直打不开请参考 http://blog.csdn.net/winer888/article/details/49886281
参考代码下载链接 http://pan.baidu.com/s/1geIhcEv
如果问题,请加QQ2912653129,备注写解决问题,和我单独沟通哦。