iOS XMPP Framework 02 - 简介

XMPPFramework是一个用Objective-C实现的XMPP框架,用于Mac/iOS的开发。

XMPPFramework提供了了RFC-3920(XMPP标准)的核心实现,同时也提供了相应的工具用于读写XML。XMPPFramework基于模块化架构实现了多种扩展(XEP),使得用户可以为自己的功能插入需要的代码。此外,这个框架支持并发和线程间安全的。同时,由于使用了iOS的GCD(Grand Central Dispatch),使得这个框架可以在任意处理器平台上运行,无论是单核的iPhone还是12核的Mac Pro。

转载请注明出处:http://blog.csdn.net/yamingwu/article/details/43116549

框架的源码位于:https://github.com/robbiehanson/XMPPFramework/

XMPP框架由两部分组成:

  1. Core
  2. Extensions
XMPP Core
XMPP核心类存放在如下目录中,包括

  • XMPP框架最核心的代码是XMPPStream,这个类是我们用得最多的类,其它所有的extension和用户自定义代码都是插入到这个类之中。有一些有趣的设计使得使用者可以很方便的扩展框架和基于这个框架进行开发。
  • XMPPParser是XMPPStream使用的一个内部类,这个类用于解析收到的XML消息。
  • XMPPJID提供一个不可修改的JID(Jabber Identifier)实现。支持解析JID,以多种格式提取JID中的各种元素。它符合NSCopying协议,这样JID可以被用作NSDictionary中的关键字,它也符合NSCoding协议。
  • XMPPElement是3类最主要的XMPP元素(XMPPIQ, XMPPMessage, XMPPPresence)的基类。XMPPElement继承于NSXMLElement,这样,我们就拥有了整个NSXML提供的对XML的支持。
  • XMPPModule为可插入扩展提供了基础。如果我们完全是实现应用程序私有的逻辑,我们可以创建自己的类并注册到框架中成为消息的代理。但是,如果我们实现的是标准的XEP,或者我们希望应用程序的扩展是可插入的,我们就需要基于XMPPModule来开发。
  • XMPPLogging提供了一个非常快速、强大并且可扩展的日志框架。
  • XMPPInternal用于和core以及多种高级底层扩展相关的内部逻辑中。

XMPP Extensions 、Modules

Core目录中存放的是框架的核心代码。而与之相邻的Extensions目录则存放的是继承于XMPPModule类的Module类。Module是XMPP stack的扩展,通常代表一种XEP或者扩展协议。

XMPPFramework实现了大量的扩展,当然我们也可以添加我们自己的扩展。

现已支持的部分扩展如下:

  • XMPPRoster,提供标准的XMPP roster功能
  • XMPPReconnect,在链接意外中断后进行自动重连
  • XMPPRoom,支持multi room chat(MUC)
  • XMPPPubSub,实现Publish-Subscribe扩展

每一个扩展继承于XMPPModule类,在实现时需要follow以下的步骤:

创建module

xmppRoster = [[XMPPRoster alloc]init];

激活module

[xmppRoster activate:xmppStream];

选择性德将自己添加到代理列表中

[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];

在teardownStream中,将module从代理列表中移除并在将指针赋空前deactivate该模块

[xmppRoster removeDelegate:self]; 
[xmppRoster deactivate];
MulticastDelegate

XMPP是异步并发的框架,它有着一系列有趣的特性和功能,此刻,最有趣的应该是MulticastDelegate。接下来我们看看它是什么。

XMPP框架需要支持不限数量的扩展,这包括框架自带的标准扩展也包括开发人员自己实现的特殊扩展。这样,传统的代理模式不能满足这个需求。XMPP模块和扩展需要被分散到各个单独的类中,每个类需要实现代理函数来处理消息。标准的NSNotification架构也不能工作因为有些代理需要特定的返回值。此外,从notification中提取参数也是很繁琐的一件事。

MulticastDelegate允许我们使用标准的代理模式将模块或扩展插入到框架中,但是它支持多个类接收相同的代理通知。这样我们就不需要将所有的XMPP处理代码放到一个唯一的类中而可以将处理逻辑分散到多个类之中。

我们可以随时使用如下方法来将自己添加为XMPPStream的代理,也可以从XMPPStream的代理中移除:

[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
...
[xmppStream removeDelegate:self];
在将自己添加到代理列表中和,我们按需实现代理函数

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
可以看到整个过程和传统的代理模式类似,只是这里支持我们指定代理函数执行的线程相关信息

如果我们想将代理处理函数移除主线程上下文,做如下修改即可

[xmppStream addDelegate:bgProcessor delegateQueue:bgProcessorQueue()];

这一节我们XMPP框架的一些基本概念,下一节我们将创建一个真实的XMPP应用程序。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值