简要解析XMPP框架及iOS-Objective-C的使用
前言:这两天看了XMPP框架,查阅了一些资料,写下这篇文章记录一下学习笔记
一、简要解析XMPP核心部分
XMPP框架分为两个部分
1.核心部分
2.扩展部分
扩展部分主要讲好友列表(roster)、自动重连(automatic reconnect)、还有一些其他的实现。
核心部分包括以下部分:
- XMPPStream
- XMPPParser
- XMPPJID
- XMPPElement
- XMPPIQ
- XMPPMessage
- XMPPPresence
- XMPPModule
- XMPPLogging
- XMPPInternal
1.XMPPStream
XMPPStream类相当于输入输出流,用于连接服务器并发送消息。
XMPPStream添加和移除代理写了方法
- (void)addDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
- (void)removeDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
- (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; /** 要连接的服务器的域名 格式为talk.google.com */
@property (readwrite, copy) NSString *hostName;
/** 要连接的服务器的端口号 默认为5222*/
@property (readwrite, assign) UInt16 hostPort;
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 = , // 001
XMPPJIDCompareDomain = , // 010
XMPPJIDCompareResource = , // 100 XMPPJIDCompareBare = , // 011
XMPPJIDCompareFull = , // 111
};
XMPPJID使用了解档,归档,遵守了<NSCoding, NSCopying>协议
4.XMPPElement
XMPPElement是3个基本元素(IQ,Message,Presence)的基类
继承自NSXMLElement
配合分类NSXMLElement+XMPP使用可以让代码更简洁和提高可读性
5.XMPPIQ
请求
主要属性是type(Message和Presence一样,表示请求或者消息的类型)
<iq Type="result"
from="lightman@google.com/contact"
to="google.com"
id = '123456'>
<query xmins="jabber:iq:roster"/>
<iq/>
type属性:说明了该iq类型为get,像服务端请求信息
from属性:小心来源,=JID
to属性:消息目标,=服务器域名
id属性,可选,标记该请求ID,当服务器处理完毕请求get类型的iq后,响应的result类型iq和ID与请求iq的ID相同
6.Message
<message />节定义了消息语义,<message />节可被看作“推”机制,与Email系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者
message用于“发送后即忘”的传输(发送后不验证消息是否接收成功),这样的传输主要应用与人类可读的文本、警告、通知等信息。
<message to="lightman@google.com/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的文件夹
- Vendor/CocoaAsyncSocket
- Vendor/CocoaLumberjack
- Vendor/KissXML
- Vendor/libidn
- Authentication
- Categories
- Core
- Utilities
也可以导入Extensions,可选
导入的时候要选择复制进项目中
步骤2
导入头文件XMPPFramework.h,也要赋值选项
导入完的框架
步骤3
要导入以下的自带框架和库
- CFNetwork.framework
- Security.framework
- libxml2.dylib
- libresolv.dylib
- libidn.a
注意,在项目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 {
// 创建XMPPStream
if (self.xmppStream == nil) {
self.xmppStream = [[XMPPStream alloc] init];
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
//设置JID 然后使用XMPPStream连接服务器
if (![self.xmppStream isConnected]) {
NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
XMPPJID *jid = [XMPPJID jidWithUser:username domain:@"lizhen" resource:@"Ework"];
[self.xmppStream setMyJID:jid];
[self.xmppStream setHostName:@"10.4.125.113"];
NSError *error = nil;
if (![self.xmppStream connect:&error]) {
NSLog(@"Connect Error: %@", [[error userInfo] description]);
}
}
}
连接成功后悔调用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的理解
查了一些资料,很多都是全英的,还是要学好英语
转载请注明出处
简要解析XMPP框架及iOS-Objective-C的使用的更多相关文章
- Cocoa 框架 For iOS(一) 框架的介绍,Objectivie-C运行时能力的解析等 (转载)
http://blog.csdn.net/totogo2010/article/details/8081253 Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. ...
- XMPP框架的分析、导入及问题解决
上一篇讲了 XMPP调试与简单使用 ,本篇开始讲如何使用将XMPPFramework框架导入到项目中! 先来了解以下XMPPFramework都放了些什么: Authentication: 与登陆相关 ...
- JSON 解析第三方框架
常见的 JSON 解析第三方框架 JSONKit(最快) SBJson TouchJSON 以上三个框架的性能依次降低! 介绍 JSONKit 第三方框架的目的 JSON 的解析并不是表面上那么简单 ...
- 未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib的解决方法
本人菜鸟一个,在编码过程中遇到的问题记录下以备忘,高手别笑.最近在做一个项目,公司的VS版本是2010,家里的VS版本是2012.把公司的项目用2012打开后再用2010打开就出现 未能解析目标框架“ ...
- Xcode7.2 导入XMPP框架错误解决
1.修改Build Settings 在 Header Search Paths 中添加: "/usr/include/libxml2" 在Other Linker Flags 中 ...
- 十大免费移动程序测试框架(Android/iOS)
十大免费移动程序测试框架(Android/iOS) 概述:本文将介绍10款免费移动程序测试框架,帮助开发人员简化测试流程,一起来看看吧. Bug是移动开发者最头痛的一大问题.不同于Web应用程序开发, ...
- SQL查询多条不重复记录值简要解析【转载】
转载http://hi.baidu.com/my_favourate/item/3716b0cbe125f312505058eb SQL查询多条不重复记录值简要解析2008-02-28 11:36 以 ...
- Spring5源码解析-Spring框架中的单例和原型bean
Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...
- java与C++之间进行SOCKET通讯要点简要解析
原文链接: http://blog.csdn.net/hslinux/article/details/6214594 java与C++之间进行SOCKET通讯要点简要解析 hslinux 0.篇外语 ...
随机推荐
- C++ 函数映射使用讲解
想想我们在遇到多语句分支时是不是首先想到的是 switc case 和 if else if ... 这2种方式在编码方面确实简单少,但是当分支达到一定数量后,特别是分支内部有嵌套大段代码或者再嵌套分 ...
- oracle 10 g 需要启动的2个服务
开始-> run -> cmd -> services.msc OracleOraDB10g_home1TNSListener OracleServiceORCL
- 阵列中条带(stripe)、stripe unit
摘抄:http://blog.sina.com.cn/s/blog_4a362d610100aed2.html 在磁盘阵列中,数据是以条带(stripe)的方式贯穿在磁盘阵列所有硬盘中的.这种数据的分 ...
- 理解SQL SERVER中的分区表
转自:http://www.cnblogs.com/sienpower/archive/2011/12/31/2308741.html 简介 分区表是在SQL SERVER2005之后的版本引入的特性 ...
- TexturePacker 介绍
TexturePacker这个词从字面来说就是Texture(纹理) + Packer(打包). 它是一款把若干资源图片拼接为一张大图的工具.它由一位叫做Andreas Loew的老外开发的 :). ...
- [译]Stairway to Integration Services Level 11 - 日志配置
介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...
- Resource is out of sync with the file system: 解决办法
在eclipse中,启动server时报此错,是因为文件系统不同步造成的,解决方法有两个: (1)选中工程,右键,选择F5(手动刷新): (2)Window->Preferences->G ...
- sublime2/3自总结经常使用快捷键(2的居多)
Ctrl+D 选词 (重复按快捷键,就可以继续向下同一时候选中下一个同样的文本进行同一时候编辑) Ctrl+鼠标左键 能够同一时候选择要编辑的多处文本 Shift+鼠标右键(或使用鼠标中键)能够用鼠标 ...
- 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...
- 驱动: 中断【1】linux中断流程
通常情况下,当一个给定的中断处理程序正在执行时,所有其他的中断都是打开的,所以这些不同中断线上的其他中断都能被处理,但当前中断总是被禁止的. 将中断处理切为两个部分或两半.中断处理程序上半部(top ...