前言:这两天看了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的使用的更多相关文章

  1. Cocoa 框架 For iOS(一) 框架的介绍,Objectivie-C运行时能力的解析等 (转载)

    http://blog.csdn.net/totogo2010/article/details/8081253 Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. ...

  2. XMPP框架的分析、导入及问题解决

    上一篇讲了 XMPP调试与简单使用 ,本篇开始讲如何使用将XMPPFramework框架导入到项目中! 先来了解以下XMPPFramework都放了些什么: Authentication: 与登陆相关 ...

  3. JSON 解析第三方框架

    常见的 JSON 解析第三方框架 JSONKit(最快) SBJson TouchJSON 以上三个框架的性能依次降低! 介绍 JSONKit 第三方框架的目的 JSON 的解析并不是表面上那么简单 ...

  4. 未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib的解决方法

    本人菜鸟一个,在编码过程中遇到的问题记录下以备忘,高手别笑.最近在做一个项目,公司的VS版本是2010,家里的VS版本是2012.把公司的项目用2012打开后再用2010打开就出现 未能解析目标框架“ ...

  5. Xcode7.2 导入XMPP框架错误解决

    1.修改Build Settings 在 Header Search Paths 中添加: "/usr/include/libxml2" 在Other Linker Flags 中 ...

  6. 十大免费移动程序测试框架(Android/iOS)

    十大免费移动程序测试框架(Android/iOS) 概述:本文将介绍10款免费移动程序测试框架,帮助开发人员简化测试流程,一起来看看吧. Bug是移动开发者最头痛的一大问题.不同于Web应用程序开发, ...

  7. SQL查询多条不重复记录值简要解析【转载】

    转载http://hi.baidu.com/my_favourate/item/3716b0cbe125f312505058eb SQL查询多条不重复记录值简要解析2008-02-28 11:36 以 ...

  8. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  9. java与C++之间进行SOCKET通讯要点简要解析

    原文链接: http://blog.csdn.net/hslinux/article/details/6214594 java与C++之间进行SOCKET通讯要点简要解析 hslinux 0.篇外语 ...

随机推荐

  1. 玩转Bootstarp(连载)

    一.Bootstarp是什么? 简单.灵活的用于搭建WEB页面的HTML.CSS.JS的工具集 (基于HTML5和CSS3) 总结:简洁强大的前端开发框架,可以让WEB开发更迅速.更简单 二.如何使用 ...

  2. 【转】Ubuntu下deb包的安装方法

    [转]Ubuntu下deb包的安装方法 deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian P ...

  3. Oracle包Package调用Package

    Package左侧文件: create or replace package CALL_DETAILS is strdatarange varchar2(1) := '1'; numrow_num n ...

  4. 「OC」 基本语法

    一.OC简介 在C语言的基础上,增加了一层最小的面向对象语法:完全兼容C语言:可以在OC代码中混入C语言代码,甚至是C++代码:可以使用OC开发Mac OS X平台和iOS平台的应用程序. 二.OC语 ...

  5. Cocos2d-x win7 + vs2010 配置图文详解(亲测)

    下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d-1.01-x-0.9.1,具体下载位置如下图: 下载完之后, ...

  6. 调试带有源代码的DLL文件

    工作环境:dll源代码是c,在Visual studio 2010中调试. 第一步,调试的准备. 用C#语言编写一个测试dll文件的程序,由于dll源程序是c的,且运行结果是黑屏的,所以C#代码也是运 ...

  7. 如何在Eclipse中配置Tomcat(免安装版)

    如何在Eclipse中配置Tomcat(免安装版) 2013-10-09 23:19wgelgrsh | 分类:JAVA相关 | 浏览642次 分享到:   2013-10-10 17:10提问者采纳 ...

  8. 服务器忘记mysql密码怎么修改?

    找到配置文件my.ini  ,然后将其打开,可以选择用记事本打开 打开后,搜索mysqld关键字 找到后,在mysqld下面添加skip-grant-tables,保存退出. PS:若提示不让保存时, ...

  9. FPGA知识大梳理(三)verilogHDL语法入门(2)知识汇总

    1,时序逻辑.将上次的练习修改成时序逻辑会如何设计. always @ (posedge clock) 2,block 与unblocking  A,有clock的always中通常使用nonbloc ...

  10. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...