XMPPFramework源码分析<一> - 消息
XMPPFramework所有的消息都是以xml的形式通过XMPPStream传递,数据的解析和包装都是基于xml文件操作,这里消息又被细分为了Message、Presence、IQ。
XMPPElement
XMPPElement是XMPP三大消息类型Message、Presence、IQ的基类,继承自NSXMLElement,值得注意的是在ios平台上采用更加高效的KissXML来代替NSXMLElement进行xml的解析。
协议实现:
- (id)initWithCoder:(NSCoder *)coder
NSCoding协议
用
[coder decodeObjectForKey:@"xmlString"]
解码成xml字符串用XMPPElement的
initWithXMLString:
转换成XMPPElement类型object_setClass
将XMPPElement类型转换为XMPPElement类型- (void)encodeWithCoder:(NSCoder *)coder
NSCoding协议
调用
compactXMLString
将XMPPElement转化为压缩型xml字符串调用NSXMLElement的
encodeObject
对xml字符串进行编码- (id)copyWithZone:(NSZone *)zone
NSCopy协议,由于XMPPElement继承自NSXMLElement,所以获得NSXMLElement类型的copy后,用
object_setClass
运行时将此备份转换为XMPPElement类型。
公开接口:
- Jabber通信中常用的属性方法,包括elementID、to、from、guid、toStr、fromStr、guidStr、timeStr,通过XML解析相应元素的方式来提供。
- elementID:元素id
- to:解析后的收件人JID模型(从toStr生成)
- from:解析后的发件人JID模型(从fromStr生成)
- guid:全局唯一标志符
- toStr:发件人JID字符串
- fromStr:收件人JID字符串
- guidStr:guid字符串
- timeStr:发送时间字符串
- 判断to或from是否相同的方法
XMPPMessage
message是一种基于推送消息方法,以
初始化
+ (XMPPMessage *)messageFromElement:(NSXMLElement *)element
将NSXMLElement对象替换成XMPPMessage实例
依然使用
object_setClass
- (id)initWithType:(NSString *)type to:(XMPPJID *)jid elementID:(NSString *)eid child:(NSXMLElement *)childElement
以”message”初始化XML元素
添加type、to、id属性
插入子元素
接口
属性:type
- normal:类似于email,主要特点是不要求响应;
- chat:类似于qq里的好友即时聊天,主要特点是实时通讯;
- groupchat:类似于聊天室里的群聊;
- headline:用于发送alert和notification;
- error:如果发送message出错,发现错误的实体会用这个类别来通知发送者出错了;
内容
body、subject、bodyForlanguage、thread
添加子元素
- (void)addSubject:(NSString *)subject
- (void)addBody:(NSString *)body
- (void)addBody:(NSString *)body withLanguage:(NSString *)language
- (void)addThread:(NSString *)thread
类型判断
XMPPPresence
presence用来表明用户的状态,如:online、away、dnd(请勿打扰)等。要想接受presence消息,必须经过一个叫做presence subscription的授权过程。
属性:type
- subscribe:订阅其他用户的状态
- probe:请求获取其他用户的状态
- unavailable:不可用,离线(offline)状态
内容:
show:
- chat:聊天中
- away:暂时离开
- xa:extend Away,长时间离开
- dnd:勿打扰
status:
格式自由,可阅读的文本。也叫做rich presence或者extended presence,常用来表示用户当前心情,活动,听的歌曲,看的视频,所在的聊天室,访问的网页,玩的游戏等。
priority:
范围-128~127。高优先级的resource能接受发送到bare JID的消息,低优先级的resource不能。优先级为负数的resource不能收到发送到bare JID的消息。
XMPPIQ
一种请求/响应机制,从一个实体发送请求,另外一个实体接受请求,并进行响应。例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果。
属性:type
- Get :获取当前域值。类似于http get方法。
- Set :设置或替换get查询的值。类似于http post方法。
- Result :说明成功的响应了先前的查询。类似于http状态码200。
- Error: 查询和响应中出现的错误。
接口
- (NSXMLElement *)childElement
获取单个非错误信息的元素
- (NSXMLElement *)childErrorElement
获取错误信息的元素