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:@"[email protected]"];

该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:@"[email protected]"];
xmppStream.hostName = @"myCompany.com";

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

xmppStream.myJID = [XMPPJID jidWithString:@"[email protected]"];
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.

很多其它信息

想要立马開始?

扩展你的知识!

原文地址:https://www.cnblogs.com/zhchoutai/p/8341123.html

时间: 2024-10-09 16:34:20

iOS XMPP Framework 中文概述的相关文章

ios:CGContextRef 渲染中文问题

1.项目中遇到drawRect来渲染中文,但是调用CGContextShowTextAtPoint方法失败,于是查了些资料整理总结一下 2.既然apple能显示中文,那么自然也是支持中文的. 查看所有字体: NSArray *fontFamilies = [UIFontfamilyNames]; for(NSString *fontFam in fontFamilies) { NSLog(@"=========%@=========",fontFam); NSArray *fontNa

iOS xmpp协议实现聊天之openfire的服务端配置(一)

今天弄这个openfire服务端的配置直接苦了一逼,不过好在最后终于配置好了.首先感谢@月光的尽头的博客给了我莫大的帮助.切入正题,首先说一下iOS xmpp协议实现聊天openfire服务器配置所需要的东西: 1.openfire软件,我用的是 Openfire 3.9.3,下载地址:http://www.igniterealtime.org/downloads/index.jsp 2.MySql数据库,我用的是mysql-5.1.63,下载地址:http://dev.mysql.com/do

【iOS XMPP】使用XMPPFramewok之好友列表

好友列表 好友列表,在 XMPP 中被称为 roster,花名册? 获取 roster 需要客户端发送 <iq /> 标签向 XMPP 服务器端查询 一个 IQ 请求: <iq type="get" from="[email protected]" to="example.com" id="1234567"> <query xmlns="jabber:iq:roster"/&g

iOS xmpp协议实现聊天之openfire的服务端配置(二)

本篇主要说一下如何利用命令行来正确配置MySql. 首先打开终端: 1.为mysql起一个别名 alias mysql=/usr/local/mysql/bin/mysql 2.创建mysql的管理员  admin(后期登陆用到) alias mysqladmin=/usr/local/mysql/bin/mysqladmin 3.设置root账号密码 mysqladmin -u root password 初始密码 4.连接数据库 mysql -u root -p  (提示输入刚才的密码) 5

IOS中UIImagePickerController中文界面问题

今天沈阳斌子,写IOS项目遇到一个调用照相机的问题,找到解决方法,快速解决了拿给PM看,结果PM说程序调用的照相机不是中文的是英文的,必须改成中文,上网找到了方法,试用后好用拿出来和大家分享.方法如下,总共分两步: 一: Target-->Localization native development region : China 本地化的开发语言版本选择China 没有的话添加一下. 二:Project-->Localizations  添加Chinese 中文包 这点挺重要的要想实现中文显

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

ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp.因为项目需求需要实现语音和图片的发送.发送语音图片有三种方法.1,xmpp smack.文件传输方式.2,文本流.3,服务器中转.因为项目工期等原因,最终选择了通过服务器中转的方式来实现这些功能,本博客只是用于自己工作的记录,有什么不对的地方欢迎指正.发送语言消息需要和安卓共通,本来预期的方案是选择使用amr格式的音频.这样工作量都压在ios这边.所以和安卓协商后选择使用了mp3格式的音频编码.首先是

【iOS开发-115】静态库的制作以及第三方框架iOS Universal Framework,DEBUG和RELEASE

(1)概念介绍 --我们平时在项目中用的最多的就是开源的第三方库,这种库是开源的,我们不仅能用,还能查看源代码甚至可以修改源代码. --与开源库对应的就是闭源,闭源库分为动态库和静态库.动态库就是.dylib或者.framework结尾的文件.就是苹果官方提供给我们用的那些库.开发者不能在项目中使用自制的动态库,否则无法上传到APPStore. --所以,对于闭源库,我们主要讨论的是静态库.静态库的样子就是用户拿到的文件有很多头文件.h+资源包+编译过的一个二进制文件.a(.framework)

iOS.访问通讯录.00.概述

1.移动设备上都有一个很重要的内置数据库 -- 通讯录,苹果把它扩展到了iCloud上,使苹果设备间可以共享通讯录信息. 2.在iOS上,通讯录放在SQLite3数据库中,但是应用之间不能直接访问,也就是说我们自己编写的应用不能采用数据持久化技术直接访问通讯录数据库.为了实现通讯录数据库的访问,苹果开放了一些专门的API. 3.处于安全考虑,iOS6之后的应用访问通讯录时,需要获得用户的授权,与其他应用(如定位服务授权)不同的是,通讯录对一个应用只授权一次,即便是这个应用删除后重新安装,也不必再

IOS数组按中文关键字以字母序排序

本文转载至 http://blog.csdn.net/xunyn/article/details/7882087 iosobjective cuser框架通讯 IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将“王”变成“W”,完整文章(传送门). 其中他通过pinyinFirstLet