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

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第1张图片
点击继续
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第2张图片
点击安装
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第3张图片
安装成功后再偏好设置中就会有Openfire的图标。点击Openfire的图标
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第4张图片
如果第一次安装Openfire,会发现Openfire的状态是停止的。点击Start Openfire,开启Openfire服务器

注:如果Openfire一直打不开,请参考  http://blog.csdn.net/winer888/article/details/49886281

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第5张图片
当Status成为Running。 点击右边的Open Adimin Console。会进入Openfire的配置界面
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第6张图片
选择中文,下一步
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第7张图片
服务器设置,如果是本机,域中填写127.0.0.1,其余的不用修改。下一步
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第8张图片
选择标准数据库连接。下一步
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第9张图片
这个地方需要我们链接一个数据库,在数据库驱动选项中选择MySQL。

然后我们要创建数据库,首先安装XAMPP。安装成功后,点击XAMPP图标

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第10张图片
要开启XAMPP服务。点击Start All,然后当上面的MySQL Database、ProFTPD、Apache Web Server都变为绿色的Running就说明这些服务都已经开启了
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第11张图片
点击Go To Application
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第12张图片
进入XAMPP界面。选择左边的phpMyAdmin
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第13张图片
新建一个数据库,并给数据库起一个名字

由于我们的服务器是Openfire,所以这个数据库格式要是Openfire的数据库格式。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第14张图片
在前往文件夹中输入/usr/local
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第15张图片
找到openfire文件夹,此时的Openfire文件夹是只读的。
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第16张图片
右键显示简介,将共享和权限改成读与写
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第17张图片
在openfire/resources/database/openfire_mysql.sql找到数据库格式文件。将这个文件复制到桌面

然后进入到XAMPP界面。导入数据库格式

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第18张图片
点击执行,这样就导入了Openfire数据库格式

然后我们继续配置Openfire,修改数据库URL和用户名密码。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第19张图片
数据库URL,将[host-name]换成127.0.0.1。[database-name]换成数据库的名字。用户名默认root,密码无,点击继续

特性设置选择初始设置,点击继续。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第20张图片
管理员账户,填写你的邮箱和密码(一定要记住哦)。点击继续,就配置好了Openfire服务器。

点击登录到管理控制台,输入用户名(admin)和密码。这样就进入了Openfire的后台管理控制平台。

三、安装和使用Spark客户端

Spark是一个实时通讯客户端。我们可以通过Spark来进行即时通讯。安装好Spark后,登录Spark

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第21张图片
服务器填写本机服务器地址127.0.0.1
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第22张图片
登录成功后,进入Openfire后台管理界面,刷新页面,admin会变为绿色的,即上线状态(灰色为未上线状态)

通过登录admin账号,也就可以说明,Openfire的服务器配置是成功的。

四、代码实现客户端

服务器用Openfire实现了,下面我们用代码创建即时通讯客户端

1、前期准备

新建一个工程,导入XMPP框架到工程,进入XMPP框架下XMPPConfig.h文件中,将服务器IP地址,端口号、域名、resource做一下修改。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第23张图片
注意:由于我们的服务器是本地的,所以填写127.0.0.1,域名要和Openfire填写域名一致。

然后导入一些框架

CoreData.framework、libxml2.tbd、libresolv.tbd、libidn.a

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第24张图片

修改一下Header Search Path

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第25张图片
修改为/usr/include/libxml2

添加一个PCH文件,命名为PrefixHeader.pch,修改一下路径

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第26张图片
注意.pch在工程中的路径

然后在PCH文件中添加 #import头文件

command+b一下,会有一个红色报错,点击红色报错,由于重名,所以进所以将SCNetworkReachabilityFlags改成SCNetworkReachabilityFlags1,

command+b后没有报错。这样我们的准备工作就做好了

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第27张图片
修改前
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第28张图片
修改后

2、创建一个管理类,便于我们去将代码分类管理

创建一个XMPPManager单例类,继承于NSObject。这个类是这个工程中的核心功能代码。

首先要在XMPPManager中创建一个通信通道属性,即XMPPStream。这个实例是传输数据的,只有通信通道是连通的那么才可以进行数据的传输,XMPPStream也是XMPP的核心类。在XMPPManager.m中的init方法中,进行初始化XMPPStream,并指定服务器IP、端口和设置代理

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第29张图片

然后遵循XMPPStreamDelegate协议。

不管我们做什么操作,首先一定要让客户端通过账号和服务器连接,并且连接成功。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第30张图片
连接服务器方法

与服务器的连接状态是通过代理方法返回,有连接成功和连接超时

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第31张图片
连接成功和超时

3、登录功能

如果服务器连接成功,那么就可以进行登录操作了。登录操作其实就是要从服务器中验证一下账号和密码是否匹配。

在连接成功的方法中,验证账号和密码

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第32张图片

验证的结果也是通过代理方法返回,如果验证成功的话需要给服务器发送一个上线状态

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第33张图片
注意别忘了发送上线状态,available是上线状态

如果验证成功,就可以在Openfire后台管理控制平台看到,那个用户变绿了,即上线了。

4、注册功能

注册和登录类似,在之前都要确保与服务器连接。连接服务器后,需要将注册的密码传给服务器,进行注册

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第34张图片
向服务器注册需要在连接成功后

注册后的结果也是代理方法可以返回的

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第35张图片

5、获取好友列表

好友列表,我们需要通过花名册类去获取,即XMPPRoster。

首先在manager单例类中创建XMPPRoster实例,激活通信通道,并设置代理

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第36张图片
在XMPPManger.m中的init方法中

遵循XMPPRosterDelegate协议。其中有三个代理方法

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第37张图片

在检索到好友的代理方法中,执行一次只会有一个好友。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第38张图片
要先判断是否两个人是否互为好友,再添加

然后在FriendTableView中显示。具体代码见Demo

6、添加好友功能

首先通过好友的账号,将其封装成JID对象,然后调用addUser:withNicknama 方法,添加好友

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第39张图片

7、接受到好友请求

当A账号添加B账号为好友,那么B就应该得到一个好友请求。然后对其进行选择,同意或者拒绝。这个会通过代理方法回调

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第40张图片
如果有了好友请求,就会执行这个方法

在这个代理方法中,要做同意好友请求或者拒绝好友请求,这里我用了alertController进行选择

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第41张图片

8、好友聊天--发送消息和接受到消息

要想发送消息,首先要知道对方的JID,这里的JID是上个界面传过来的。通过调用通信通道的sendElement:方法就可以进行发送消息

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第42张图片
chat代表聊天消息,addBody的消息体就是聊天消息

发送后,就会通过代理方法回调。好友给我们发送的消息同样也有代理方法回调

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第43张图片
在接收消息中要判断一下这个信息是否是这个好友发的

在这里通过调用showMessage: 方法把消息进行封装后放进数组中

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第44张图片
在发送了消息代理方法中,调用这个方法


9、好友聊天之历史聊天记录

现在如果获取聊天记录呢?其实我们的聊天记录都保存在服务器中,通过coreData的方式保存。

我们首先要在XMPPManager中创建一个信息归档对象,即XMPPMessageArchiving。在init方法中初始化XMPPMessageArchiving、激活通信通道以及创建数据管理器

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第45张图片
由于通过coredata存储聊天记录,所有要创建数据管理器

在进入聊天记录界面时,我们要先检索一下历史聊天记录。显示在tableView中。

iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第46张图片
图1
iOS XMPP协议即时通讯(Openfire服务器版)(佟力)_第47张图片
图2

具体的cell中的显示代码,请参考Demo.

注:1、如果Openfire服务器一直打不开请参考  http://blog.csdn.net/winer888/article/details/49886281

参考代码下载链接 http://pan.baidu.com/s/1geIhcEv

如果问题,请加QQ2912653129,备注写解决问题,和我单独沟通哦。

你可能感兴趣的:(iOS XMPP协议即时通讯(Openfire服务器版)(佟力))