zoukankan      html  css  js  c++  java
  • 简要解析XMPP框架及iOSObjectiveC的使用

    前言:这两天看了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一样,表示请求或者消息的类型)

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

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

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

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

    转载请注明出处

  • 相关阅读:
    C#中string类型前加@标志的作用
    frame和iframe的区别
    css中float left与float right的使用说明
    一、Linux目录结构
    用户 'IIS APPPOOLClassic .NET AppPool' 登录失败。
    Jquery在线引用地址:
    分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
    转:沙漠玫瑰眼影教程
    转:查看oracle数据库允许的最大连接数和当前连接数
    转:怎么用Sql语句获取一个数据库中的所有表的名字
  • 原文地址:https://www.cnblogs.com/zyb428/p/4822734.html
Copyright © 2011-2022 走看看