iOS XMPP Framework 中文概述
本篇文章翻譯XMPP Framework中的Overview of the XMPP Framework部分
介紹
The framework is divided into 2 parts:
1. xmpp核心部分
2. xmpp擴(kuò)展(roster,XEP's,可選的支持工具等)
xmpp核心部分實(shí)現(xiàn)了xmpp規(guī)范(RFC 3920)
請不要把聊天與xmpp混淆,xmpp全稱是”可擴(kuò)展消息與存在協(xié)議”,它是一種可以用于多種用途的通用協(xié)議,事實(shí)上目前有很多公司使用這個(gè)框架例如家庭自動化,在醫(yī)院傳達(dá)警報(bào)給護(hù)士。
可擴(kuò)展包括例如支持花名冊,自動重連與多種xmpp擴(kuò)展實(shí)現(xiàn)(XEP's).。
XMPP核心
XMPP核心文件在本地命名為”Core”的文件夾中。這些文件包括:
- XMPPStream
- XMPPParser
- XMPPJID
- XMPPElement
- XMPPIQ
- XMPPMessage
- XMPPPresence
- XMPPModule
- XMPPLogging
- XMPPInternal
這個(gè)框架的核心是XMPPStream類,這是你將要交互使用的主要的類,它是所有的擴(kuò)展與定義代碼插入的類,它具有一些使框架靈活,可擴(kuò)展,易于在上面開發(fā)有趣的功能。這些將在稍后的文檔中更深入的討論。
XMPPParser 是XMPPStream使用的內(nèi)部類。你也許已經(jīng)猜出它是做什么的了,你不需要以任何方式形式與這個(gè)解析器交互。
XMPPJID 提供了一個(gè)不變的JID (Jabber Identifier)實(shí)現(xiàn),它支持解析JID's,并以各種形式提取JID的各個(gè)部分。它遵守NSCopying協(xié)議,一邊JID's可以當(dāng)做NSDictionary的key。它也遵守NSCoding協(xié)議。
XMPPElement 是3個(gè)主要XMPP元素的基類:XMPPIQ, XMPPMessage & XMPPPresence. XMPPElement擴(kuò)展NSXMLElement類,因此你有全部的NSXML的功能,檢查任何xml元素。在這個(gè)章節(jié)有更多詳細(xì)的描述Elements: IQ, Message, & Presence。
XMPPModule 提供可選植入擴(kuò)展的基礎(chǔ)類,如果你正在寫你自己應(yīng)用執(zhí)行的代碼。你很可能僅僅創(chuàng)建你自己的類,注冊接受代理調(diào)用。但是如果你正在實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的XEP。或者你想你的應(yīng)用指定擴(kuò)展是可被植入,那么你要在XMPPModule上創(chuàng)建,Module在后面更詳細(xì)的被介紹。
XMPPLogging 提供一個(gè)非常快,強(qiáng)大靈活的日志框架,它會在XMPP Logging 章節(jié)中討論。
XMPPInternal 僅僅是關(guān)于核心和各種高級底層擴(kuò)展內(nèi)部的東西。
元素: IQ, Message, & Presence
XMPPElement擴(kuò)展NSXMLElement類,因此你有全部的NSXML的功能,檢查任何xml元素。
- XMPPIQ -> XMPPElement -> NSXMLElement -> NSXMLNode -> NSObject
- XMPPMessage -> XMPPElement -> NSXMLElement -> NSXMLNode -> NSObject
- XMPPPresence -> XMPPElement -> NSXMLElement -> NSXMLNode -> NSObject
除了NSXML基礎(chǔ)功能外,還提供了NSXMLElement+XMPP 類別。這個(gè)類別提供各種方便的方法讓你的代碼更簡潔易讀。例如:
[element attributeIntValueForName:@"age"];更多的信息請看Working With Elements頁面
XMPPStream配置
一個(gè)xmpp stream配置初始化被分為多個(gè)部分:
- 配置如何連接到xmpp服務(wù)器
- 添加代理
- 添加 modules
- 連接
- 認(rèn)證
配置連接
對于大部分人來說,這僅涉及一個(gè)步驟 - 設(shè)置stream的myJID屬性。例如:
xmppStream.myJID = [XMPPJID jidWithString:@"user@gmail.com"];該xmpp stream 將查找遵循XMPP RFC的剩余信息,這包括正在進(jìn)行的SRV查找_xmpp-client._tcp.domain。在上面的例子中,使用Gmail,谷歌服務(wù)器可能會返回類似"talk.google.com",然后xmpp stream將會鏈接到該服務(wù)器,如果SRV查找查找失敗,那么xmpp stream 將會簡單鏈接到JID's domain。
如果你知道你正在連接到不具有xmpp SRV記錄的xmpp服務(wù)器,你可以告訴xmpp stream 通過指定的主機(jī)名跳過SRV查找,例如:
xmppStream.myJID = [XMPPJID jidWithString:@"user@myCompany.com"]; xmppStream.hostName = @"myCompany.com";主機(jī)名也會派上用場,當(dāng)你使用一個(gè)開發(fā)xmpp服務(wù)器,可能服務(wù)器是在背地網(wǎng)絡(luò)可用的,或者不具有DNS地址等,例如:
xmppStream.myJID = [XMPPJID jidWithString:@"user@dev1.myCompany.com"]; xmppStream.hostName = @"192.168.2.27";另一個(gè)可選的屬性是主機(jī)端口,默認(rèn)情況下,并按照xmpp規(guī)范。幾乎所有的服務(wù)器上的端口都在5222運(yùn)行,如果你的服務(wù)器在不同的端口上運(yùn)行,那可以設(shè)置主機(jī)端口的屬性。
添加代理
XMPPStream有一些旨在使框架靈活,可擴(kuò)展,易于在上面開發(fā)有趣的功能。其中之一使用MulticastDelegate。
什么是MulticastDelegate?
xmpp framework需要支持?jǐn)U展的數(shù)量不受限制,這包括對這個(gè)框架的官方擴(kuò)展,以及任何數(shù)量的擴(kuò)展或你想要插入這個(gè)框架的自定義代碼。因此傳統(tǒng)的代理模式是行不通的,xmpp 模塊和擴(kuò)展需要分開到自己單獨(dú)的類,但每個(gè)類都需要接受代理方法。而標(biāo)準(zhǔn)NSNotification架構(gòu)將無法勝任,一些代理要求返回變量。(加上它真的很煩人要從userInfo字典的通知中提取參數(shù))。
因此一個(gè)MulticastDelegate允許你使用一個(gè)標(biāo)準(zhǔn)的代理模式插入框架中,但它允許多個(gè)類接受想用的代理通知。這樣做的好處是,你不必把所有的xmpp處理代碼在一個(gè)類中。你可以認(rèn)為你合適的方法分開處理在不同的類中。
你可以任何時(shí)間添加/刪除XMPPStream的代理對象:
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; ... [xmppStream removeDelegate:self];更多關(guān)于MulticastDelegate的討論可以在這里找到。線程和隊(duì)列更詳細(xì)的討論可以在這里找到。
添加 Modules
這有一些關(guān)于這個(gè)框架的擴(kuò)展,當(dāng)然,你可以如你所愿寫盡可能多的擴(kuò)展。我們不會檢查所有可用的擴(kuò)展,但我們會列出幾個(gè)在這里示例。
- XMPPReconnect - 自動重新連接,如果你意外斷開。
- XMPPRoster - 提供標(biāo)準(zhǔn)的xmpp花名冊支持
- XMPPRoom - 提供多人聊天支持.
- XMPPPubSub - 發(fā)布訂閱
作為例子,我們將會插入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.連接
當(dāng)你準(zhǔn)備好,你可以開始連接進(jìn)程:
NSError *error = nil; if (![xmppStream connect:&error]) {NSLog(@"Oops, I probably forgot something: %@", error); }如果你忘記設(shè)置必需的屬性,例如myJID,那么connect方法會返回NO,錯(cuò)誤消息會通知你的問題。
在連接過程中,客戶端和服務(wù)器經(jīng)過一個(gè)xmpp握手。在此期間,服務(wù)器通知各種它支持以及需要的各種協(xié)議給客戶端。有些服務(wù)器可能需要連接通過SSL/TLS。如果是這樣的情況下,xmpp stream將自動保護(hù)連接,如果你正在連接服務(wù)器以不正確X509證書,你可能需要實(shí)現(xiàn)xmppStream:willSecureWithSettings: 代理方法來改變默認(rèn)的安全設(shè)置。
認(rèn)證
所有的連接握手結(jié)束后xmppStreamDidConnect: 代理方法被調(diào)用。這通常是大多數(shù)客戶端應(yīng)啟動驗(yàn)證過程:
- (void)xmppStreamDidConnect:(XMPPStream *)sender {[xmppStream authenticateWithPassword:password error:NULL]; }XMPP 日志
這有幾個(gè)目標(biāo)對于整個(gè)XMPP架構(gòu)日志:
它必須支持多種日志級別.
不是所有的日志消息具有相同的優(yōu)先級。有些是有關(guān)錯(cuò)誤的,而其他都只是信息。日志分級幫助開發(fā)者保證他們的日志信息完整的,能夠打開和關(guān)閉他們沒有任何困難。它必須在每個(gè)文件基礎(chǔ)上可配置
一個(gè)全局日志級別不會接受當(dāng)這個(gè)框架包含了這么多文件。加上調(diào)試的問題往往開發(fā)者只希望看到幾個(gè)文件的日志語句。它必須可配置于終端用戶
xmpp framework 需要對日志語句完全控制,用戶有很多不同的需求。一些想要日志聲明到一個(gè)文件中,一些可能想要日志聲明到數(shù)據(jù)庫里?;蛘呖赡芩麄冃枰槍θ罩韭暶髟诓煌牡胤?#xff0c;取決于日志聲明來源于app中還是xmpp framework。
我從事客戶端多年來的工作,我看到第三方框架一遍又一遍發(fā)生同樣的問題。第三方庫自帶散落著的NSLog語句,最終需要用戶通過庫注釋掉NSLog語句,或者將它們轉(zhuǎn)換為一些原始的自定義宏的版本。
xmpp framework 采用了專業(yè)的日志框架CocoaLumberjack。這個(gè)日志框架實(shí)際上比的NSLog更快,做同樣的事情時(shí)也是如此。此外,它還支持大量不同的配置,并允許終端用戶甚至可以添加自己的自定義日志記錄,篩選和格式化。
下面是你需要知道的XMPPFramework有關(guān)日志的設(shè)置:
對于在框架內(nèi)部大多數(shù)文件頂部你會發(fā)現(xiàn)如下:
// Log levels: off, error, warn, info, verbose static const int xmppLogLevel = XMPP_LOG_LEVEL_WARN;如你所見有4個(gè)日志級別(加上 XMPP_LOG_LEVEL_NONE):
- Error
- Warning
- Info
- Verbose
您可以更改任何文件的日志級別,要它輸出更多的信息。
除了這一點(diǎn),可啟用一個(gè)跟蹤標(biāo)記。當(dāng)啟用跟蹤,它輸出正在調(diào)用的方法。
請注意,跟蹤是從日志等級分開的。例如,一個(gè)可以設(shè)置日志級別設(shè)置為警告,并啟用跟蹤像這樣:
// 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有一個(gè)選項(xiàng)使你能夠看到正在發(fā)送的原始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;當(dāng)你啟動應(yīng)用程序,您需要配置lumberjack框架。對于初學(xué)者來說,你可以這樣簡單的設(shè)置在你的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... }更多關(guān)于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
擴(kuò)展你的知識!
Learn about working with xml/xmpp elements
Learn about XMPPFramework's threading architecture
轉(zhuǎn)載于:https://www.cnblogs.com/itrena/p/5927096.html
總結(jié)
以上是生活随笔為你收集整理的iOS XMPP Framework 中文概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Html中的空格符「建议收藏」(html
- 下一篇: 2022年情人节是几月几号 有哪些来源传