将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. 初识react中的状态量

    react组件中的两类状态数据:props,state,官网API给出的使用规范,多读几遍,受益匪浅: 结论: 1. 对应任何可变的数据,理应只有一个单一“ 数据源 ” 2. 如果多个组件均需要这些数 ...

  2. 修改nagios登录界面密码

    htpasswd -c /usr/local/nagios/etc/htpasswd.user nagiosadmin 输入密码: 重启httpd服务.

  3. 洛谷 P1363 幻想迷宫

    题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊…… LHX:momo...我们一定能走 ...

  4. Openjudge 2.5 6264:走出迷宫

    总时间限制:  1000ms 内存限制:  65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n* ...

  5. [Batch檔案筆記] 在UNC路徑中執行Batch檔

    為了讓其他人可以免安裝又可以執行python程式所以我把python portable版本 winpython 放在samba的空間共享但是使用者如果要開 winpython cammand prom ...

  6. FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to controller/192.168.1.183:9000. Exiting. java.io.IOExcep

    2018-01-09 09:47:38,297 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed ...

  7. block总结我的

    1) struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void * ...

  8. 数据库_4_SQL介绍

    SQL SQL:Structured Query Language,结构化查询语言(数据已查询为主:99%是在进行查询操作)    what型语言,而非how型的语言. SQL分为三个部分: DDL: ...

  9. VC-基础:VC中得到当前系统的时间和日期

    得到当前时间的方法一般都是得到从1900年0点0分到现在的秒数,然后转为年月日时分秒的形式得到当前的时间(时分秒).主要方法如下: 1)使用CRT函数 C++代码   ]; time_t nowtim ...

  10. C++系统学习一:基本数据类型和变量

    程序语言 程序语言最基本的特征 整型.字符型等内置类型 变量,用来为对象命名 表达式和语句,操纵上述数据类型的具体值 if等控制结构 函数,定义可供随时调用的计算单元 程序语言的扩展 自定义数据类型 ...