(六十八)使用XMPPFramework登陸

按照XMPPFramework的官方樣例,應該把登陸代碼放置在AppDelegate中,而且讓註銷成爲私有方法。服務器

XMPPFramework進行登陸的步驟以下:app

①鏈接主機,而且發送JID框架

②若是鏈接成功,則發送密碼進行受權dom

③受權成功後,發送上線消息異步

④若是要註銷,發送下線消息,而且斷開鏈接。socket

通常讓XMPPFramework工做在子線程中,和異步socket相似,經過代理來處理各個狀態。spa

下面是使用框架登陸的步驟:線程


①包含XMPPFramework.h代理

②定義XMPPStream成員屬性,遵循XMPPStream代理協議:
code

@interface AppDelegate () <XMPPStreamDelegate>{
    XMPPStream *_stream;
}

③在application didFinishLaunch...方法中調用connectToHost方法鏈接主機:

注意其中XMPPStream的connectWithTimeout: error:方法返回false表明失敗,應該打印錯誤信息。

這裏使用的是本地openfire服務器,登陸帳戶zs@soulghost.local,密碼爲123456。

若是XMPPStream爲空,說明尚未建立,進行初始化:

- (void)setupXMPPStream{
    
    _stream = [[XMPPStream alloc] init];
    [_stream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
    
}
鏈接主機的代碼:

- (void)connectToHost{
    
    if (_stream == nil) {
        [self setupXMPPStream];
    }
    
    _stream.hostName = @"localhost";
    _stream.hostPort = 5222;
    
    // resource用於標識用戶登錄的客戶端類型
    XMPPJID *myJID = [XMPPJID jidWithUser:@"zs" domain:@"soulghost.local" resource:@"iPhone"];
    _stream.myJID = myJID;
    NSError *err = nil;
    if(![_stream connectWithTimeout:XMPPStreamTimeoutNone error:&err]){
        NSLog(@"%@",err);
    }
    
}
④鏈接主機成功和失敗都有代理方法,若是成功應該發送密碼:

- (void)xmppStreamDidConnect:(XMPPStream *)sender{
    
    NSLog(@"鏈接成功");
    [self sendPwdtoHost];
    
}

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{
    
    NSLog(@"鏈接斷開,%@",error);
    
}
⑤若是鏈接成功,發送密碼:

- (void)sendPwdtoHost{
    
    NSError *err = nil;
    [_stream authenticateWithPassword:@"123456" error:&err];
    if (err) {
        NSLog(@"%@",err);
    }
    
}
⑥受權成功和失敗都有相應的方法:

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
    
    NSLog(@"受權成功");
    [self sendOnlineToHost];
    
}

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
    
    NSLog(@"受權失敗,%@",error);
    
}
⑦若是受權成功,應該發送在線消息,在線是經過發送帶有available標識的presence實現的:

- (void)sendOnlineToHost{
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
    [_stream sendElement:presence];
}
⑧若是要離線,只須要發送帶有unavailable標識的presence便可:

調用XMPPStream的disconnect方法能夠斷開與主機的鏈接。

- (void)logout{
    
    // 發送離線消息
    XMPPPresence *offline = [XMPPPresence presenceWithType:@"unavailable"];
    [_stream sendElement:offline];
    NSLog(@"註銷成功");
    // 與服務器斷開鏈接
    [_stream disconnect];
    
}
⑨若是要在其餘地方調用logout,只須要獲得AppDelegate單例調用:

    // 註銷登陸
    AppDelegate *app = [UIApplication sharedApplication].delegate;
    [app logout];
相關文章
相關標籤/搜索