XMPP框架的下载与导入等问题请参照 —— XMPP框架的分析、导入及问题解决

这篇我们利用XMPP框架来实现一下登陆功能,先来介绍一下XMPP框架内的几个比较重要的文件
* XMPPStream:开发过程中主要的交互类,所有自定义代码和拓展都基于此类
* XMPPParser:提供XMPPStream解析
* XMPPJID:提供一个JID(不可改变)实现,遵循NSCopying协议和NSCoding协议
* XMPPElement:以下三个XMPP元素的基类
* XMPPIQ:数据请求
* XMPPMessage:消息
* XMPPPresence:是否在线状态
* XMPPModule:开发XMPP拓展时使用
* XMPPLogging:XMPP日志框架
* XMPPInternal :整个XMPP框架内部核心和底层内容
注:
为了开发更效率,建议把XMPPStream放到AppDelegate中,便于全局访问。
XMPP本身只提供接收IQ、Message和Presence三种XMPP类型的代理委托系统,要实现更多的功能,就需要我们编写相关的代码。
接下来我们来配置XMPPStream实例
1. 配置连接服务器的方式
2. 添加代理
3. 添加模块
4. 开始连接
5. 开始授权
XMPP登录的方式和我们正常情况下登录的习惯不同,它是客户端与服务器先建立一个长连接,然后客户端将JID发送到服务器,服务器告诉客户端已经连接成功,然后客户端再把密码发送给服务器,如图:
了解了XMPP的连接过程,我们就按照这个过程来实现登录和注销模块
1>

2>

首先我们要引用XMPPFramework.h头文件,设置代理,添加成员变量,为了方便理解,在这里将登录分别放到5个方法内(其中初始化、连接服务器、连接成功后发送密码、授权成功后发送在线消息为私有方法,而注销则为公共方法方便外界调用)。然后在XMPP代理方法中适当调用

#pragma mark - XMPP

// 初始化XMPPStream

- (void)setupXMPPStream

{

_xmppStream = [[XMPPStream alloc] init];

// 设置代理

[_xmppStream addDelegate:selfdelegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)];

}

初始化完成后我们就要和服务器进行连接

// 连接服务器

- (void)connectToHost

{

// 连接服务器

if (!_xmppStream)
{

[self setupXMPPStream];

}

// 设置JID resource标记登录的客户端

XMPPJID *myJID
= [XMPPJID jidWithUser:@"wangwu"domain:@"xxxxxxxxxxxxxxx.local" resource:@"iOS"];

_xmppStream.myJID =
myJID;

// 设置服务器域名 可设置域名或者IP地址

_xmppStream.hostName = @"xxxxxxxxxxxxxx.local";

// 设置端口(默认的话可省略)

_xmppStream.hostPort = 5222;

// 连接

NSError *error = nil;

if (![_xmppStream connectWithTimeout:XMPPStreamTimeoutNoneerror:&error])
{

NSLog(@"%@",error);

}

}

有登录对应的就有注销功能,所以我们先来完成注销

// 注销

- (void)disConnectToHost

{

// 发送离线消息,在DEMO里面我们可以清楚看到"unavailable"表示离线的意思

XMPPPresence *offline = [XMPPPresence presenceWithType:@"unavailable"];

[_xmppStream sendElement:offline];

// 与服务器断开连接

[_xmppStream disconnect];

}

连接成功后,我们需要获得授权,所以把密码发送给服务器

// 发送密码

- (void)sendPwdTOHost

{

NSError *error = nil;

[_xmppStream authenticateWithPassword:@"123456" error:&error];

if (error)

{

NSLog(@"%@", error);

}

}

授权成功后,我们需要告诉服务器,谁在线,所以给服务器发送一条在线的消息

// 发送在线消息

- (void)sendOnlineTOHost

{

XMPPPresence *presence = [XMPPPresence presence];

// 发送

[_xmppStream sendElement:presence];

}

#pragma mark - XMPPStream代理

// 连接成功

- (void)xmppStreamDidConnect:(XMPPStream *)sender

{

NSLog(@"与服务器连接成功!");

// 成功后发送密码进行授权操作

[self sendPwdTOHost];

}

// 连接失败

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError*)error

{

NSLog(@"与主机断开连接%@",error);

}

// 授权成功

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender

{

NSLog(@"授权成功");

// 发送在线消息

[self sendOnlineTOHost];

}

// 授权失败

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error

{

NSLog(@"授权失败");

}

到这里XMPP的登录和注销就演示完毕了,本篇的DEMO请前往 —— XMPP实现登录与注销功能 下载,密码:5i3f
如果有什么错误或者问题,可以联系我,转载请注明出处,谢谢!

XMPP实现登陆注销功能的更多相关文章

  1. JavaWeb的登陆与注销功能

    JavaWeb 登录与注销 大致流程 一般我们在Web应用中 登录页面一般是以 login.jsp的首页 大致流程如下: 当我们在前台写入用户名和密码之后,点击登录按钮 会将表单提交给一个LoginS ...

  2. XMPP框架下微信项目总结(2)授权登陆/注销/注册/打印日志

    xmpp授权登陆步骤1 初始化xmppstream 连接服务器 传递属性jid(IP地址 端口号)2 连接成功后 传递“登”陆密码授权 3 授权后,发送在线消息xmpp所有的代理都是子线程中调用的,处 ...

  3. JS实现注销功能

    JS实现注销功能,代码如下: <script> window.history.forward(1); </script> 这个代码的用法就是: 比如,我们此时有两个页面:Log ...

  4. 「小程序JAVA实战」小程序我的个人信息-注销功能(42)

    转自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/ 注 ...

  5. 装饰器实现session登陆 验证功能

    装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...

  6. MVC会员注销功能Cookie的应用

    我们实现了<MVC应用程序实现会员登录功能>http://www.cnblogs.com/insus/p/3466512.html 有登录就会有注销功能.此次Insus.NET练习一个MV ...

  7. 1_python小程序之实现用户的注册登陆验证功能

    python小程序之实现用户的注册登陆验证功能 程序扼要简述:  一.程序流程:1.程序开始2.判断本地文件/数据库是否已存在用户信息,存在则跳转到登陆,否则跳转到注册,注册成功后后跳转到登陆3.判断 ...

  8. 29、Flask实战第29天:cms用户名渲染和注销功能实现

    这节来完成用户名渲染和注销的功能,目前用户名在前端页面是写死的,我们需要动态的展示出来 用户名渲染 实现用户名动态展示,其中一种方法就是在视图函数,根据session信息,获取到user id,通过该 ...

  9. Android Studio实现登陆注册功能之手机号验证

    我们平常写的登陆注册功能,就是很普通的注册一个账号,设置密码,然后登录.这次,想写一个与之前稍微不一样的登陆注册界面,于是想到了手机号验证的方式. 现在我们市面上出现的很多app,都是采用的手机号注册 ...

随机推荐

  1. .NET平台下IIS7.5+无后缀名伪静态实现办法

    首先新建一个应用程序池,名称任意,比如:nettest,托管管道模式先暂时设置为集成模式,等下面的一系列设置完成之后再设置成经典模式: 部署好站点,并将此站点的应用程序池设置为nettest; 选中站 ...

  2. 关于SQL递归查询在不同数据库中的实现方法

    比如表结构数据如下: Table:Tree ID Name ParentId 1 一级  0 2  二级 1 3  三级 2 4 四级 3 SQL SERVER 2005查询方法: //上查 with ...

  3. qml基础学习 基础概念

    一.概括 学习qt已有2年多的时间,从qt4.7开始使用直到现在正在使用的qt5.6,基本都在windows机器上做开发.最近有意向看了下qt的qml部分,觉着还是挺不错的,毕竟可以做嵌入式移动端产品 ...

  4. SQL Server时间粒度系列----第1节时间粒度概述

    本文目录列表: 1.什么是时间粒度?2.SQL Server提供的时间粒度3.SQL Server时间粒度代码演示   4.SQL Server基准日期 5.总结语6.参考清单列表   什么是时间粒度 ...

  5. Git 查看文件的历史

    用惯了tfs,刚一接触git感觉很不顺手,特别是一些很基本的操作,用起来都怪怪的(可能是不习惯命令行的原因吧).下面把查看文件历史的用例小结一下. 查看某个文件的修改历史 在git中查看历史的命令主要 ...

  6. silverlight制作虚线的边框

    <Grid><Grid HorizontalAlignment="Center" VerticalAlignment="Center" x:N ...

  7. 做贴吧系统,偶然发现使用iframe的弊端

    个人拙见 常听人说起现在不建议使用iframe框架,而我却一再使用,也许是能力有限,一直没在意有什么弊端. 我这此使用的事左右iframe框架,并且只在主页中定义了大背景,每个页面并没有分别定义背景, ...

  8. jQuery 3.0正式发布

    jQuery 基金会刚刚发布了该 JavaScript 框架的 3.0 版本,并且首次抛弃了对老旧的 IE 浏览器的支持.jQuery 3.0 的工作始于 2014 年 10 月,其最初目标是在 2. ...

  9. Oracle忘记密码的处理办法

    可能有的人在很长一段时间不用Oracle数据库,然后在反过来用的时候就会发现自己依然忘记了密码... 这里提供一个忘记密码后的解决办法 首先呢,你打开数据库用 sys或者是sysdba超级管理员用户名 ...

  10. nested exception is org.hibernate.QueryException: could not resolve property

    SSH框架出现了下面的错误: nested exception is org.hibernate.QueryException: could not resolve property 检查了hbm.x ...