将XMPPStream放在APPDelegate,以便全局访问

#pragma mark - XMPP相关的属性和方法定义
/**
* 全局xmppstream,只读属性
*/
@property (strong,nonatomic,readonly) XMPPStream *xmppStream;
/**
* 通知服务器用户上线
*/
- (void)goOneline; /**
* 通知服务器用户下线
*/
- (void)goOffline;

XMPPStream相关方法

#pragma mark - 设置XMPPStream

- (void)setupStream {
//避免被重复实例化
if (_xmppStream == nil) {
//1.实例化XMPPStream
_xmppStream = [[XMPPStream alloc]init];
//2.添加代理
//因为所有网络请求都是做基于网络数据处理,跟UI界面无关,因此可以让代理方法在其它线程中运行
//从而提高程序的运行性能
[_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, )];
} } #pragma mark - 通知服务器用户上线 - (void)goOneline {
//1.实例化一个"展现",上线的报告
XMPPPresence *presence = [XMPPPresence presence];
//2.发送presence给服务器
//服务器知道"我"上线后,只需要通知我的好友,而无需通知我,因此,次方法没有回调
[_xmppStream sendElement:presence]; } #pragma mark - 通知服务器用户下线 - (void)goOffline {
NSLog(@"用户下线");
//1.实例化一个“展现”,下线报告
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
//2.发送Presence给服务器,通知服务器客户端下线
[_xmppStream sendElement:presence];
}

connect&disConnect与服务器连接与断开

- (void)connect {
//1.设置XMPPStream
[self setupStream];
//2.设置用户名,密码,主机(服务器),连接时不需要password
NSString *userName = [[NSUserDefaults standardUserDefaults]objectForKey:kXMPPUserNameKey];
NSString *hostName = [[NSUserDefaults standardUserDefaults]objectForKey:kXMPPHostNameKey];
//3.设置XMPPStream的JID和主机
// [_xmppStream setMyJID:[XMPPJID jidWithString:userName]]; //@127.0.0.1
[_xmppStream setMyJID:[XMPPJID jidWithUser:userName domain:[[NSUserDefaults standardUserDefaults]objectForKey:kXMPPHostNameKey] resource:nil]];
[_xmppStream setHostName:hostName];
//4.开始链接
NSError *error = nil;
[_xmppStream connectWithTimeout: error:&error];
//提示:如果没有制定JID和hostName,才会出错,其他都不会出错
if (error) {
NSLog(@"连接请求发送出错:%@",error.localizedDescription);
}else {
NSLog(@"连接请求发送成功");
}
}
- (void)disConnect {
//1.通知服务器下线
[self goOffline];
//2.XMPPStream断开连接
[_xmppStream disconnect];
}

XMPPStream代理方法

1.连接完成(如果服务器地址不对不会调用这个方法)

- (void)xmppStreamDidConnect:(XMPPStream *)sender;

在这里面一般发送身份验证请求和注册请求

  if (_isRegisterUser) {
// 用户注册,发送注册请求
[_xmppStream registerWithPassword:password error:nil];
} else {
// 用户登录,发送身份验证请求
[_xmppStream authenticateWithPassword:password error:nil];
}

2.注册

成功:

- (void)xmppStreamDidRegister:(XMPPStream *)sender;

失败:(一般原因是用户名已经存在)

- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error;

3.身份验证(登录)

成功:

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender;

失败:

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

注意:这里失败原因一般是密码错误,还有一种,如果错误是:

//<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized></not-authorized></failure>

错误原因及解决办法:http://www.cnblogs.com/hxwj/p/4420776.html

xmpp 登录注册小结的更多相关文章

  1. 7. Swift 基于Xmpp和openfire实现一个简单的登录注册

    1. 基本步骤:首先导入Xmpp框架,配置环境 ->由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接. 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语 ...

  2. spring boot 登录注册 demo (四) -- 体验小结

    之前没有折腾过Spring,直接上来怼Spring Boot异常痛苦,参考着官网的guide(https://spring.io/guides)写了几个demo: spring boot 跑起来确是方 ...

  3. openfire xmpp 登录参数解析

    1.openfire xmpp登录 boolean result = false; ConnectionConfiguration config = new ConnectionConfigurati ...

  4. web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)

    这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...

  5. android安卓Sqlite数据库实现用户登录注册

    看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...

  6. JQuery+Ajax+Struts2+Hibernate 实现完整的登录注册

    写在最前: 下午有招聘会,不想去,总觉得没有准备好,而且都是一些不对口的公司,可是又静不下心来,就来写个博客. 最近在仿造一个书城的网站:http://www.yousuu.com ,UI直接拿来用, ...

  7. HTML登录注册界面怎么制作?

    在没有学习CSS样式的前提下,是如何做一个简单的注册界面的. 一.表单标签(form) 首先我们先写一个<form></form>的标签,form标签属于表单标签,通常我们的登 ...

  8. php+ajax 登录注册页面

    主要是登录注册功能,前端后台验证没有什么,这个大家可以自己加上去,比如过滤啊,正则啊等 还是先放图吧 这是登录及注册界面  点击注册切换到注册界面,点击登录切换到登录界面 <!DOCTYPE h ...

  9. Nodejs学习总结 -Express 登录注册示例(二)

    项目创建后,我们来做个登录注册实例,详细操作步骤如下. 1.新建项目demo ,具体操作步骤参考上一章内容 https://www.cnblogs.com/Anlycp/ 2.添加mysql和sess ...

随机推荐

  1. [原创] SOAP UI 创建SOAP工程进行接口测试

    下载及安装 1. 登录http://www.soapui.org/ 2. 鼠标移动到导航头的Downloads选项 3. 点击SOAP UI 4. 下载页面 新建项目 创建项目 1. 创建项目很简单. ...

  2. COGS 1578. 次小生成树初级练习题

    ☆   输入文件:mst2.in   输出文件:mst2.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式] 第一行包含两个整数N 和M,表 ...

  3. 6.3 lambda 表达式

    6.3.1 lambda 表达式是一个可传递的代码块,可以在以后执行一次或者多次. 思考(如何按指定时间间隔完成工作,将这个工作放在一个ActionListener的actionPerformed方法 ...

  4. eclipse 的project explorer问题,这个怎样把localFileSystem去掉,

    这个非常简单 把勾去掉就可以了

  5. Bellman-Ford与SPFA

    一.Bellman-Ford Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(当然也可以是无向图).与Dijkstra相比的优点是,也适合存在负权的图. 若存在最短路(不含负环时 ...

  6. Hopfield 网络(上)

    讲的什么 这部分主要对 Hopfield 网络作一大概的介绍.写了其模型结构.能量函数和网络的动作方式.主要参考了网上搜到的一些相关 PPT.   概述 早在 1982 年,Hopfield 发表的文 ...

  7. nyoj-248-buying feed

    http://acm.nyist.net/JudgeOnline/problem.php?pid=248 BUYING FEED 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 ...

  8. (4)JSTL的SQL标签库

    jstl的SQL标签库 SQL tag Library中的标签用来提供在 JSP 页面中可以与数据库进行交互的功能Database access标签库有以下6组标签来进行工作: <sql:set ...

  9. Bootstrap历练实例:超小的按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  10. 删除链表的倒数第N个节点(三种方法实现)

    删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒 ...