近期一网友说一起研究XMPP协议,然后就花了点时间 研究了研究,其实也谈不上研究XMPP协议,就是简单的在IOS平台上使用而已。不过一切都得从使用开始,然后才能深入研究。

  关于XMPP的介绍,我找了些资料

比较具体的:http://wiki.jabbercn.org/index.php?title=RFC3920&variant=zh-cn

 


  

至于在IOS上的应用,参考了国外这个教程:

http://mobile.tutsplus.com/tutorials/iphone/building-a-jabber-client-for-ios-interface-setup/

从从服务器搭建,到客户端实现,一共有四个步骤。服务器搭建基本没有什么大问题,细心一点,关键是剩下的三步。

教程使用的xmpp framework不是最新的,所以如果你现在从Github上下载最新的XMPP Framework的话,应该是会出不少问题。

比如就说导入框架的时候,教程简单的说把几个文件夹托进去就可以。但是等实际操作的时候,会发现,这么做的话会引起很多编译报错。

所以呢,最好按照https://github.com/cokecoffe/XMPPFramework说明里的

Getting started using XMPPFramework on iOS

一步步来导入Framework,记住每做一步都要编译一下验证是否没有编译报错,要不等把所有框架都加进去后,再编译,到时候错误很难查出,我就在这上面浪费了不少时间。

 

剩下就是客户端的创建了。先大概了解下程序的框架,主要是有三个界面,一个登陆,一个好友列表,一个聊天界面。

程序与服务器交互,我们把协议实现在AppDelegate里,这样方便在任何类中调用。

看图吧:

ios xmpp 发送消息 ios xmpp协议_编译报错

关键部分就是XMPPDelegate协议的实现部分,简单的列举一下要使用到的方法:

1 1.关于连接的
 2 //此方法在stream开始连接服务器的时候调用
 3 - (void)xmppStreamDidConnect:(XMPPStream *)sender
 4 //此方法在stream连接断开的时候调用
 5 - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error;

 6 2.关于验证的
 7 //验证失败后调用
 8 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
 9 //验证成功后调用
10 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender


11 3.关于通信的
12 //收到消息后调用
13 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
14 //接受到好友状态更新
15 - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence

 


 

之后就是具体去实现了。我在实现过程遇到了各种问题,虽然不大,但是很不好解决。因为资料甚少。

下面是我遇到的几个问题:

1.在收到消息后,

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message

会被调用,然后就是解析message,提取消息的类型、内容等信息。

按教程来,等好友发送消息过来的时候,提取body的时候,会发现会挂掉。打印出message没有body一项。

这是因为好友的聊天输入框激活的时候就会给我们发送消息,这个时候的消息里没有body一项,所以[message elementForName:@"body"]返回nil,然后我又把nil添加到了NSDictionary里,所以挂掉了。

后来看官方的Demo里,有这样一个方法[message isChatMessageWithBody],方法作用正如其名。

所以在转发消息之前,先判断下,就ok。

 

2.教程里的好友页面,-(void)viewDidAppear:(BOOL)animated方法里会调用connect。

也就是每次好友页面出现都会connect。这里虽然不会导致程序crash掉,但是stream会重复建立,有可能消息会收不到。

所以我在connect方法里加以判断,如果stream!=nil,直接return。

 

3.这个问题就比较诡异了,我发现我只要给好友发送消息,对方就显示我已经下线了。

找了许久,就查发送消息那块,死活没问题啊。一个星期后,偶然看起来好友列表里显示的好友地址不对,原来,好友名和域名少了个@符号。

结果导致了这诡异的问题。真是粗心。

 


 

基本上就总结了这些,因为我写再多也不如自己亲身实验,所以大家多多实验,遇到问题可以交流。本人比较在乎文章产生的影响,不希望误导别人,也不希望被人误导。所以大家如果读到此文章,要慎重阅读,并且敢于提出质疑。如果这里有什么不妥的地方,欢迎指出。

国内也有几个教程,基本也是参考上面提到的那个国外的教程。大同小异,写的也不错,可以参考。


 XMPP Framework 框架下载 https://github.com/cokecoffe/XMPPFramework