本篇文章翻译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配置初始化被分为多个部分:

  • 配置如何连接到xmpp服务器
  • 添加代理
  • 添加 modules
  • 连接
  • 认证

配置连接

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

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

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

如果你知道你正在连接到不具有xmpp SRV记录的xmpp服务器,你可以告诉xmpp stream 通过指定的主机名跳过SRV查找,例如:

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

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

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

另一个可选的属性是主机端口,默认情况下,并按照xmpp规范。几乎所有的服务器上的端口都在5222运行,如果你的服务器在不同的端口上运行,那可以设置主机端口的属性。

添加代理

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,错误消息会通知你的问题。

在连接过程中,客户端和服务器经过一个xmpp握手。在此期间,服务器通知各种它支持以及需要的各种协议给客户端。有些服务器可能需要连接通过SSL/TLS。如果是这样的情况下,xmpp stream将自动保护连接,如果你正在连接服务器以不正确X509证书,你可能需要实现xmppStream:willSecureWithSettings: 代理方法来改变默认的安全设置。

认证

所有的连接握手结束后xmppStreamDidConnect: 代理方法被调用。这通常是大多数客户端应启动验证过程:

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

XMPP 日志

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

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

    不是所有的日志消息具有相同的优先级。有些是有关错误的,而其他都只是信息。日志分级帮助开发者保证他们的日志信息完整的,能够打开和关闭他们没有任何困难。

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

    一个全局日志级别不会接受当这个框架包含了这么多文件。加上调试的问题往往开发者只希望看到几个文件的日志语句。

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

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

我从事客户端多年来的工作,我看到第三方框架一遍又一遍发生同样的问题。第三方库自带散落着的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.

更多信息

想要立刻开始?

  • Get started using XMPPFramework on iOS
  • Get started using XMPPFramework on Mac OS X

扩展你的知识!

  • Learn about working with xml/xmpp elements

  • Learn about XMPPFramework's threading architecture

转载于:https://www.cnblogs.com/itrena/p/5927096.html

iOS XMPP Framework 中文概述相关推荐

  1. iOS 制作framework(SDK)的流程

    iOS 制作framework(SDK)的流程 项目需要写SDK,在这里整理一下方法和思路. 第一步:创建framwwork 第二步:随便取个名字:Hello,然后点击Next,指定一个你要存的位置 ...

  2. 使用swift语言和xmpp framework开发聊天软件

    参考http://blog.csdn.net/kangx6/article/details/7740135系列博客,学习xmpp协议,使用苹果最新发布的swift语言和xmpp framework框架 ...

  3. 一个静态库框架模板: iOS Universal Framework Mk 7

    项目地址: https://github.com/kstenerud/iOS-Universal-Framework 这是一个Xcode 4使用的项目模板,而不是一个新的开源框架. 这是项目主页,介绍 ...

  4. ios xmpp 发送语音图片解决方案

    http://www.cnblogs.com/yulang314/p/3705611.html ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项 ...

  5. iOS制作framework

    ios自定义.framework .framework可以制作为静态库和动态库,此文章是制作静态库.系统的.framework都是动态库,自己制作的.framework都是静态库. 如何制作.fram ...

  6. iOS--中文排序、全拼音排序

    本文示例Demo在GitHub:https://github.com/gaussli/ChineseSortDemo 在做项目的时候,总遇到排序问题,英文排序是很简单的,直接使用compare方法就可 ...

  7. 解决ios无法添加中文cookie的问题

    解决ios无法添加中文cookie的问题 ios的safari浏览器貌似不会保存中文的cookie,如果想要保存中文cookie,可以使用java进行编码,然后使用js解码,以此来达到使用中文cook ...

  8. iOS —— XMPP 详解

    iOS - XMPP 的使用 转载 https://www.cnblogs.com/QianChia/p/6411914.html 1.XMPP XMPP 是一个基于 Socket 通信的即时通讯的协 ...

  9. ios:CGContextRef 渲染中文问题

    1.项目中遇到drawRect来渲染中文,但是调用CGContextShowTextAtPoint方法失败,于是查了些资料整理总结一下 2.既然apple能显示中文,那么自然也是支持中文的. 查看所有 ...

最新文章

  1. python ansible_Ansible升级客户机Python2.4至2.7
  2. OpenCASCADE:Modeling Algorithms模块标准拓扑对象
  3. 复习支持向量机(SVM)没空看书时,掌握下面的知识就够了
  4. MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索
  5. VS2008 只生成DLL不生成lib文件
  6. GCC: libgcc的用途以及交叉编译
  7. 速成pytorch学习——8天损失函数
  8. 蓝桥杯 ADV-130 算法提高 色盲的民主
  9. Visual Studio 2017 设置失败、安装失败的解决方法
  10. JavaScript(3):基础部分之异常处理
  11. 19. 配置Symfony(和环境)
  12. android studio 通知栏广播,Android消息推送,通知栏的显示和点击
  13. HFSS - 倒F天线的设计与仿真
  14. python的快捷键总结
  15. 10秒!看清导数与微分的关系
  16. 个性和共性,对共性的封装。新的语言是如何诞生的
  17. 利用log4j写日志
  18. 你知道Java程序猿工资有多少吗?
  19. .NET 5.0 正式版发布了!
  20. 一款专注于销售人员拜访管理的APP

热门文章

  1. Check Dependency 2(一个检查.net部署文件完整性及一致性工具)
  2. mitdump爬取当当网APP图书目录
  3. BMI指数与体重的关系
  4. scala命令行运行spark代码
  5. Attribute ‘sklearn.linear_model._logistic.LogisticRegression.multi_class‘ must be explicitly set to
  6. VSC++ 常量中出现符号
  7. C++自定义直方图统计
  8. 机器学习,计算机视觉相关资料
  9. 迅雷CEO陈磊出席深圳IT领袖峰会 解析区块链未来布局
  10. mysql学习整理(一)