XMPPFramework所有的消息都是以xml的形式通过XMPPStream传递,数据的解析和包装都是基于xml文件操作,这里消息又被细分为了Message、Presence、IQ。

XMPPElement

XMPPElement是XMPP三大消息类型Message、Presence、IQ的基类,继承自NSXMLElement,值得注意的是在ios平台上采用更加高效的KissXML来代替NSXMLElement进行xml的解析。

协议实现:

  1. - (id)initWithCoder:(NSCoder *)coder

    NSCoding协议

    [coder decodeObjectForKey:@"xmlString"]解码成xml字符串

    用XMPPElement的initWithXMLString:转换成XMPPElement类型

    object_setClass将XMPPElement类型转换为XMPPElement类型

  2. - (void)encodeWithCoder:(NSCoder *)coder

    NSCoding协议

    调用compactXMLString将XMPPElement转化为压缩型xml字符串

    调用NSXMLElement的encodeObject对xml字符串进行编码

  3. - (id)copyWithZone:(NSZone *)zone

    NSCopy协议,由于XMPPElement继承自NSXMLElement,所以获得NSXMLElement类型的copy后,用object_setClass运行时将此备份转换为XMPPElement类型。

公开接口:

  1. 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:发送时间字符串
  2. 判断to或from是否相同的方法

XMPPMessage

message是一种基于推送消息方法,以作为元素,它不要求响应。主要用于IM、groupChat、alert和notification之类的应用中。

初始化

  1. + (XMPPMessage *)messageFromElement:(NSXMLElement *)element

    将NSXMLElement对象替换成XMPPMessage实例

    依然使用object_setClass

  2. - (id)initWithType:(NSString *)type to:(XMPPJID *)jid elementID:(NSString *)eid child:(NSXMLElement *)childElement

    以”message”初始化XML元素

    添加type、to、id属性

    插入子元素

接口

  1. 属性:type

    • normal:类似于email,主要特点是不要求响应;
    • chat:类似于qq里的好友即时聊天,主要特点是实时通讯;
    • groupchat:类似于聊天室里的群聊;
    • headline:用于发送alert和notification;
    • error:如果发送message出错,发现错误的实体会用这个类别来通知发送者出错了;
  2. 内容

    body、subject、bodyForlanguage、thread

  3. 添加子元素

    • - (void)addSubject:(NSString *)subject
    • - (void)addBody:(NSString *)body
    • - (void)addBody:(NSString *)body withLanguage:(NSString *)language
    • - (void)addThread:(NSString *)thread
  4. 类型判断

XMPPPresence

presence用来表明用户的状态,如:online、away、dnd(请勿打扰)等。要想接受presence消息,必须经过一个叫做presence subscription的授权过程。

属性:type

  • subscribe:订阅其他用户的状态
  • probe:请求获取其他用户的状态
  • unavailable:不可用,离线(offline)状态

内容:

  1. show:

    1. chat:聊天中
    2. away:暂时离开
    3. xa:extend Away,长时间离开
    4. dnd:勿打扰
  2. status:

    格式自由,可阅读的文本。也叫做rich presence或者extended presence,常用来表示用户当前心情,活动,听的歌曲,看的视频,所在的聊天室,访问的网页,玩的游戏等。

  3. 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: 查询和响应中出现的错误。

接口

  1. - (NSXMLElement *)childElement

    获取单个非错误信息的元素

  2. - (NSXMLElement *)childErrorElement

    获取错误信息的元素

参考

XMPP协议的原理介绍

XMPP JID 和通信原语有3种:MESSAGE、PRESENCE和IQ