iOS XMPP(2)自己创建客户端
一.目的以及效果:
用Xcode利用xmpp框架建立客户端,实现向服务器注册添加用户 密码,以及登陆,离线状态
工程的主要结构:新建singleview工程,用xib拖放两个输入框和两个按钮,
并在viewcontroller中进行关联,建立regisgtviewcontroller同时选中xib,利用xib关联
最终效果在网页Openfire管理控制台中可以查看
二.具体过程:
关键框架:#import "XMPPFramework.h"
建立一个单例viewcontroller
单例部分:
.h文件中
//单例的初始化方法
+(instancetype)shareManager;
//登陆的方法
-(void)loginWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block;
//注册方法
-(void)registerWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block;
//注销
-(void)logOut;
.m文件中
//(自己写的)类的拓展 私有方法
@interface XMPPManager1()<XMPPStreamDelegate>
{
//用block用来回调处理
__block void(^_block)(NSString *name,NSString *password,int resultType);
}
@property(nonatomic,strong)XMPPStream *stream;
//记录用户名 密码
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *password;
//设置bool值 登陆和注册的方法不同 需要判断
@property(nonatomic,assign)int type;
@end
@implementation XMPPManager1
//单例的初始化方法
+(instancetype)shareManager
{
static XMPPManager1 *share = nil;
static dispatch_once_t onecToken;
dispatch_once(&onecToken, ^{
share = [[XMPPManager1 alloc]init];
});
return share;
}
//只初始化一次
-(id)init
{
if ([super init]) {
//初始化xmppstream
self.stream = [[XMPPStream alloc]init];
//设置服务器的地址
self.stream.hostName = @"127.0.0.1";
//设置端口
self.stream.hostPort = 5222;
//设置代理
[self.stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
return self;
}
//登陆的方法
-(void)loginWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block
{
self.type = 1;//登陆
self.name = name;//记录用户
self.password = password;//记录密码
_block = block;
//设置用户
XMPPJID *jid = [XMPPJID jidWithUser:name domain:@"wuxiaoyuan.local" resource:@"iphone"];
self.stream.myJID = jid;
//调用连接方法
[self connectToServer];
}
//提取出连接服务器的方法
-(void)connectToServer
{
//再次点击 处于连接状态会断开连接
if ([self.stream isConnected]) {
[self logOut];
}
NSError *error = nil;
[self.stream connectWithTimeout:XMPPStreamTimeoutNone error:&error];
if (error) {
NSLog(@"%@",error);
}
}
//注册方法
-(void)registerWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block
{
self.type = 2;//注册
self.name = name;//记录用户
self.password = password;//记录密码
_block = block;
//设置用户
XMPPJID *jid = [XMPPJID jidWithUser:name domain:@"wuxiaoyuan.local" resource:@"iphone"];
self.stream.myJID = jid;
//调用连接方法
[self connectToServer];
}
//注销
-(void)logOut
{
//改变用户状态 为离线
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
[self.stream sendElement:presence];
//断开连接
[self.stream disconnect];
}
#pragma mark --代理方法
//连接失败
-(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender
{
NSLog(@"连接失败");
if (_block) {
_block(self.name,self.password,-1);
}
//需要断开连接
[self.stream disconnect];
}
//连接成功
-(void)xmppStreamDidConnect:(XMPPStream *)sender
{
if (self.type == 1) {
//向服务器发送密码验证 (验证成功和验证失败)
[self.stream authenticateWithPassword:self.password error:nil];
}else if(self.type == 2)
{
//向服务器发送密码进行注册 (验证成功和验证失败)
[self.stream registerWithPassword:self.password error:nil];
}
}
//----------------------
//验证失败
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
NSLog(@"验证失败哦");
if (_block) {
_block(self.name,self.password,0);
}
//需要断开连接
[self.stream disconnect];
}
//验证成功
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
//改变用户状态 为在线
XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
[self.stream sendElement:presence];
}
//----------------------
//----------------------
//注册失败
-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
{
NSLog(@"注册失败");
if (_block) {
_block(self.name,self.password,0);
}
//需要断开连接
[self.stream disconnect];
}
//注册成功
-(void)xmppStreamDidRegister:(XMPPStream *)sender
{
NSLog(@"注册成功");
if (_block) {
_block(self.name,self.password,1);
}
//需要断开连接
[self.stream disconnect];
}
//----------------------
在其他的controller中调用单例
关键语句:
[[XMPPManager1 shareManager]registerWithName:self.userField.text andPassword:self.passwordField.text block:^(NSString *name, NSString *password, int resultType) {
if (resultType == 1) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}];
iOS XMPP(2)自己创建客户端的更多相关文章
- ios xmpp开发应用后台模式接收聊天信息处理方案
ios xmpp开发应用后台模式接收聊天信息 最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了: 怎么样才能使应用被切到后台时,应用中的网络连接 ...
- ios xmpp 发送语音图片解决方案
ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项目需求需要实现语音和图片的发送. 发送语音图片有三种方法. 1,xmpp smack.文件传输方 ...
- iOS XMPP 通信协议实现 图形化直观感受
第一次随笔,实在不知写点什么有用的东西,那就分享一下本人最近的研究所得吧! 是关于iOS-XMPP-通信协议的实现,具体代码比较复杂,三言两句也实在难表达清楚,网上已有很多关于iOS XMPP协议的讲 ...
- CXF 动态创建客户端调用稳定版本号为2.7.18
今天用动态创建客户端的方式调用webservice,报了这样一个错: 2017-01-05 20:51:46,029 DEBUG main org.apache.cxf.common.logging. ...
- iOS开发多线程篇—创建线程
iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...
- iOS中plist的创建,数据写入与读取
iOS中plist的创建,数据写入与读取 Documents:应用将数据存储在Documents中,但基于NSuserDefaults的首选项设置除外Library:基于NSUserDefaults的 ...
- IOS 入门开发之创建标题栏UINavigationBar的使用(二)
IOS 入门开发之创建标题栏UINavigationBar的使用 http://xys289187120.blog.51cto.com/3361352/685746 IOS 开发有关界面的东西 ...
- iOS——文件操作NSFileManager (创建、删除,复制,粘贴)
iOS——文件操作NSFileManager (创建.删除,复制,粘贴) iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视 ...
- 蜗牛爱课- iOS中plist的创建,数据写入与读取
iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{ NSArray *paths=NSSearchPathForDirect ...
随机推荐
- storm的安装配置
一.安装Zookeeper 1.设置.profile文件: export ZOOKEEPER_HOME=/home/hadoop/streamdata/zookeeper-3.4.5-cdh4.5.0 ...
- Apache Rewrite常用设置说明
例子: RewriteEngine on 打开引擎 RewriteRule test.html /test.php [L] RewriteRule test.html?$ /tianqi.php?s1 ...
- HDU4864:Task(贪心)
题意: 给出n个机器和m个任务,对于一天来说,每个机器有最大工作时间xi,可接受最大等级yi,每个任务有一个工作时间xi,一个等级yi,可获价值为500*xi+2*yi,任务需要在一台机器一天内完成, ...
- 开源软交换系统 FreeSwitch 与 Asterisk 比较
Asterisk 与freeswitch都是流行的开源软交换服务器,Asterisk出现的比较早,大概在1999年开始此项目,应该是最流行的开源软交换服务器,整个社区上下游都已经很成熟. freesw ...
- Android 不同应用通过SharedPreference实现共享数据
Android不同应用之间数据的共享有许多方式,但是我觉得还是使用sharedPreference比较简单和轻量级.如果程序B想要访问程序A的sharedPreference可以通过下面的语句来实现: ...
- redis神器
redis是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存. redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上. ...
- [iOS基础控件 - 6.10.6] UIApplicationDelegate & 程序启动过程
A.概念 1.移动app非常容易受到其他的系统.软件事件的干扰,如来电.锁屏 2.app受到干扰的时候,UIApplication会通知delegate,来代理处理干扰事件 3.delegate可以处 ...
- JS一定要放在Body的最底部么? 聊聊浏览器的渲染机制
请参看文章 https://segmentfault.com/a/1190000004292479 网上的回答: 1.js加载会阻塞其它内容加载,使页面加载时间更长,尤其是js文件太大,有的页面js文 ...
- 从0,1,2...n中统计0,1,2...9各出现了多少次【SWUN1597】
题目就是说给你一个N.计算一下从0,1,2,3,4,5,,,,,,n-1,n中计算出0,1,2,3,,,,7,8,9分别出现了多少次... #include<cstdio> #includ ...
- ALT(预警)
1. Alert简介 Alert是一种Oracle系统中的一种机制,它可以监视系统数据库,在规定的情况下给规定用户一个通知,通知可以是邮件或者其他形式,在标注的系统和客户化系统中都是可以定义使用的 2 ...