XMPPFramework核心类介绍

XMPPFramework结构

在进入下一步之前,先给大家讲讲XMPPFramework的目录结构,以便新手们更容易读懂文章。我们来看看下图:

虽然这里有很多个目录,但是我们在开发中基本只关心Core和Extensions这两个目录下的类。各个目录主要用来干嘛的?

  • Authentication:这一看名字就知道与授权验证相关的。
  • Categories:主要是一些扩展,尤其是NSXMLElement+XMPP扩展是必备的。
  • Core:这里是XMPP的核心文件目录,我们最主要的目光还是要放在这个目录上。
  • Extensions:这个目录是XMPP的扩展,用于扩展各种协议和各种独立的功能,其下每个子目录都是对应的一个单独的子功能。我们最常用到的功能有Reconnect、Roster、CoreDataStorage等。
  • Utilities:都是辅助类,我们开发者不用关心这里。
  • Vendor:这个目录是XMPP所引用的第三方类库,如CocoaAsyncSocket、KissXML等,我们也不用关心这里。

阅读到此,对XMPPFramework的结构有所了解了吧!

概念知识

登录需要到账号,而所谓的账号其实就是用户唯一标识符(JID),在XMPP中使用XMPPJID类来表示。那么,用户唯一标识(JID)有什么组成?

JID一般由三部分构成:用户名,域名和资源名,格式为user@domain/resource,例如: test@example.com /Anthony。对应于XMPPJID类中的三个属性user、domain、resource。 

如果没有设置主机名(HOST),则使用JID的域名(domain)作为主机名,而端口号是可选的,默认是5222,一般也没有必要改动它。

XMPPStream类

我们要与服务器连接,就必须通过XMPPStream类了,它提供了很多的API和属性设置,通过socket来实现的。我们看到Verdor目录了吗,包含了CocoaAsyncSocket这个非常有名的socket编程库。XMPPStream类还遵守并实现了GCDAsyncSocketDelegate代理,用于客户端与服务器交互。

 
@interface XMPPStream : NSObject <GCDAsyncSocketDelegate>
 

当我们创建XMPPStream对象后,我们需要设置代理,才能回调我们的代理方法,这个是支持multicast delegate,也就是说对于一个XMPPStream对象,可以设置多个代理对象,其中协议是XMPPStreamDelegate:

 
- (void)addDelegate:(id)delegatedelegateQueue:(dispatch_queue_t)delegateQueue;
 

而当我们不希望某个XMPPStream对象继续接收到代理回调时,我们通过这样的方式来移除代理:

 
- (void)removeDelegate:(id)delegatedelegateQueue:(dispatch_queue_t)delegateQueue;
- (void)removeDelegate:(id)delegate;   

接下来,我们要设置主机和端口,通过设置这两个属性:

 
/**
* The server's hostname that should be used to make the TCP connection.
* 注释太长,简单说就是主机。这个属性是可选设置的,如果没有设置主机,默认会使用domain */ @property (readwrite, copy) NSString *hostName;   /** * The port the xmpp server is running on. * If you do not explicitly set the port, the default port will be used. * If you set the port to zero, the default port will be used. * * The default port is 5222. **/ @property (readwrite, assign) UInt16 hostPort;   

XMPPStream有XMPPJID类对象作为属性,标识用户,因为我们后续很多操作都需要到myJID:

 
@property (readwrite, copy) XMPPJID *myJID;
 

而管理用户在线状态的就交由XMPPPresence类了,它同样被作为XMPPStream的属性,组合到XMPPStream中,后续很多关于用户的操作是需要到处理用户状态的:

 
/**
* Represents the last sent presence element concerning the presence of myJID on the server. * In other words, it represents the presence as others see us. * * This excludes presence elements sent concerning subscriptions, MUC rooms, etc. * * @see resendMyPresence **/ @property (strong, readonly) XMPPPresence *myPresence;   

XMPPStreamDelegate

这个协议是非常关键的,我们的很多主要操作都集中在这个协议的代理回调上。它分为好几种类型的代理API,比如授权的、注册的、安全的等:

 
@protocol XMPPStreamDelegate
@optional
// 将要与服务器连接是回调
- (void)xmppStreamWillConnect:(XMPPStream *)sender;
 
// 当tcp socket已经与远程主机连接上时会回调此代理方法
// 若App要求在后台运行,需要设置XMPPStream's enableBackgroundingOnSocket属性 - (void)xmppStream:(XMPPStream *)sendersocketDidConnect:(GCDAsyncSocket *)socket;   // 当TCP与服务器建立连接后会回调此代理方法 - (void)xmppStreamDidStartNegotiation:(XMPPStream *)sender;   // TLS传输层协议在将要验证安全设置时会回调 // 参数settings会被传到startTLS // 此方法可以不实现的,若选择实现它,可以可以在 // 若服务端使用自签名的证书,需要在settings中添加GCDAsyncSocketManuallyEvaluateTrust=YES // - (void)xmppStream:(XMPPStream *)senderwillSecureWithSettings:(NSMutableDictionary *)settings;   // 上面的方法执行后,下一步就会执行这个代理回调 // 用于在TCP握手时手动验证是否受信任 - (void)xmppStream:(XMPPStream *)senderdidReceiveTrust:(SecTrustRef)trust                                       completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler;   // 当stream通过了SSL/TLS的安全验证时,会回调此代理方法 - (void)xmppStreamDidSecure:(XMPPStream *)sender;   // 当XML流已经完全打开时(也就是与服务器的连接完成时)会回调此代理方法。此时可以安全地与服务器通信了。 - (void)xmppStreamDidConnect:(XMPPStream *)sender;   // 注册新用户成功时的回调 - (void)xmppStreamDidRegister:(XMPPStream *)sender;   // 注册新用户失败时的回调 - (void)xmppStream:(XMPPStream *)senderdidNotRegister:(NSXMLElement *)error;   // 授权通过时的回调,也就是登录成功的回调 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender;   // 授权失败时的回调,也就是登录失败时的回调 - (void)xmppStream:(XMPPStream *)senderdidNotAuthenticate:(NSXMLElement *)error;   // 将要绑定JID resource时的回调,这是授权程序的标准部分,当验证JID用户名通过时,下一步就验证resource。若使用标准绑定处理,return nil或者不要实现此方法 - (id <XMPPCustomBinding>)xmppStreamWillBind:(XMPPStream *)sender;   // 如果服务器出现resouce冲突而导致不允许resource选择时,会回调此代理方法。返回指定的resource或者返回nil让服务器自动帮助我们来选择。一般不用实现它。 - (NSString *)xmppStream:(XMPPStream *)senderalternativeResourceForConflictingResource:(NSString *)conflictingResource;   // 将要发送IQ(消息查询)时的回调 - (XMPPIQ *)xmppStream:(XMPPStream *)senderwillReceiveIQ:(XMPPIQ *)iq; // 将要接收到消息时的回调 - (XMPPMessage *)xmppStream:(XMPPStream *)senderwillReceiveMessage:(XMPPMessage *)message; // 将要接收到用户在线状态时的回调 - (XMPPPresence *)xmppStream:(XMPPStream *)senderwillReceivePresence:(XMPPPresence *)presence;   /** * This method is called if any of the xmppStream:willReceiveX: methods filter the incoming stanza. * * It may be useful for some extensions to know that something was received, * even if it was filtered for some reason. **/ // 当xmppStream:willReceiveX:(也就是前面这三个API回调后),过滤了stanza,会回调此代理方法。 // 通过实现此代理方法,可以知道被过滤的原因,有一定的帮助。 - (void)xmppStreamDidFilterStanza:(XMPPStream *)sender;   // 在接收了IQ(消息查询后)会回调此代理方法 - (BOOL)xmppStream:(XMPPStream *)senderdidReceiveIQ:(XMPPIQ *)iq; // 在接收了消息后会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidReceiveMessage:(XMPPMessage *)message; // 在接收了用户在线状态消息后会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidReceivePresence:(XMPPPresence *)presence;   // 在接收IQ/messag、presence出错时,会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidReceiveError:(NSXMLElement *)error;   // 将要发送IQ(消息查询时)时会回调此代理方法 - (XMPPIQ *)xmppStream:(XMPPStream *)senderwillSendIQ:(XMPPIQ *)iq; // 在将要发送消息时,会回调此代理方法 - (XMPPMessage *)xmppStream:(XMPPStream *)senderwillSendMessage:(XMPPMessage *)message; // 在将要发送用户在线状态信息时,会回调此方法 - (XMPPPresence *)xmppStream:(XMPPStream *)senderwillSendPresence:(XMPPPresence *)presence;   // 在发送IQ(消息查询)成功后会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidSendIQ:(XMPPIQ *)iq; // 在发送消息成功后,会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidSendMessage:(XMPPMessage *)message; // 在发送用户在线状态信息成功后,会回调此方法 - (void)xmppStream:(XMPPStream *)senderdidSendPresence:(XMPPPresence *)presence;   // 在发送IQ(消息查询)失败后会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidFailToSendIQ:(XMPPIQ *)iqerror:(NSError *)error; // 在发送消息失败后,会回调此代理方法 - (void)xmppStream:(XMPPStream *)senderdidFailToSendMessage:(XMPPMessage *)messageerror:(NSError *)error; // 在发送用户在线状态失败信息后,会回调此方法 - (void)xmppStream:(XMPPStream *)senderdidFailToSendPresence:(XMPPPresence *)presenceerror:(NSError *)error;   // 当修改了JID信息时,会回调此代理方法 - (void)xmppStreamDidChangeMyJID:(XMPPStream *)xmppStream;   // 当Stream被告知与服务器断开连接时会回调此代理方法 - (void)xmppStreamWasToldToDisconnect:(XMPPStream *)sender;   // 当发送了</stream:stream>节点时,会回调此代理方法 - (void)xmppStreamDidSendClosingStreamStanza:(XMPPStream *)sender;   // 连接超时时会回调此代理方法 - (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender;   // 当与服务器断开连接后,会回调此代理方法 - (void)xmppStreamDidDisconnect:(XMPPStream *)senderwithError:(NSError *)error;   // p2p类型相关的 - (void)xmppStream:(XMPPStream *)senderdidReceiveP2PFeatures:(NSXMLElement *)streamFeatures; - (void)

转载于:https://www.cnblogs.com/lurenq/p/7026983.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值