一.目的以及效果:

用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)自己创建客户端的更多相关文章

  1. ios xmpp开发应用后台模式接收聊天信息处理方案

    ios xmpp开发应用后台模式接收聊天信息 最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了: 怎么样才能使应用被切到后台时,应用中的网络连接 ...

  2. ios xmpp 发送语音图片解决方案

    ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项目需求需要实现语音和图片的发送. 发送语音图片有三种方法. 1,xmpp smack.文件传输方 ...

  3. iOS XMPP 通信协议实现 图形化直观感受

    第一次随笔,实在不知写点什么有用的东西,那就分享一下本人最近的研究所得吧! 是关于iOS-XMPP-通信协议的实现,具体代码比较复杂,三言两句也实在难表达清楚,网上已有很多关于iOS XMPP协议的讲 ...

  4. CXF 动态创建客户端调用稳定版本号为2.7.18

    今天用动态创建客户端的方式调用webservice,报了这样一个错: 2017-01-05 20:51:46,029 DEBUG main org.apache.cxf.common.logging. ...

  5. iOS开发多线程篇—创建线程

    iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...

  6. iOS中plist的创建,数据写入与读取

    iOS中plist的创建,数据写入与读取 Documents:应用将数据存储在Documents中,但基于NSuserDefaults的首选项设置除外Library:基于NSUserDefaults的 ...

  7. IOS 入门开发之创建标题栏UINavigationBar的使用(二)

    IOS 入门开发之创建标题栏UINavigationBar的使用 http://xys289187120.blog.51cto.com/3361352/685746     IOS 开发有关界面的东西 ...

  8. iOS——文件操作NSFileManager (创建、删除,复制,粘贴)

    iOS——文件操作NSFileManager (创建.删除,复制,粘贴)       iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视 ...

  9. 蜗牛爱课- iOS中plist的创建,数据写入与读取

    iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{    NSArray *paths=NSSearchPathForDirect ...

随机推荐

  1. Classes and Objects :类和对象(2)

    类内部可以有另一个类,也就是内部类,如果带static则为静态内部类静态内部类当然不能直接访问实例变量内部类修饰符可以有四种,而外部类只有两种 内部类的意义:这个内部类只适用于这个外部类因为外部类的某 ...

  2. 第二百五十一天 how can I 坚持

    hadoop,namenote和datanode.namenode如果要是在启动时加载到内存,会不会对内存的要求比较高呢. edits-->fsimage. secondnamenode,那么n ...

  3. New full duplex HTTP tunnel implementation (client and server)

    https://issues.jboss.org/browse/NETTY-246?page=com.atlassian.jirafisheyeplugin:fisheye-issuepanel —— ...

  4. DelphiXE8怎么使用调试模式

    需求:在开发Android程序时,大家一直是使用ShowMessage.其实XE是支持下断点的. 操作: 1.小米手机用USB线,连到电脑上. 2.小米手机-设置-关于手机-"MIUI版本& ...

  5. POJ 1062 昂贵的聘礼 (最短路)

    昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...

  6. 条件编译#ifdef的妙用详解_透彻

    这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条 ...

  7. C#不错的扩展工具类

    FSLibExtension.NET https://github.com/iccfish/FSLib.Extension WebEssentials2013 https://github.com/i ...

  8. Codeforces Gym 100418K Cards 暴力打表

    CardsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...

  9. .net简单录音和播放音频文件代码

    本代码特点:不用DirectX ,对于C/S .B/S都适用. 方法: //mciSendStrin.是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下面介绍一下它的 ...

  10. delphi TTreeView组件遍历磁盘目录

    TTreeView组件遍历磁盘目录 实例说明 TTreeView组件是一个以分枝结构或者说树状结构显示数据的组件,以该组件显示数据具有较好的等级关系和逻辑层次,并且易于操作.在组件中显示的数据结构与系 ...