iOS即時通訊開發

XMPPFramework的使用(一)---用户登录

2016-10-07  本文已影响1791人  小冰山口

简单的问题,不要搞复杂了,就算有一点偏差,也比一团浆糊强

XMPP = The Extensible Messaging and Presence Protocol(可扩展通讯和表示协议)楼主表示记不住这么长的东东, 那么就不记了,暂且叫他协议

这个 XMPP 协议是基于 XML 流同服务器以及客户端交互的, 那么,我们首先就要用到 XMPPStream这个东东.

当然, 我说的是导入 XMPPFramework 框架后的事情

XMPPFramework这个框架很大, 东西也很多, 打开他的文件目录就可以看到


XMPPFramework基本架构
而我们主要用到 Core 里面的一些 API
Core 文件夹
以及 Extension 里面的一些 API
Extension文件夹

既然 XMPP 是基于 XML 流来沟通用户和服务器的,那么所有交互信息都将汇入这个流中

#pragma mark *** 懒加载 ***
- (XMPPStream *)xmppstream
{
    if (!_xmppstream) {
        /* 初始化 */
        _xmppstream = [[XMPPStream alloc]init];
        /* 主机名 */
        _xmppstream.hostName = @"127.0.0.1";
        /* 主机端口 */
        _xmppstream.hostPort = 5222;
        /* 设置代理 */
        [_xmppstream addDelegate:self delegateQueue:dispatch_get_main_queue()];
        
         /* 添加心跳包模块 */
        [self  addAutoPingModule];
        
         /* 添加自动重连模块 */
        [self addReconnectModule];
        
         /* 添加花名册模块 */
        
        [self addRosterModule];
    }
    return _xmppstream;
}

可以看出, xmppStream 初始化分三个步骤

  1. 初始化(创建流对象)
  2. 设置服务器 IP和端口号(告诉流往哪里连接)
  3. 添加代理(成功与否通过代理回调)
#pragma mark *** 事件处理 ***

- (void) loginWithAccountName:(NSString *)accountName password:(NSString *)password successHandle:(void(^)())successHandle andFailueHandle:(void(^)(NSError *))failueHandle{
    self.accountName = accountName;
    self.password = password;
    self.successHandle = successHandle;
    self.failueHandle = failueHandle;
    
    /* 创建 XMPPJID */
    XMPPJID *jid = [XMPPJID jidWithUser:accountName domain:@"tsaievan.com" resource:@"iphone 8S 土豪金"];
    self.xmppstream.myJID = jid;
    /* 流连接服务器 */
    NSError *error = nil;
    /* -1表示一直保持连接 */
    if (![self.xmppstream isConnected]) {
        [self.xmppstream connectWithTimeout:-1 error:&error];
    }
    if (error) {
        NSLog(@"流连接失败");
    }else
    {
        NSLog(@"流连接成功");
        [self.xmppstream authenticateWithPassword:self.password error:nil];
    }
}

// -------- 向服务器验证账号失败 --------
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
    NSLog(@"%@",error);
    NSError *xmppError = [NSError errorWithDomain:@"YFXMPPManager" code:101 userInfo:@{NSLocalizedDescriptionKey:error}];
    /* 错误处理回调 */
    self.failueHandle(xmppError);
}

// -------- 向服务器验证账号成功 --------
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    /* 设置出席节点 */
    XMPPPresence *presence = [XMPPPresence presence];
    [presence addChild:[DDXMLElement elementWithName:@"show" stringValue:@"away"]];
    [presence addChild:[DDXMLElement elementWithName:@"status" stringValue:@"今晚请你喝咖啡"]];
    [self.xmppstream sendElement:presence];
    NSLog(@"认证成功");
    /* 认证成功的回调 */
    self.successHandle();
}
#pragma mark *** 事件处理 ***
    // -------- 点击登录按钮触发的事件 --------
- (IBAction)loginButtonClickAction:(UIButton *)sender {
    
    [kYFXMPPManager loginWithAccountName:self.accountTextField.text password:self.passwordTextField.text successHandle:^{
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UITabBarController *tabBarController = [storyBoard instantiateViewControllerWithIdentifier:@"tabBarController"];
        [UIApplication sharedApplication].keyWindow.rootViewController = tabBarController;
        
    } andFailueHandle:^(NSError *error) {
        
        NSLog(@"登录失败%@",error);
    }];
}

是不是有点晕呢?通过下图希望你能找回点感觉,要记住,用户和服务器的交互是通过流来完成的!

登录流程图
上一篇下一篇

猜你喜欢

热点阅读