XMPP實(shí)現(xiàn)2

我們需要與服務(wù)器連接菇夸,可以創(chuàng)建一個(gè)XMPP的管理類(lèi)轨域,負(fù)責(zé)處理客戶端與服務(wù)器端的交互

我們來(lái)創(chuàng)建一個(gè)XMPPManager類(lèi)侠坎,繼承NSObject

因?yàn)閄MPPManager這個(gè)類(lèi)他是負(fù)責(zé)整個(gè)客戶端與服務(wù)器端的即時(shí)通訊,所以他只需要一個(gè)實(shí)例就可以了扶踊,我們來(lái)創(chuàng)建一個(gè)單例泄鹏。


XMPP框架里有個(gè)類(lèi),叫做XMPPStream秧耗,通信管道备籽,他是負(fù)責(zé)客戶端和服務(wù)端的數(shù)據(jù)傳輸

就好比你拿一臺(tái)座機(jī)跟你的朋友打電話一樣,這臺(tái)電話需要一個(gè)電話線才可以

首先我們要引入XMPPFrameWork的框架

然后我們來(lái)創(chuàng)建一個(gè)XMPPStream的對(duì)象 ? 分井,創(chuàng)建完了以后我們要對(duì)他進(jìn)行一個(gè)初始化

創(chuàng)建完這個(gè)對(duì)象后胶台,我們要給他指定服務(wù)器的IP地址,XMPPStream有一個(gè)屬性

叫做hostName杂抽,我們這里定義了一個(gè)宏,叫做kHostName韩脏,我們可以點(diǎn)進(jìn)去看一下

除了服務(wù)器地址外呢缩麸,我們還需要給XMPPStream設(shè)置一個(gè)端口號(hào)

什么是端口號(hào)呢?

我們的服務(wù)器內(nèi)儲(chǔ)存的都是服務(wù)赡矢,可能有sqlite服務(wù)杭朱,email服務(wù)阅仔,或者我們的XMPP服務(wù)

每一個(gè)服務(wù)都有對(duì)應(yīng)的一個(gè)端口號(hào),就好比你出去面試一樣弧械,一家公司告訴你八酒,我們公司在望京SOHO大樓里,幾樓刃唐,幾號(hào)羞迷,這個(gè)望京SOHO就相當(dāng)于是一個(gè)服務(wù)器,里面存儲(chǔ)著的各家公司就好比是服務(wù)画饥,而每家公司都肯定會(huì)有一個(gè)自己的門(mén)牌號(hào)衔瓮,要沒(méi)有這些的話,公司邀請(qǐng)你面試抖甘,告訴你我們?cè)谕㏒OHO热鞍,你來(lái)吧,門(mén)牌號(hào)沒(méi)有衔彻,自己找薇宠,你肯定會(huì)想,逗我玩呢艰额?

所以我們的服務(wù)是必須要有端口號(hào)的澄港,這樣才可以讓我們準(zhǔn)確地找到我們的服務(wù),來(lái)進(jìn)行實(shí)現(xiàn)我們要得功能

我們的XMPPStream有一個(gè)屬性悴晰,叫做hostPort慢睡,我們這里也定義了一個(gè)宏

XMPP使用的openfire他有一個(gè)默認(rèn)的端口是5222,我們把5222設(shè)定為了一個(gè)宏

有了這兩個(gè)之后他就明白你要連接到服務(wù)器的哪個(gè)服務(wù)了

最后我們要當(dāng)前的這個(gè)對(duì)象成為XMPPStream的代理對(duì)象铡溪,因?yàn)槟阋蚍?wù)器發(fā)送連接請(qǐng)求

那么你可能連接成功也可能連接失敗漂辐,和我們的HTTP請(qǐng)求一樣

那么這個(gè)連接成功與失敗需要我們的一個(gè)協(xié)議方法來(lái)告知我們結(jié)果

所以我們要當(dāng)前對(duì)象成為XMPPStream代理對(duì)象

首先我們要遵循XMPPStream的一個(gè)協(xié)議

然后我們添加一個(gè)代理方法

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

通常我們使用代理的時(shí)候都是setDelegate 那么一個(gè)對(duì)象只能設(shè)置一個(gè)代理對(duì)象

這里比較特殊,待會(huì)我們就可以看到這里使用添加代理對(duì)象有什么樣的好處

然后我們就可以向服務(wù)器發(fā)送連接請(qǐng)求

我們寫(xiě)一個(gè)方法棕硫,專(zhuān)門(mén)為服務(wù)器發(fā)送連接請(qǐng)求

//連接請(qǐng)求

(void)connectToServer

我們有了連接髓涯,當(dāng)然也不能少了斷開(kāi)方法

//斷開(kāi)連接

(void)disconnectWithServer

連接的時(shí)候我們要進(jìn)行一個(gè)判斷,判斷當(dāng)前是否正在鏈接

[self.xmppStream isConnected];

如果正在連接哈扮,我們斷開(kāi)連接

[self disconnectWithServer];

為什么要這么做呢纬纪?

就比如你現(xiàn)在和你得A朋友正在打電話,但是你又想給C朋友打電話滑肉,那你不得把這邊掛了才能給那邊打過(guò)去嗎包各?

那么斷開(kāi)之后,就可以向服務(wù)器發(fā)送鏈接靶庙,在向服務(wù)器發(fā)送鏈接之前呢

你需要告訴服務(wù)器问畅,你是誰(shuí)

在XMPP框架中呢,有一個(gè)XMPPJID類(lèi),JID呢护姆,是Jabber ID的縮寫(xiě)矾端,因?yàn)槲覀兊腦MPP其實(shí)就是基J于Jabber協(xié)議的基礎(chǔ)開(kāi)發(fā)的,JID就是XMPP中得唯一標(biāo)示

我們可以創(chuàng)建一個(gè)XMPPJID卵皂,我們來(lái)看一下他的初始化方法

XMPPJID *jid = [XMPPJID jidWithUser:(NSString *)domain:(NSString *) resource:(NSString *)];

user就是你得用戶名domain是域名秩铆,配置openfire給他的域名 resource客戶端的來(lái)源,比如你得QQ灯变,比如iPhone或者window或者是Android

我們這里定義的有宏殴玛,domain這里的openfire給的域名一致就可以了。

那我們這里的user給什么呢柒凉?我們這個(gè)用戶名可以使用一個(gè)接口就行了族阅。

XMPPManager里面有一個(gè)方法

- (void)loginWithUser:(NSString *)user password:(NSString *)password

我們把XMPPJID *jid = [XMPPJID jidWithUser:(NSString *)domain:kDomain resource:kResource];寫(xiě)入里面

這個(gè)時(shí)候我們可以把第一個(gè)參數(shù)寫(xiě)為user

我們這個(gè)xmppStream里有個(gè)參數(shù)為myJID 把他等于jid;

然后就可以進(jìn)行連接

NSError *error = nil;

[self.xmppStream connectWithTimeout:30.0f error:&error];

判斷一下我們的錯(cuò)誤信息

if (nil != error )

{

NSLog(@“%s__%d__|鏈接出錯(cuò):%@”,__FUNCTION__,__LINE__,error);

}

進(jìn)行鏈接的時(shí)候會(huì)有兩種結(jié)果膝捞,一種是成功坦刀,一種失敗

那我們需要通過(guò)XMPP的協(xié)議去實(shí)現(xiàn)這兩種方法

第一個(gè)是成功的

//與服務(wù)器鏈接成功

(void)xmppStreamDidConnect:(XMPPStream *)sender

//與服務(wù)器鏈接失敗

(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender

在兩個(gè)方法內(nèi)分別打印一下

NSLog(@“%s__%d__|”,__FUNCTION__,__LINE__);

我們回到我們的登錄頁(yè)面

在登錄按鈕的方法內(nèi)寫(xiě)入我們的登錄方法

[[XMPPManager defaultManager] loginWithUser:userName password:password];

我們來(lái)驗(yàn)證一下,運(yùn)行以后點(diǎn)擊登錄蔬咬,打印的是[XMPPManager xmppStreamDidConnect];

我們看這里是xmppStreamDidConnect

我們點(diǎn)進(jìn)xmppStream代理方法里看一看這個(gè)方法

注釋內(nèi)容為T(mén)his method is called after registration of a new user has successfully finished

翻譯一下為:調(diào)用此方法后注冊(cè)一個(gè)新用戶已經(jīng)成功完成

這里我們的登錄方法內(nèi)還有一個(gè)password沒(méi)有使用鲤遥,我們現(xiàn)在只是向服務(wù)器發(fā)送了鏈接請(qǐng)求

而沒(méi)有去驗(yàn)證自己的身份,這個(gè)時(shí)候就要使用password來(lái)驗(yàn)證

我們?cè)阪溄臃?wù)器成功地方法內(nèi)寫(xiě)一下

[self.xmppStream authenticateWithPassword:(NSString *) error:(NSError *_autoreleasing *)];

這里的password是在

- (void)loginWithUser:(NSString *)user password:(NSString *)password

方法里地林艘,所以我們需要調(diào)用一下這個(gè)方法給傳過(guò)來(lái)盖奈,我們要保存一下

聲明一個(gè)變量

這里這個(gè)驗(yàn)證也是向服務(wù)器發(fā)送驗(yàn)證

自然也有驗(yàn)證結(jié)果,一個(gè)成功一個(gè)失敗

這個(gè)結(jié)果我們還是要傳回登錄界面狐援,倒不如我們?cè)诘卿浗缑嬷苯荧@取


怎么獲取呢钢坦?

我們之前有提到過(guò)

xmppStream是可以添加多個(gè)對(duì)象的,既然我們這個(gè)XMPPManager可以成為他的代理對(duì)象

那我們的登錄界面自然也可以成為他的代理對(duì)象啥酱,我們?cè)诘卿浗缑嫣砑右幌逻@個(gè)代理對(duì)象

我們來(lái)實(shí)現(xiàn)以下他的協(xié)議方法爹凹。

//驗(yàn)證成功

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender

{

NSLog(@"%s__%d__|",__FUNCTION__,__LINE__);

}

//驗(yàn)證失敗

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error

{

NSLog(@"%s__%d__|驗(yàn)證失敗:%@",__FUNCTION__,__LINE__,error);

}

運(yùn)行以下镶殷,可以看到走的方法是xmppStreamDidAuthenticate禾酱,

證明我們驗(yàn)證成功了。

那我們登錄成功地話绘趋,是不是應(yīng)該把這個(gè)登錄界面dimiss呢颤陶?

在驗(yàn)證成功地方法內(nèi)添加一下dismiss的方法

我們?nèi)绾螌?shí)現(xiàn)登錄過(guò)以后,下次不再出現(xiàn)登錄界面呢陷遮?這個(gè)時(shí)候就需要用到我們數(shù)據(jù)持久化的方法

對(duì)用戶名和密碼進(jìn)行存儲(chǔ)

我們依然在驗(yàn)證成功地方法內(nèi)使用

[[NSUserDefaults standardUserDefaults] setObject:self.userName.text forKey:@"userName"];

[[NSUserDefaults standardUserDefaults] setObject:self.passWord.text forKey:@“password"];


先獲取我們的用戶名和密碼

[[NSUserDefaults standardUserDefaults] synchronize];

然后進(jìn)行保存滓走。(保存到磁盤(pán)上)

在下次進(jìn)入應(yīng)用的時(shí)候應(yīng)該先判斷我們的用戶名

首先用一個(gè)bool方法來(lái)獲取一下我們的用戶名

然后再進(jìn)行一個(gè)判斷,判斷我們是否已經(jīng)登錄

代碼如下

我們還需要把當(dāng)前對(duì)象添加一個(gè)代理帽馋,遵循代理方法去進(jìn)行驗(yàn)證我們的登錄是否成功

以上是我們的登錄功能搅方。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疫粥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腰懂,更是在濱河造成了極大的恐慌,老刑警劉巖项秉,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绣溜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡娄蔼,警方通過(guò)查閱死者的電腦和手機(jī)怖喻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岁诉,“玉大人锚沸,你說(shuō)我怎么就攤上這事√檠ⅲ” “怎么了哗蜈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坠韩。 經(jīng)常有香客問(wèn)我距潘,道長(zhǎng),這世上最難降的妖魔是什么只搁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任音比,我火速辦了婚禮,結(jié)果婚禮上氢惋,老公的妹妹穿的比我還像新娘洞翩。我一直安慰自己,他們只是感情好焰望,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布骚亿。 她就那樣靜靜地躺著,像睡著了一般柿估。 火紅的嫁衣襯著肌膚如雪循未。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天秫舌,我揣著相機(jī)與錄音的妖,去河邊找鬼。 笑死足陨,一個(gè)胖子當(dāng)著我的面吹牛嫂粟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墨缘,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼星虹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼零抬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宽涌,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤平夜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后卸亮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忽妒,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年兼贸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了段直。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溶诞,死狀恐怖鸯檬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情螺垢,我是刑警寧澤喧务,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站甩苛,受9級(jí)特大地震影響蹂楣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讯蒲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一痊土、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墨林,春花似錦赁酝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至搔耕,卻和暖如春隙袁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弃榨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工菩收, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲸睛。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓娜饵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親官辈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箱舞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理遍坟,服務(wù)發(fā)現(xiàn),斷路器晴股,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 優(yōu)秀的代碼是它自己最好的文檔愿伴。當(dāng)你考慮要添加一個(gè)注釋時(shí),問(wèn)問(wèn)自己电湘,“如何能改進(jìn)這段代碼公般,以讓它不需要注釋?zhuān)俊? X...
    神經(jīng)騷棟閱讀 1,322評(píng)論 2 19
  • XMPP簡(jiǎn)介 XMPP協(xié)議簡(jiǎn)介 XMPP協(xié)議(Extensible Messaging and PresenceP...
    不規(guī)則先生閱讀 6,299評(píng)論 2 31
  • 注冊(cè),獲取好友列表胡桨,聊天 我們的注冊(cè)功能實(shí)現(xiàn)上跟登錄功能的步驟大致相當(dāng) 首先需要在我們的XMPPManager類(lèi)中...
    Axela閱讀 592評(píng)論 1 0
  • 01 社交的本質(zhì)是什么昧谊? 世界上沒(méi)有人能夠一直獨(dú)身一人,直至終老酗捌。我們總會(huì)與別人產(chǎn)生交集呢诬,一起經(jīng)歷形形色色的事情,...
    曾國(guó)藩小姐姐閱讀 863評(píng)論 6 15