创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~

我们在第一篇文章中,已经介绍了Openfire服务器的搭建等环境的配置,

第二篇文章中,导入了XMPPFramework框架,

这一篇,我们将正式进入代码环节,说一说用户的登陆。

1、我们选择新建一个XMPPManager来统一管理即时聊天模块,当然,这个对象得要是个单例。并在其中配置控制台打印设置,这样能让我们看得更清楚些。

+ (instancetype)sharedInstance {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{instance = [[XMPPManager alloc] init];//配置日志打印工具
        [DDLog addLogger:[DDTTYLogger sharedInstance] withLogLevel:XMPP_LOG_FLAG_SEND_RECV];//打开控制台文字色彩
        [[DDTTYLogger sharedInstance] setColorsEnabled:YES];//XMPP_LOG_FLAG_SEND | XMPP_LOG_FLAG_RECV_POST 给这2个级别一人一个颜色
        [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor orangeColor] backgroundColor:[UIColor whiteColor] forFlag:XMPP_LOG_FLAG_SEND];[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor magentaColor] backgroundColor:[UIColor whiteColor] forFlag:XMPP_LOG_FLAG_RECV_POST];});return instance;
}

我们首先在这个单例中初始化一个XMPPStream对象,起到连接的作用。我们用getter方法进行加载:

- (XMPPStream *)xmppStream {if (_xmppStream == nil) {_xmppStream = [[XMPPStream alloc] init];[_xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];[_xmppStream setHostName:@"172.10.0.95"];[_xmppStream setHostPort:5222];[self setupModule];}return _xmppStream;
}

我们先对XMPPStream进行初始化,再用addDelegate: delegateQueue:方法添加XMPPManager对象为代理。

这里的第二个参数需要注意,需要传入一个队列,这个队列,决定了回调执行的队列,是在主队列还是其他队列。

另外,XMPPStream对象可以添加多个代理,实现的原理我们会在以后讨论。简单来说,内部的实现,就是将其加入一个数组中。

HostName和HostPort是本机配置的Openfire服务器的地址和端口,并且在最后设置我们需要用到的模块。

2、设置模块

// 设置模块
- (void)setupModule {// 心跳检测self.xmppAutoPing = [[XMPPAutoPing alloc] initWithDispatchQueue:dispatch_get_main_queue()];// 客户端检测频率[self.xmppAutoPing setPingTimeout:360.0f];// 是否响应对方的ping
    [self.xmppAutoPing setRespondsToQueries:YES];[self.xmppAutoPing addDelegate:self delegateQueue:dispatch_get_main_queue()];// 自动重连模块self.xmppReconnect = [[XMPPReconnect alloc] initWithDispatchQueue:dispatch_get_main_queue()];[self.xmppReconnect setAutoReconnect:YES];// 激活
    [self.xmppAutoPing activate:self.xmppStream];[self.xmppReconnect activate:self.xmppStream];
}

我们可以根据注释看到,分别设置了心跳检测模块,自动重连模块,并且设置了代理,并分别在XMPPStream对象上进行激活,不然不会工作。

3、连接及身份验证

我们写了一个连接登录的方法

- (void)loginWithJid:(XMPPJID *)aJid addPassword:(NSString *)password {self.myJID = aJid;[self.xmppStream setMyJID:aJid];[self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:nil];self.myPassword = password;
}

这里需要说明,JID代表了每个用户,一般由三部分构成:用户名,域名和资源名,例如 test@example.com/Anthony。

我们保存下来当前准备连接登录用户的JID和密码,并调用connectWithTimeout:error:进行连接。

还记得我们之前给XMPPStream对象设置的代理吗?现在就派上用场啦,我们刚刚设置的,在主队列进行回调,下面是回调方法。

/***  socket连接建立成功 三次握手成功*/
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket {// [self.xmppStream authenticateWithPassword:self.myPassword error:nil];
}/*** XML 流被完全打开的时候调用* At this point it's safe to begin communication with the server.* 在这个时间点 跟服务器对话是安全的**/
- (void)xmppStreamDidConnect:(XMPPStream *)sender {//1.登录//2.上线
    [self.xmppStream authenticateWithPassword:self.myPassword error:nil];
}//登录成功的委托
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {//<presence from= to= type= >//<show--系统状态图标/><status/>//</presence>//<presence/>//1.上线XMPPPresence *presence = [XMPPPresence presence];[presence addChild:[DDXMLElement elementWithName:@"show" stringValue:@"xa"]];[presence addChild:[DDXMLElement elementWithName:@"status" stringValue:@"快来找我聊天吧"]];[self.xmppStream sendElement:presence];
}

连接成功的情况下,会调用第一个和第二个方法。我们在第二个方法里面写登录认证,认证成功后,调用第三个方法,这样,我们就登录成功了!

第三个方法中,我们可以设置我们的上线状态,调用sendElement:方法传一个XMPPPresence对象,告诉服务器我的登录状态。

当然,也有连接失败的情况,会进入下面的回调:

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error {}- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error {}

当出现失败的情况,可以找一下是不是网络的原因,或者对照下上面说的模块,如果没有解决,欢迎贴出来大家讨论一下~

以上就是用户登录的内容,下一篇,我们来说一说好友模块,下篇见~

创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~

转载于:https://www.cnblogs.com/FrankieZ/p/5281797.html

iOS开发--XMPPFramework--用户登录(三)相关推荐

  1. python3.0实例_python3.0 模拟用户登录,三次错误锁定的实例

    python用户登录三次锁定怎么修改 1.normal_user是存放用户id及密码的文件 2.lock_file是存放被锁定的用户id的文档,默认为空. 3.程序会对normal_user里的合法用 ...

  2. python用户登录三次机会的注释_用户登录(三次错误机会)(示例代码)

    简介这篇文章主要介绍了用户登录(三次错误机会)(示例代码)以及相关的经验技巧,文章约1907字,浏览量493,点赞数9,值得参考! #!/usr/bin/env python # -*- coding ...

  3. 微信小程序开发之——用户登录-搭建开发者服务器(2)

    一 概述 用Node.js搭建开发者服务器 开发服务器作为登录中的三个角色(小程序/开发者服务器/微信接口)中的重要一环 开发者服务器接收code,保存openid和session_key,并返回to ...

  4. iOS开发-Umeng第三方登录-个人整理

    官方网址: http://dev.umeng.com/social/ios/operation#2 一.注册友盟账号 登陆友盟官网,在我的产品页面添加新应用,然后获取到Appkey. http://w ...

  5. 玩转iOS开发:NSURLSession讲解(三)

    文章分享至我的个人技术博客: https://cainluo.github.io/14986211698053.html 前言 虽然前面两讲都是说了NSURLSession的一些理论上的知识, 但我们 ...

  6. 微信小程序开发之——用户登录-登录流程(1)

    一 概述 新建微信小程序自带用户登录简化 小程序登录流程时序 二 新建微信小程序自带用户登录简化 新建的微信小程序默认有用户登录功能,将多余功能去除后,简化如下 2.1 index.wxml < ...

  7. IOS开发高手课第三篇 App Auto Layout 是怎么进行自动布局的,性能如何?

    03 | Auto Layout 是怎么进行自动布局的,性能如何? Auto Layout ,是苹果公司提供的一个基于约束布局,动态计算视图大小和位置的库,并且已经集成到了 Xcode 开发环境里. ...

  8. iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现

    相关资源地址: 本项目demo地址 :   https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载:  最新微博SDK 官网注册地址:点击打开链接 最 ...

  9. CMDB开发之用户登录登出的cookie校验

    django cookie session 我们要写一个cmdb被称为运维资源管理系统,BIM流程管理平台,类似这样的项目,很重要的点,就是用户画像,我们来描述参与业务的主体,和之间的关系.在这样的项 ...

  10. 微信小程序开发之——用户登录-开放数据校验与解密(6)

    一 概述 小程序端获取到的用户信息通过wx.request发送给开发者服务器 开发者服务器无法辨别数据的真伪(如发送虚假用户信息) 小程序提供了开发数据的校验和解密机制 二 获取用户信息 2.1 代码 ...

最新文章

  1. DOS批处理高级教程精选(六)
  2. iPhone5或明年下半年发布 配备iOS6和A6芯片
  3. 最近的生活[发点牢骚]
  4. 探索客户端JavaScript
  5. 使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...
  6. Kerberos加密级别不支持的问题
  7. java面试题_2020年JAVA最新大厂面试题!
  8. L1-06 吉老师的回归 (15 分)
  9. zabbix 代理报错
  10. Linux 下的这些高效指令,是你快速入门运维的神器
  11. 如何修改网络连接的网络位置
  12. vue 中引入阿里云的云盾防水墙
  13. c语言高级成分,高级语言的基本成分数据成分,运算成分,控制成分,传输成分,怎么看它们的类型区别的?比如其中对处理对象的类型说明属于高级语...
  14. Ubuntu安装jdk-8u201-linux-x64.tar.gz
  15. 转载tangl_99的Servlet 实现文件上传下载--自己的一点心得
  16. UIview 添加触摸.手势
  17. Java中Arrays数组工具类的使用全解
  18. Android 设置黑白滤镜
  19. css template download
  20. 分析非结构化数据的10个步骤

热门文章

  1. 经典机器学习系列(七)【聚类分析】
  2. Linux系统是否被植入木马的排查流程梳理
  3. intellij自动补全变量名和变量属性
  4. JAVA学习之 Model2中的Servlet与.NET一般处理程序傻傻分不清楚
  5. Caused by: java.lang.NumberFormatException: For input string: 18446744073709551615
  6. PAT 1044 火星数字(20)(思路+代码)
  7. 巧用DictionaryTKey,TValue,完成客户需求
  8. 使用 paddle来进行文本生成
  9. React Native (一) 入门实践
  10. dispatch_async 与 dispatch_get_global_queue 的使用方法