XMPPFramework 介绍

因为想找XMPPFramework的API文档,但是貌似真的不好找,找到一个ebook还收费,所以先把github上它自己的一篇介绍文翻译一下,拿来入个门。

1. 简介

framework被分为两个部分

  • xmpp core:核心部分
  • extensions:扩展部分,包括roster,XEP’s,supporting utilities

XMPP Core

主要的类

  • XMPPStream
  • XMPPParser
  • XMPPJID
  • XMPPElement
  • XMPPIQ
  • XMPPMessage
  • XMPPPresence
  • XMPPModule
  • XMPPLoging
  • XMPPInternal

XMPPStream是整个框架的核心。是我们最常打交道的类,并且其他的扩展和自定义的代码都是对这个类进行扩展的。为了获得良好的灵活性,可扩展性,开发者为XMPPStream设计了很多很有趣的特性。

XMPPParser是被XMPPStream所调用的一个类,主要就是用来对XMPP的数据流进行解析,我们在使用这个库时,不需要与XMPPParser进行交互

XMPPJID是对JID的一个不可变的实现。可以对JID进行解析和生成。

1
2
3
@property (strong, readonly) NSString *user;
@property (strong, readonly) NSString *domain;
@property (strong, readonly) NSString *resource;

XMPPElement是三个XMPP基本节点:XMPPMessage,XMPPIQ,XMPPPresence,的基类。XMPPElements继承自NSXMLElement。

XMPPModule是为了扩展提供了一个基类,也就是说,当我们需要自定义一些新的功能时,我们只需要在XMPPModule之上进行我们自己的定制,

XMPPLogging提供一个很好的log的框架

XMPPInternal核心的一些内部实现和底层的扩展

IQ,Message,Presence

  • XMPPIQ ->XMPPElement -> NSXMLElement -> NSEXLNode -> NSObject
  • XMPPMessage ->XMPPElement -> NSXMLElement -> NSEXLNode -> NSObject
  • XMPPPresence ->XMPPElement -> NSXMLElement -> NSEXLNode -> NSObject

这三个类的整体功能都是一定的,所以直接查看源码就可以十分清晰整体的用法了

添加Delegate

multicastDelegate

XMPPFramework需要支持很多扩展,这些扩展包括原本就在framework里面的,以及我们自定义的代码。因此,传统的委托模式无法满足这种情况。因为XMPPModule和自定义代码需要封装在自己的类中,但是这些类都要接收delegate的方法。当向delegate 发送信息时,时NSNotification架构就无法工作了,因为一些delegates需要一个返回值(这里有点搞不懂,不知道为什么原因是return variables)。很明显当有多个扩展的对象时,面对多个未知的类,原本的委托模式是无法应对的

因此 multicastDelegate就是一个相当优美的解决方式,下面是代码

1
<br /><br />[_xpStream addDelegate:self delegateQueue:dispatch_get_main_queue()];<br /><br />[_xpStream removeDelegate:self];<br /><br />

添加Modules

在framework里面已经为我们定义好了很多的扩展,可以直接使用这些扩展,也可以自己随便写任意多的扩展

  • XMPPReconnect:当连接意外断掉的时候自动重连
  • XMPPRoster:支持标准的xmpp花名册
  • XMPPRoom:多用户聊天
  • XMPPPubSub:发布和订阅
1
XMPPReconnect *reconnect = [[XMPPReconnect alloc]init];</p><p>[reconnect activate:self.xmppStream];</p><p>[reconnect addDelegate:self delegateQueue:dispatch_get_main_queue()];

Working with elements

XMPP协议本身并不是专用于即时通信的协议(虽然我们经常将其用于即时通信)。XMPP一个很重要的特性在于其可扩展性,XMPP可以完成很多各种各样的工作,因此如果XMPPFramework将所有的XML的细节都给封装了,即使这样会在一定程度上方便开发者,但是这样对于开发者来说根本无法去进行扩展,因此我们会在一定程度上和XML进行交互。

例如,目前我们有一个聊天软件,这个客户端可以发送用户当前心情,当心情是happy的时候,聊天气泡就显示为绿色,如果心情是angry,那么聊天气泡就是红色。这就是我们对原本的聊天的一种扩展,而这也十分容易实现。

1
2
3
4
<message to= 'group_chat@danisbook.local/danis' >
<body>I think it's very useful</body>
<mood>happy</mood>
</message>

现在当我们收到这条信息时,通过解析XML即可获得发送过来的详情

1
2
3
NSString *body = [[message elementForName:@ "body" ] stringValue];
 
NSString *mood = [[message elementForName:@ "mood" ] stringValue];

这样就获得了body和mood标签里面的数据

但是,通常我们希望能将xml的解析和GUI给分开,这样能够有更低的耦合。那么我们有一个很简单的方式,比如解决上面这个问题的方式,就是写一个XMPPMessage的类别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ interface XMPPMessage (ChatWithMood)
 
-(NSString *)mood;
 
@ end
 
-----------------------------------
 
@implementation XMPPMessage (ChatWithMood)
 
-(NSString *)mood{
 
return [[self elementForName:@ "mood" ]stringValue];
 
}
 
@ end

通过类别的方式,这样就很轻松的对message进行了扩展

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值