XMPP使用注意实践问题

 近期一网友说一起研究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里,这样方便在任何类中调用。

      看图吧:

      关键部分就是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.这个问题就比较诡异了,我发现我只要给好友发送消息,对方就显示我已经下线了。

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

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

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

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

      http://blog.csdn.net/kangkangz4/article/details/7740135


       XMPP Framework 框架下载 https://github.com/cokecoffe/XMPPFramework
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值