XMPPFramework開發(fā)(二):工程配置以及登錄注冊


搞事前言


在前面一篇博客中說到關(guān)于Openfire的服務(wù)器的搭建,這一篇博客就從登錄注冊開始搞起,其實(shí)發(fā)現(xiàn)很多網(wǎng)上的XMPPFramework的使用博客都是簡單的說一下其中的各種代理方法是干什么用的,各種界面之間的邏輯沒有較為詳細(xì)的講解,所以騷棟準(zhǔn)備從XMPPFramework中各種代理方法的使用情況以及一個簡單的聊天App的邏輯實(shí)現(xiàn),進(jìn)行詳細(xì)的說明講解.恩恩,對于自己寫的示例SDChat也是寫了好幾天了,其中還是存在不少的Bug.我準(zhǔn)備同步更新,一邊改Bug的同時,一邊更新博客.希望大家諒解.


XMPPFramework的工程配置


  • XMPPFramework這個我沒有使用cocospod,而是直接手動導(dǎo)入了文件夾.大家可以直接從SDChat中把XMPPFramework的拖到自己的工程中去,也可以從Github上源碼原處下載.
  • 我們把XMPPFramework導(dǎo)入工程之后,我們需要手動導(dǎo)入如下的兩個庫.
libxml2.tbd
libresolv.tbd
  • 上面的基本就配置完成了,但是我們需要把服務(wù)器文件XMPPConfig.h配置完成.我們在工程中需要的配置項(xiàng)目有這么幾個,分別是服務(wù)器的IP地址、服務(wù)器的的端口(默認(rèn)的為5222),openfire的服務(wù)器名稱诬烹、resource(資源,這個可以自行定義).

    服務(wù)器名稱我們可以登錄openfire的管理頁面中,進(jìn)行查看和修改.

    如果openfire的服務(wù)器是搭建在mac上的話,服務(wù)器的IP地址可以在網(wǎng)絡(luò)偏好設(shè)置中進(jìn)行查看.
配置的過程有兩點(diǎn)是需要注意的,一、如果openfire的服務(wù)器是搭建在mac上的話,服務(wù)器和移動端必須要在同一局域網(wǎng)內(nèi).否則,應(yīng)用是連接不上服務(wù)器的.二,每一次mac的無線網(wǎng)絡(luò)的變動,IP都有可能發(fā)生改變,如果后期連接不上,請注意查看是否是openfire的服務(wù)器的IP發(fā)生了改變.

配置完成的示例如下所示.

#ifndef XMPPSample_XMPPConfig_h
#define XMPPSample_XMPPConfig_h

// openfire服務(wù)器IP地址
#define  kHostName      @"192.168.3.18"

// openfire服務(wù)器端口 默認(rèn)5222
#define  kHostPort      5222
// openfire服務(wù)器名稱
#define kDomin @"127.0.0.1"
// resource(資源)
#define kResource @"ios"

#endif
  • 對于info.plist文件其實(shí)也是需要一些相關(guān)的修改的,但是基本上和XMPPFramework沒有太大的關(guān)系,我們會在具體模塊中進(jìn)行說明.


XMPPFramework的登錄功能實(shí)現(xiàn)


由于XMPPFramework的功能比較多,所以我們需要添加一個管理單例SDXmppManager,管理XMPPFramework所有的功能.我們在SDXmppManager.h文件中導(dǎo)入#import "XMPPFramework.h".

我們先一瞅SDchat中登錄界面的騷包風(fēng)采.~~~

在XMPPFramework中,登錄注冊功能主要是由XMPPStream這個類來完成的.我們在SDXmppManager單例中創(chuàng)建一個XMPPStream對象屬性用來管理整個應(yīng)用的登錄注冊.

@property(nonatomic,strong)XMPPStream *stream;

然后我們在單例初始化的過程中對XMPPStream對象屬性進(jìn)行初始化,設(shè)置IP地址以及端口號,并且指定代理對象.

 self.stream = [[XMPPStream alloc]init];
 self.stream.hostName = kHostName;
 self.stream.hostPort = kHostPort;
  //設(shè)置stream的代理
  [self.stream addDelegate:self delegateQueue:dispatch_get_main_queue()];

好了,基本的準(zhǔn)備工作就做完了,接下來.我們先看一下具體登錄流程圖,然后在比對著SDChat中的登錄操作代碼進(jìn)行詳細(xì)的說明.(流程圖尺寸有點(diǎn)大,如果看不清楚,請先下載到本地在查看.)

流程圖中基本所有的代碼操作都是在SDXmppManager這個單例中完成的.登錄首先其實(shí)主要分為兩大步,第一步先連接服務(wù)器,第二步驗(yàn)證密碼.流程圖把兩大部分拆分成好多小的步驟.

我們先看一下如何連接服務(wù)器.如下代碼所示,我們需要判斷是否已經(jīng)連接到服務(wù)器了.如果已經(jīng)連接是需要先斷開連接的,然后使用登錄賬號,服務(wù)器名稱,資源名稱(可省略)配置成基于jabber協(xié)議的由用戶名生成的唯一ID,并配置到stream中去.然后調(diào)用- (BOOL)connectWithTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr方法連接服務(wù)器.

//與服務(wù)器的建立鏈接
-(void)connectToServerWintUser:(NSString *)name{
    
    if ([self.stream isConnected]) {
        
        [self.stream disconnect];
        
    }
    
    //jid jabberID,是基于jabber協(xié)議的由用戶名生成的唯一ID
    self.stream.myJID = [XMPPJID jidWithUser:name domain:kDomin resource:kResource];
    
    NSLog(@"%@",self.stream.myJID);
    NSError *error = nil;
    
    //與服務(wù)器建立鏈接.
    [self.stream connectWithTimeout:30.0f error:&error];
    
    if (error != nil) {
        
        NSLog(@"連接失敗!");
    }
    
}

上面如果驗(yàn)證成功之后,就會調(diào)用XMPPStream的-(void)xmppStreamDidConnect:(XMPPStream *)sender這個代理方法,我們需要在這里面進(jìn)行驗(yàn)證密碼.驗(yàn)證密碼比較簡單只需要調(diào)用[self.stream authenticateWithPassword:self.password error:&error];這一句代碼即可.具體情況如下.因?yàn)樽院偷卿涱愃?所以兩者需要放在了一起.

//與服務(wù)器建立連接
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
    NSError *error = nil;
    switch (self.type) {
        case DoLgin:

            [self.stream authenticateWithPassword:self.password error:&error];
            if (error != nil) {
                NSLog(@"認(rèn)證過程出錯!");
            }

            break;
            
        case DoRegiser:
            
            [self.stream registerWithPassword:self.regiserPassword error:&error];
            if (error != nil) {
                NSLog(@"注冊過程出錯!");
            }

            break;
    }
    
}

驗(yàn)證完成之后,我們需要進(jìn)行一些界面跳轉(zhuǎn)砌们、用戶登錄狀態(tài)的修改以及保存密碼和JID的操作,這些我是放在SDLoginVC這個控制器進(jìn)行的,SDLoginVC這個控制器是登錄界面的控制器.繼承于SDLaunchViewController,這是我以前寫的可以做動態(tài)背景的頁面的控制器,感興趣的童鞋可以點(diǎn)擊這里看看.在SDLaunchViewController這個控制器中是有計(jì)時器的,所以我們在頁面跳轉(zhuǎn)的時候要把計(jì)時器(rollTimer和timer)及時的釋放掉.

//登錄成功!跳轉(zhuǎn)頁面(代理實(shí)現(xiàn))
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{

    XMPPPresence *presence =  [XMPPPresence presenceWithType:@"available"];
    
    [[SDXmppManager defaulManager].stream sendElement:presence];
    
    [SDUser defaulUser].jid =[XMPPJID jidWithUser:self.userName.text domain:kDomin resource:kResource];
    [SDUser defaulUser].password = self.passWord.text;
    [[SDXmppManager defaulManager].roster fetchRoster];

    
    if (self.timer !=nil) {
        
        [self.timer invalidate];
        self.timer = nil;
    }
    
    if (self.rollTimer != nil) {
        [self.rollTimer invalidate];
        self.rollTimer = nil;
    }
    self.view.window.rootViewController = self.contactNC;

}

登錄成功之后,我們就可以對好友列表信息和個人信息進(jìn)行獲取了.這個會在后面的博客中說到.登錄的基本流程就是這樣了.下面我們看一下注冊功能的實(shí)現(xiàn).


XMPPFramework的注冊功能實(shí)現(xiàn)


SDChat中注冊界面如下所示,其實(shí)用戶名稱并沒有用到,這樣的注冊界面在用戶頭像那部分也是出現(xiàn)了Bug的.下一步著重處理.


注冊的邏輯和登錄的邏輯基本是相同的,也是兩大部分,一部分是連接服務(wù)器,第二部分則是驗(yàn)證注冊密碼.主要代碼跟登錄的基本是一致的,就是驗(yàn)證方法有所不同.沿著密碼的方法改為[self.stream registerWithPassword:self.regiserPassword error:&error];;

主要用到的注冊成功-(void)xmppStreamDidRegister:(XMPPStream *)sender或者失敗-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error代理方法具體代碼如下所示.我們在注冊成功的方法中進(jìn)行了頁面的跳轉(zhuǎn),在失敗的方法中進(jìn)行了用戶的提醒.

//當(dāng)注冊成功的時候進(jìn)行調(diào)動
-(void)xmppStreamDidRegister:(XMPPStream *)sender{
    
    UIAlertController *alertView = [UIAlertController alertControllerWithTitle:nil message:@"注冊成功!" preferredStyle:UIAlertControllerStyleAlert];
    __weak typeof(self)temp = self;
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"返回登錄" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        [temp popLoginVC];

    }];
    
    [alertView addAction:action];
    
    [self presentViewController:alertView animated:YES completion:nil];
}
//當(dāng)注冊不成功的時候進(jìn)行調(diào)用
-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{
    
    [self showAlertViewWithMessage:@"注冊失敗~,請檢查服務(wù)器"];
}

注冊完成之后,我們還可以進(jìn)行個人名片的設(shè)置等操作.后期將在個人的電子模塊這個部分將會說到.今天就不過多的說明了.


結(jié)束


說到這里基本上XMPPFramework的工程配置以及登錄注冊相關(guān)的知識就說完了,下一篇博客騷棟將對XMPPFramework開發(fā)過程中好友列表的獲取進(jìn)行詳細(xì)的說明.最后把SDChat的傳送門送給大家,大家也可以自己先看一下,如果有任何問題,歡迎聯(lián)系騷棟,謝謝大家了.

-->SDChat傳送門??


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市墩莫,隨后出現(xiàn)的幾起案子厅贪,更是在濱河造成了極大的恐慌,老刑警劉巖堤结,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唆迁,死亡現(xiàn)場離奇詭異,居然都是意外死亡竞穷,警方通過查閱死者的電腦和手機(jī)唐责,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘾带,“玉大人鼠哥,你說我怎么就攤上這事】凑” “怎么了朴恳?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長允蚣。 經(jīng)常有香客問我于颖,道長,這世上最難降的妖魔是什么嚷兔? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任森渐,我火速辦了婚禮,結(jié)果婚禮上冒晰,老公的妹妹穿的比我還像新娘同衣。我一直安慰自己,他們只是感情好壶运,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布耐齐。 她就那樣靜靜地躺著,像睡著了一般蒋情。 火紅的嫁衣襯著肌膚如雪蚪缀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天恕出,我揣著相機(jī)與錄音,去河邊找鬼违帆。 笑死浙巫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刷后。 我是一名探鬼主播的畴,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尝胆!你這毒婦竟也來了丧裁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤含衔,失蹤者是張志新(化名)和其女友劉穎煎娇,沒想到半個月后二庵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缓呛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年催享,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哟绊。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡因妙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出票髓,到底是詐尸還是另有隱情攀涵,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布洽沟,位于F島的核電站以故,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玲躯。R本人自食惡果不足惜据德,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跷车。 院中可真熱鬧棘利,春花似錦、人聲如沸朽缴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽密强。三九已至茅郎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間或渤,已是汗流浹背系冗。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薪鹦,地道東北人掌敬。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像池磁,于是被迫代替她去往敵國和親奔害。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理地熄,服務(wù)發(fā)現(xiàn)华临,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • error code(錯誤代碼)=0是操作成功完成端考。error code(錯誤代碼)=1是功能錯誤雅潭。error c...
    Heikki_閱讀 3,368評論 1 9
  • 來~揭厚,我們先來瞧瞧我們等下將要安裝的資源,如下圖所示: 看完我們將要安裝的資源寻馏,我先講一下安裝的順序哈~ 1. 安...
    景彧閱讀 352評論 0 3
  • error code(錯誤代碼)=2000是無效的像素格式棋弥。error code(錯誤代碼)=2001是指定的驅(qū)動...
    Heikki_閱讀 1,786評論 0 4
  • XMPPFramework開發(fā)前言 這兩天沒有更新博客,這里先對大家說聲對不起了.因?yàn)檫@幾天一直忙于研究XMPPF...
    神經(jīng)騷棟閱讀 6,617評論 56 73