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

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

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

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

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

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

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


XMPPFramework的使用(一)---用户登录_第1张图片
XMPPFramework基本架构
而我们主要用到 Core 里面的一些 API
XMPPFramework的使用(一)---用户登录_第2张图片
Core 文件夹
以及 Extension 里面的一些 API
XMPPFramework的使用(一)---用户登录_第3张图片
Extension文件夹

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

  • 在这个 demo 中,我们将创建一个 xmppStream 流,让我们来看一下这个流是怎么初始化的
#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. 添加代理(成功与否通过代理回调)
  • 创建流对象成功后,发起连接之前,你还需要将 jid 绑定到流上,这样才算是沟通用户和服务器
#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];
    }
}

  • 但是无论账号填写什么,甚至是 nil,流也是会连接成功的,因为流连接只需要域名和端口号即可

  • 那登录成功的密码验证呢? 则是在流连接成功后, 通过流发送验证请求, 如果验证通过,这通过代理回调, 在方法内部再调用 block, 实现C端(控制器端)的操作

// -------- 向服务器验证账号失败 --------
- (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();
}
  • 在控制器端完成 block 的回调
#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);
    }];
}

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

XMPPFramework的使用(一)---用户登录_第4张图片
登录流程图

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

你可能感兴趣的:(XMPPFramework的使用(一)---用户登录)