• IOS 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协议的实现部分,简单的列举一下要使用到的方法:

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

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

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


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

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

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

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

  • 相关阅读:
    报警界面
    09 | 基础篇:怎么理解Linux软中断?
    08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
    07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
    06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
    05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
    scrapy相关:splash安装 A javascript rendering service 渲染
    MongoDB 及 scrapy 应用
    scrapy相关 通过设置 FEED_EXPORT_ENCODING 解决 unicode 中文写入json文件出现`uXXXX`
    wb 黑名单批量操作
  • 原文地址:https://www.cnblogs.com/cokecoffe/p/2651645.html
Copyright © 2020-2023  润新知