近期一网友说一起研究XMPP协议,然后就花了点时间 研究了研究,其实也谈不上研究XMPP协议,就是简单的在IOS平台上使用而已。不过一切都得从使用开始,然后才能深入研究。
关于XMPP的介绍,我找了些资料
简介:http://www.cnblogs.com/cokecoffe/archive/2012/08/19/2646245.html
实现:http://www.cnblogs.com/cokecoffe/archive/2012/08/19/2646280.html
比较具体的: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里,这样方便在任何类中调用。
看图吧:
![](http://cdn.sm-img5.com/?src=http%3A%2F%2Fpic002.cnblogs.com%2Fimages%2F2012%2F400647%2F2012082622553041.png&restype=3&from=derive&pi=)
关键部分就是XMPPDelegate协议的实现部分,简单的列举一下要使用到的方法:
11.关于连接的 2//此方法在stream开始连接服务器的时候调用 3 - (void)xmppStreamDidConnect:(XMPPStream *)sender 4//此方法在stream连接断开的时候调用 5 - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error;
62.关于验证的 7//验证失败后调用 8 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error 9//验证成功后调用10 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
113.关于通信的 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.这个问题就比较诡异了,我发现我只要给好友发送消息,对方就显示我已经下线了。
找了许久,就查发送消息那块,死活没问题啊。一个星期后,偶然看起来好友列表里显示的好友地址不对,原来,好友名和域名少了个@符号。
结果导致了这诡异的问题。真是粗心。
基本上就总结了这些,因为我写再多也不如自己亲身实验,所以大家多多实验,遇到问题可以交流。本人比较在乎文章产生的影响,不希望误导别人,也不希望被人误导。所以大家如果读到此文章,要慎重阅读,并且敢于提出质疑。如果这里有什么不妥的地方,欢迎指出。
国内也有几个教程,基本也是参考上面提到的那个国外的教程。大同小异,写的也不错,可以参考。