因为想找XMPPFramework的API文档,但是貌似真的不好找,找到一个ebook还收费,所以先把github上它自己的一篇介绍文翻译一下,拿来入个门。
framework被分为两个部分
主要的类
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核心的一些内部实现和底层的扩展
这三个类的整体功能都是一定的,所以直接查看源码就可以十分清晰整体的用法了
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 />
|
在framework里面已经为我们定义好了很多的扩展,可以直接使用这些扩展,也可以自己随便写任意多的扩展
1
|
XMPPReconnect *reconnect = [[XMPPReconnect alloc]init];</p><p>[reconnect activate:self.xmppStream];</p><p>[reconnect addDelegate:self delegateQueue:dispatch_get_main_queue()];
|
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进行了扩展