iOS XMPP Framework 中文概述

來源:互聯網
上載者:User

標籤:醫院   sage   更改   oom   資料庫   介紹   tin   app   ack   

本篇文章翻譯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,Googleserver可能會返回相似"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, verbosestatic const int xmppLogLevel = XMPP_LOG_LEVEL_WARN;

如你所見有4個記錄層級(加上 XMPP_LOG_LEVEL_NONE):

  • Error
  • Warning
  • Info
  • Verbose

您能夠更改不論什麼檔案的記錄層級。要它輸出很多其它的資訊。

除了這一點。可啟用一個跟蹤標記。當啟用跟蹤,它輸出正在調用的方法。

請注意。跟蹤是從日誌等級分開的。比如,一個能夠設定記錄層級設定為警告。並啟用跟蹤像這樣:

// Log levels: off, error, warn, info, verbosestatic 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, verbosestatic 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

iOS XMPP Framework 中文概述

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: