按照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];