(六十八)使用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];
相关文章
相关标签/搜索