zoukankan      html  css  js  c++  java
  • iOS XMPP Framework 中文概述

    本篇文章翻译XMPP Framework中的Overview of the XMPP Framework部分


    介绍

    The framework is divided into 2 parts:
    1. xmpp核心部分
    2. xmpp扩展(roster,XEP's,可选的支持工具等)

    xmpp核心部分实现了xmpp规范(RFC 3920

    请不要把聊天与xmpp混淆,xmpp全称是”可扩展消息与存在协议”,它是一种能够用于多种用途的通用协议,其实眼下有非常多公司使用这个框架比如家庭自己主动化,在医院传达警报给护士。

    可扩展包含比如支持花名冊。自己主动重连与多种xmpp扩展实现(XEP's).。

    XMPP核心

    XMPP核心文件在本地命名为”Core”的目录中。这些文件包含:

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

    这个框架的核心是XMPPStream类,这是你将要交互使用的基本的类。它是全部的扩展与定义代码插入的类,它具有一些使框架灵活,可扩展,易于在上面开发有趣的功能。

    这些将在稍后的文档中更深入的讨论。

    XMPPParser 是XMPPStream使用的内部类。你或许已经猜出它是做什么的了,你不须要以不论什么方式形式与这个解析器交互。

    XMPPJID 提供了一个不变的JID (Jabber Identifier)实现,它支持解析JID's,并以各种形式提取JID的各个部分。它遵守NSCopying协议。一边JID's能够当做NSDictionary的key。它也遵守NSCoding协议。

    XMPPElement 是3个主要XMPP元素的基类:XMPPIQ, XMPPMessage & XMPPPresence. XMPPElement扩展NSXMLElement类,因此你有全部的NSXML的功能。检查不论什么xml元素。在这个章节有很多其它具体的描写叙述Elements: IQ, Message, & Presence

    XMPPModule 提供可选植入扩展的基础类,假设你正在写你自己应用执行的代码。

    你非常可能只创建你自己的类。注冊接受代理调用。可是假设你正在实现一个标准的XEP。

    或者你想你的应用指定扩展是可被植入,那么你要在XMPPModule上创建,Module在后面更具体的被介绍。

    XMPPLogging 提供一个非常快,强大灵活的日志框架,它会在XMPP Logging 章节中讨论。

    XMPPInternal 不过关于核心和各种高级底层扩展内部的东西。

    元素: IQ, Message, & Presence

    XMPPElement扩展NSXMLElement类。因此你有全部的NSXML的功能,检查不论什么xml元素。

    • XMPPIQ -> XMPPElement -> NSXMLElement -> NSXMLNode -> NSObject
    • XMPPMessage -> XMPPElement -> NSXMLElement -> NSXMLNode -> NSObject
    • XMPPPresence -> XMPPElement -> NSXMLElement -> NSXMLNode -> NSObject

    除了NSXML基础功能外,还提供了NSXMLElement+XMPP 类别。

    这个类别提供各种方便的方法让你的代码更简洁易读。

    比如:

    [element attributeIntValueForName:@"age"];

    很多其它的信息请看Working With Elements页面

    XMPPStream配置

    一个xmpp stream配置初始化被分为多个部分:

    • 配置怎样连接到xmppserver
    • 加入代理
    • 加入 modules
    • 连接
    • 认证

    配置连接

    对于大部分人来说。这仅涉及一个步骤 - 设置stream的myJID属性。

    比如:

    xmppStream.myJID = [XMPPJID jidWithString:@"user@gmail.com"];

    该xmpp stream 将查找遵循XMPP RFC的剩余信息,这包含正在进行的SRV查找_xmpp-client._tcp.domain。在上面的样例中,使用Gmail,谷歌server可能会返回相似"talk.google.com"。然后xmpp stream将会链接到该server,假设SRV查找查找失败,那么xmpp stream 将会简单链接到JID's domain。

    假设你知道你正在连接到不具有xmpp SRV记录的xmppserver。你能够告诉xmpp stream 通过指定的主机名跳过SRV查找,比如:

    xmppStream.myJID = [XMPPJID jidWithString:@"user@myCompany.com"];
    xmppStream.hostName = @"myCompany.com";

    主机名也会派上用场,当你使用一个开发xmppserver。可能server是在背地网络可用的,或者不具有DNS地址等,比如:

    xmppStream.myJID = [XMPPJID jidWithString:@"user@dev1.myCompany.com"];
    xmppStream.hostName = @"192.168.2.27";

    还有一个可选的属性是主机port,默认情况下,并依照xmpp规范。差点儿全部的server上的port都在5222执行。假设你的server在不同的port上执行。那能够设置主机port的属性。

    加入代理

    XMPPStream有一些旨在使框架灵活,可扩展,易于在上面开发有趣的功能。当中之中的一个使用MulticastDelegate。

    什么是MulticastDelegate?

    xmpp framework须要支持扩展的数量不受限制,这包含对这个框架的官方扩展,以及不论什么数量的扩展或你想要插入这个框架的自己定义代码。因此传统的代理模式是行不通的。xmpp 模块和扩展须要分开到自己单独的类。但每一个类都须要接受代理方法。而标准NSNotification架构将无法胜任,一些代理要求返回变量。(加上它真的非常烦人要从userInfo字典的通知中提取參数)。

    因此一个MulticastDelegate同意你使用一个标准的代理模式插入框架中。但它同意多个类接受想用的代理通知。这样做的优点是,你不必把全部的xmpp处理代码在一个类中。你能够觉得你合适的方法分开处理在不同的类中。

    你能够不论什么时间加入/删除XMPPStream的代理对象:

    [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
    ...
    [xmppStream removeDelegate:self];

    很多其它关于MulticastDelegate的讨论能够在这里找到。

    线程和队列更具体的讨论能够在这里找到。

    加入 Modules

    这有一些关于这个框架的扩展,当然。你能够如你所愿写尽可能多的扩展。

    我们不会检查全部可用的扩展,但我们会列出几个在这里演示样例。

    • XMPPReconnect - 自己主动又一次连接。假设你意外断开。
    • XMPPRoster - 提供标准的xmpp花名冊支持
    • XMPPRoom - 提供多人聊天支持.
    • XMPPPubSub - 公布订阅

    作为样例,我们将会插入XMPPReconnect模块在我们的stream:

    xmppReconnect = [ [XMPPReconnect alloc] init];
    
    // Optional configuration of xmppReconnect could go here.
    // The defaults are fine for our purposes.
    
    [xmppReconnect activate:xmppStream];
    
    // You can also optionally add delegates to the module.
    
    [xmppReconnect addDelegate:self delegateQueue:dispatch_get_main_queue()];
    
    // And that's all that is needed.
    // The module will receive any delegate methods it needs automatically
    // from the xmpp stream, and will continue to do its thing unless you deactivate it.

    连接

    当你准备好,你能够開始连接进程:

    NSError *error = nil;
    if (![xmppStream connect:&error])
    {
        NSLog(@"Oops, I probably forgot something: %@", error);
    }

    假设你忘记设置必需的属性。比如myJID,那么connect方法会返回NO,错误消息会通知你的问题。

    在连接过程中。client和server经过一个xmpp握手。

    在此期间,server通知各种它支持以及须要的各种协议给client。有些server可能须要连接通过SSL/TLS。假设是这种情况下,xmpp stream将自己主动保护连接,假设你正在连接server以不对X509证书。你可能须要实现xmppStream:willSecureWithSettings: 代理方法来改变默认的安全设置。

    认证

    全部的连接握手结束后xmppStreamDidConnect: 代理方法被调用。这一般是大多数client应启动验证过程:

    - (void)xmppStreamDidConnect:(XMPPStream *)sender
    {
        [xmppStream authenticateWithPassword:password error:NULL];
    }

    XMPP 日志

    这有几个目标对于整个XMPP架构日志:

    • 它必须支持多种日志级别.

      不是全部的日志消息具有相同的优先级。有些是有关错误的,而其它都不过信息。日志分级帮助开发人员保证他们的日志信息完整的。能够打开和关闭他们没有不论什么困难。

    • 它必须在每一个文件基础上可配置

      一个全局日志级别不会接受当这个框架包含了这么多文件。

      加上调试的问题往往开发人员只希望看到几个文件的日志语句。

    • 它必须可配置于终端用户

      xmpp framework 须要对日志语句全然控制,用户有非常多不同的需求。一些想要日志声明到一个文件里,一些可能想要日志声明到数据库里。或者可能他们须要针对日志声明在不同的地方,取决于日志声明来源于app中还是xmpp framework。

    我从事client多年来的工作。我看到第三方框架一遍又一遍发生相同的问题。

    第三方库自带散落着的NSLog语句。终于须要用户通过库凝视掉NSLog语句,或者将它们转换为一些原始的自己定义宏的版本号。

    xmpp framework 採用了专业的日志框架CocoaLumberjack

    这个日志框架实际上比的NSLog更快。做相同的事情时也是如此。此外,它还支持大量不同的配置,并同意终端用户甚至能够加入自己的自己定义日志记录,筛选和格式化。

    以下是你须要知道的XMPPFramework有关日志的设置:

    对于在框架内部大多数文件顶部你会发现例如以下:

    // Log levels: off, error, warn, info, verbose
    static const int xmppLogLevel = XMPP_LOG_LEVEL_WARN;

    如你所见有4个日志级别(加上 XMPP_LOG_LEVEL_NONE):

    • Error
    • Warning
    • Info
    • Verbose

    您能够更改不论什么文件的日志级别。要它输出很多其它的信息。

    除了这一点。可启用一个跟踪标记。当启用跟踪,它输出正在调用的方法。

    请注意。跟踪是从日志等级分开的。比如,一个能够设置日志级别设置为警告。并启用跟踪像这样:

    // Log levels: off, error, warn, info, verbose
    static const int xmppLogLevel = XMPP_LOG_LEVEL_WARN | XMPP_LOG_FLAG_TRACE;

    就代码而言意味着:

    XMPPLogTrace(); // Enabled - Will spit out "<FileName>: <MethodName>"
    XMPPLogError(@"I will get logged");
    XMPPLogWarn(@"I will get logged");
    XMPPLogInfo(@"I will NOT get logged");
    XMPPLogVerbose(@"I will NOT get logged");

    除此之外,XMPPStream有一个选项使你能够看到正在发送的原始XML sent/received。你能够把它放在XMPPStream.m像这样:

    // Log levels: off, error, warn, info, verbose
    static const int xmppLogLevel = XMPP_LOG_LEVEL_INFO | XMPP_LOG_FLAG_SEND_RECV;

    当你启动应用程序。您须要配置lumberjack框架。

    对于刚開始学习的人来说,你能够这样简单的设置在你的AppDelegate:

    #import "DDLog.h"
    #import "DDTTYLogger.h"
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        [DDLog addLogger:[DDTTYLogger sharedInstance] withLogLevel:XMPP_LOG_FLAG_SEND_RECV];
    
        // All your other code...
    }

    很多其它关于Lumberjack信息參考这里
    For more information about Lumberjack take a look at its project page.

    很多其它信息

    想要立马開始?

    扩展你的知识!

  • 相关阅读:
    hihoCoder #1062 : 最近公共祖先·一
    hihoCoder #1050 : 树中的最长路
    hihoCoder #1049 : 后序遍历
    108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
    107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
    106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树
    105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
    104 Maximum Depth of Binary Tree 二叉树的最大深度
    102 Binary Tree Level Order Traversal 二叉树的层次遍历
    101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8341123.html
Copyright © 2011-2022 走看看