博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简要解析XMPP框架及iOS-Objective-C的使用
阅读量:5292 次
发布时间:2019-06-14

本文共 5328 字,大约阅读时间需要 17 分钟。

前言:这两天看了XMPP框架,查阅了一些资料,写下这篇文章记录一下学习笔记

 

 

一、简要解析XMPP核心部分  

XMPP框架分为两个部分

    1.核心部分

    2.扩展部分 

扩展部分主要讲好友列表(roster)、自动重连(automatic reconnect)、还有一些其他的实现。

核心部分包括以下部分:

  • XMPPStream
  • XMPPParser
  • XMPPJID
  • XMPPElement
  • XMPPIQ
  • XMPPMessage
  • XMPPPresence
  • XMPPModule
  • XMPPLogging
  • XMPPInternal

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; /** 要连接的服务器的域名 格式为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     = 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一样,表示请求或者消息的类型)

 
from="lightman@google.com/contact" to="google.com" id = '123456'> 

type属性:说明了该iq类型为get,像服务端请求信息

from属性:小心来源,=JID

to属性:消息目标,=服务器域名

id属性,可选,标记该请求ID,当服务器处理完毕请求get类型的iq后,响应的result类型iq和ID与请求iq的ID相同

 

6.Message

<message />节定义了消息语义,<message />节可被看作“推”机制,与Email系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者

message用于“发送后即忘”的传输(发送后不验证消息是否接收成功),这样的传输主要应用与人类可读的文本、警告、通知等信息。

 

hello < body/>

 

 

7.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,可选

导入的时候要选择复制进项目中

enter image description here

 

步骤2

导入头文件XMPPFramework.h,也要赋值选项

导入完的框架

enter image description here

 

步骤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的理解

查了一些资料,很多都是全英的,还是要学好英语

 

 

 

 

转载请注明出处

转载于:https://www.cnblogs.com/zyb428/p/4822734.html

你可能感兴趣的文章
机器学习基石(9)--Linear Regression
查看>>
Min Stack
查看>>
从LazyPhp说起
查看>>
Fine Uploader文件上传组件
查看>>
Spring Boot与Spring的区别
查看>>
查看linux 之mysql 是否安装的几种方法
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
软件测试(基础理论一)摘
查看>>
consonant combination
查看>>
PHP与Linux进程间的通信
查看>>
【长期更新】坑点合集
查看>>
wnmp windows 2012 r2+php7.0+nginx1.14安装
查看>>
weblogic与axis2 jar包冲突
查看>>
Hello Spring Framework——面向切面编程(AOP)
查看>>
解决java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
查看>>
将.lib库文件转换成.a库文件的工具
查看>>
FZU 2129 子序列个数 (动态规划)
查看>>
20155324 2016-2017-2 《Java程序设计》第7周学习总结
查看>>