在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言:这两天看了XMPP框架,查阅了一些资料,写下这篇文章记录一下学习笔记
一、简要解析XMPP核心部分 XMPP框架分为两个部分 1.核心部分 2.扩展部分 扩展部分主要讲好友列表(roster)、自动重连(automatic reconnect)、还有一些其他的实现。 核心部分包括以下部分:
1.XMPPStream XMPPStream类相当于输入输出流,用于连接服务器并发送消息。 XMPPStream添加和移除代理写了方法 1 - (void)addDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue; 2 - (void)removeDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue; 3 - (void)removeDelegate:(id)delegate;
XMPP底层就是socket,所以XMPPStream实现了socket协议<GCDAsyncSocketDelegate> 初始化方法 - (id)init { if ((self = [super init])) { // Common initialization [self commonInit]; // Initialize socket asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:xmppQueue]; } return self; } XMPPStream包含的一些属性 /** Jabber ID 用于表示用户身份的地址 */ @property (readwrite, copy) XMPPJID *myJID; @property (readwrite, copy) NSString *hostName;
/** 要连接的服务器的端口号 默认为5222*/
2.XMPPParser XMPPParser,是XMPPStream的解析器,解析传递的信息
3.XMPPJID 在XMPP协议中表示一个地址,由以下三个部分组成 node/username:表示一个向服务器或网关和使用网络服务的实体(节点、用户名,用户的基本标识) domain:表示网络中的网关或者服务器(例如一个JID,username@domain/resource,domian即后面的域名) resource:表示一个特定的回话(或者某个设备),连接(或地址),或者一个附属于某个节点ID实体相关的实体对象(或者多人聊天室中的参与者),可用于区分用户的设备等 还有定义的其他属性, Bare:就是node+domain,username@domain,即JID除去resource Full:一个完整的JID,包含username,domain,resource,比Bare多了resource
XMPPJID源码的一个枚举,看数字和,很好理解 enum XMPPJIDCompareOptions { XMPPJIDCompareUser = 1, // 001 XMPPJIDCompareDomain = 2, // 010 XMPPJIDCompareResource = 4, // 100 XMPPJIDCompareBare = 3, // 011 XMPPJIDCompareFull = 7, // 111 }; XMPPJID使用了解档,归档,遵守了<NSCoding, NSCopying>协议
4.XMPPElement XMPPElement是3个基本元素(IQ,Message,Presence)的基类 继承自NSXMLElement 配合分类NSXMLElement+XMPP使用可以让代码更简洁和提高可读性
5.XMPPIQ 请求 主要属性是type(Message和Presence一样,表示请求或者消息的类型) <iq Type="result" from="[email protected]/contact" type属性:说明了该iq类型为get,像服务端请求信息 from属性:小心来源,=JID to属性:消息目标,=服务器域名 id属性,可选,标记该请求ID,当服务器处理完毕请求get类型的iq后,响应的result类型iq和ID与请求iq的ID相同
6.Message <message />节定义了消息语义,<message />节可被看作“推”机制,与Email系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者 message用于“发送后即忘”的传输(发送后不验证消息是否接收成功),这样的传输主要应用与人类可读的文本、警告、通知等信息。
<message to="[email protected]/contact" type="chat"> <body> hello < body/> <meesage/>
7.Presence <presence from=""> <show>显示的内容<show/> <status>显示的状态<status/> <presence/> presence的状态 available上线 away离开 do not disturb忙碌 unavailable 下线
二、导入XMPP框架 XMPP在github-wiki上说明的步骤过期了 但是给出了指向stack flow回答的连接 http://stackoverflow.com/questions/9091767/up-to-date-instructions-on-how-to-install-xmppframework-manually/30543948#30543948
步骤1 必须导入Xcode的文件夹
也可以导入Extensions,可选 导入的时候要选择复制进项目中
步骤2 导入头文件XMPPFramework.h,也要赋值选项 导入完的框架
步骤3 要导入以下的自带框架和库
注意,在项目Xcode8之后的Xcode9 库的dylib后缀名改为thd,可能要重新导入
步骤4 Build Settings中要添加 other linker flags = -lxml2 HEADER SEARCH PATHS = /usr/include/libxml2
注意最后还要导入<UIKit/UIkit.h>
三、简要使用XMPP框架 这里省略配置服务器(用的是openfire)和数据库(mysql)步骤,网上很多教程
步骤1 连接服务器 - (void)connect {
连接成功后悔调用XMPPStreamDelegate的方法 首先会调用 - (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket 然后会调用 - (void)xmppStreamDidConnect:(XMPPStream *)sender
步骤2 连接成功后,发送密码授权 -(void)sendPwdToHost{ NSError *err = nil; //YBUserInfo是自定义数据类型,用于存储用户名、密码等属性 // 从单例里获取密码 NSString *pwd = [YBUserInfo sharedWCUserInfo].pwd; //使用XMPPStream发送密码 [_xmppStream authenticateWithPassword:pwd error:&err]; if (err) { NSLog(@"%@",err); } }
步骤3 授权成功后,发送消息 -(void)sendOnlineToHost{
XMPPPresence *presence = [XMPPPresence presence];
[_xmppStream sendElement:presence];
}
与服务器断开连接会调用代理方法 -(void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
授权成功会调用方法 -(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
授权失败会调用方法 -(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
注册成功会调用方法 -(void)xmppStreamDidRegister:(XMPPStream *)sender
注册失败会调用方法 -(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
退出并断开连接 - (void)disconnect { XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; [self.xmppStream sendElement:presence]; [self.xmppStream disconnect]; }
写这篇博文目的是加深自己对XMPP的理解 查了一些资料,很多都是全英的,还是要学好英语
转载请注明出处 |
请发表评论