XMPP实现2

我们需要与服务器连接,可以创建一个XMPP的管理类,负责处理客户端与服务器端的交互

我们来创建一个XMPPManager类,继承NSObject

因为XMPPManager这个类他是负责整个客户端与服务器端的即时通讯,所以他只需要一个实例就可以了,我们来创建一个单例。


XMPP框架里有个类,叫做XMPPStream,通信管道,他是负责客户端和服务端的数据传输

就好比你拿一台座机跟你的朋友打电话一样,这台电话需要一个电话线才可以

首先我们要引入XMPPFrameWork的框架

然后我们来创建一个XMPPStream的对象   ,创建完了以后我们要对他进行一个初始化

创建完这个对象后,我们要给他指定服务器的IP地址,XMPPStream有一个属性

叫做hostName,我们这里定义了一个宏,叫做kHostName,我们可以点进去看一下

除了服务器地址外呢,我们还需要给XMPPStream设置一个端口号

什么是端口号呢?

我们的服务器内储存的都是服务,可能有sqlite服务,email服务,或者我们的XMPP服务

每一个服务都有对应的一个端口号,就好比你出去面试一样,一家公司告诉你,我们公司在望京SOHO大楼里,几楼,几号,这个望京SOHO就相当于是一个服务器,里面存储着的各家公司就好比是服务,而每家公司都肯定会有一个自己的门牌号,要没有这些的话,公司邀请你面试,告诉你我们在望京SOHO,你来吧,门牌号没有,自己找,你肯定会想,逗我玩呢?

所以我们的服务是必须要有端口号的,这样才可以让我们准确地找到我们的服务,来进行实现我们要得功能

我们的XMPPStream有一个属性,叫做hostPort,我们这里也定义了一个宏

XMPP使用的openfire他有一个默认的端口是5222,我们把5222设定为了一个宏

有了这两个之后他就明白你要连接到服务器的哪个服务了

最后我们要当前的这个对象成为XMPPStream的代理对象,因为你要向服务器发送连接请求

那么你可能连接成功也可能连接失败,和我们的HTTP请求一样

那么这个连接成功与失败需要我们的一个协议方法来告知我们结果

所以我们要当前对象成为XMPPStream代理对象

首先我们要遵循XMPPStream的一个协议

然后我们添加一个代理方法

[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];

通常我们使用代理的时候都是setDelegate 那么一个对象只能设置一个代理对象

这里比较特殊,待会我们就可以看到这里使用添加代理对象有什么样的好处

然后我们就可以向服务器发送连接请求

我们写一个方法,专门为服务器发送连接请求

//连接请求

(void)connectToServer

我们有了连接,当然也不能少了断开方法

//断开连接

(void)disconnectWithServer

连接的时候我们要进行一个判断,判断当前是否正在链接

[self.xmppStream isConnected];

如果正在连接,我们断开连接

[self disconnectWithServer];

为什么要这么做呢?

就比如你现在和你得A朋友正在打电话,但是你又想给C朋友打电话,那你不得把这边挂了才能给那边打过去吗?

那么断开之后,就可以向服务器发送链接,在向服务器发送链接之前呢

你需要告诉服务器,你是谁

在XMPP框架中呢,有一个XMPPJID类,JID呢,是Jabber ID的缩写,因为我们的XMPP其实就是基J于Jabber协议的基础开发的,JID就是XMPP中得唯一标示

我们可以创建一个XMPPJID,我们来看一下他的初始化方法

XMPPJID *jid = [XMPPJID jidWithUser:(NSString *)domain:(NSString *) resource:(NSString *)];

user就是你得用户名domain是域名,配置openfire给他的域名 resource客户端的来源,比如你得QQ,比如iPhone或者window或者是Android

我们这里定义的有宏,domain这里的openfire给的域名一致就可以了。

那我们这里的user给什么呢?我们这个用户名可以使用一个接口就行了。

XMPPManager里面有一个方法

- (void)loginWithUser:(NSString *)user password:(NSString *)password

我们把XMPPJID *jid = [XMPPJID jidWithUser:(NSString *)domain:kDomain resource:kResource];写入里面

这个时候我们可以把第一个参数写为user

我们这个xmppStream里有个参数为myJID 把他等于jid;

然后就可以进行连接

NSError *error = nil;

[self.xmppStream connectWithTimeout:30.0f error:&error];

判断一下我们的错误信息

if (nil != error )

{

NSLog(@“%s__%d__|链接出错:%@”,__FUNCTION__,__LINE__,error);

}

进行链接的时候会有两种结果,一种是成功,一种失败

那我们需要通过XMPP的协议去实现这两种方法

第一个是成功的

//与服务器链接成功

(void)xmppStreamDidConnect:(XMPPStream *)sender

//与服务器链接失败

(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender

在两个方法内分别打印一下

NSLog(@“%s__%d__|”,__FUNCTION__,__LINE__);

我们回到我们的登录页面

在登录按钮的方法内写入我们的登录方法

[[XMPPManager defaultManager] loginWithUser:userName password:password];

我们来验证一下,运行以后点击登录,打印的是[XMPPManager xmppStreamDidConnect];

我们看这里是xmppStreamDidConnect

我们点进xmppStream代理方法里看一看这个方法

注释内容为This method is called after registration of a new user has successfully finished

翻译一下为:调用此方法后注册一个新用户已经成功完成

这里我们的登录方法内还有一个password没有使用,我们现在只是向服务器发送了链接请求

而没有去验证自己的身份,这个时候就要使用password来验证

我们在链接服务器成功地方法内写一下

[self.xmppStream authenticateWithPassword:(NSString *) error:(NSError *_autoreleasing *)];

这里的password是在

- (void)loginWithUser:(NSString *)user password:(NSString *)password

方法里地,所以我们需要调用一下这个方法给传过来,我们要保存一下

声明一个变量

这里这个验证也是向服务器发送验证

自然也有验证结果,一个成功一个失败

这个结果我们还是要传回登录界面,倒不如我们在登录界面直接获取


怎么获取呢?

我们之前有提到过

xmppStream是可以添加多个对象的,既然我们这个XMPPManager可以成为他的代理对象

那我们的登录界面自然也可以成为他的代理对象,我们在登录界面添加一下这个代理对象

我们来实现以下他的协议方法。

//验证成功

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender

{

NSLog(@"%s__%d__|",__FUNCTION__,__LINE__);

}

//验证失败

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

{

NSLog(@"%s__%d__|验证失败:%@",__FUNCTION__,__LINE__,error);

}

运行以下,可以看到走的方法是xmppStreamDidAuthenticate,

证明我们验证成功了。

那我们登录成功地话,是不是应该把这个登录界面dimiss呢?

在验证成功地方法内添加一下dismiss的方法

我们如何实现登录过以后,下次不再出现登录界面呢?这个时候就需要用到我们数据持久化的方法

对用户名和密码进行存储

我们依然在验证成功地方法内使用

[[NSUserDefaults standardUserDefaults] setObject:self.userName.text forKey:@"userName"];

[[NSUserDefaults standardUserDefaults] setObject:self.passWord.text forKey:@“password"];


先获取我们的用户名和密码

[[NSUserDefaults standardUserDefaults] synchronize];

然后进行保存。(保存到磁盘上)

在下次进入应用的时候应该先判断我们的用户名

首先用一个bool方法来获取一下我们的用户名

然后再进行一个判断,判断我们是否已经登录

代码如下

我们还需要把当前对象添加一个代理,遵循代理方法去进行验证我们的登录是否成功

以上是我们的登录功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,110评论 18 139
  • 优秀的代码是它自己最好的文档。当你考虑要添加一个注释时,问问自己,“如何能改进这段代码,以让它不需要注释?”* X...
    神经骚栋阅读 1,250评论 2 19
  • XMPP简介 XMPP协议简介 XMPP协议(Extensible Messaging and PresenceP...
    不规则先生阅读 6,199评论 2 31
  • 注册,获取好友列表,聊天 我们的注册功能实现上跟登录功能的步骤大致相当 首先需要在我们的XMPPManager类中...
    Axela阅读 560评论 1 0
  • 01 社交的本质是什么? 世界上没有人能够一直独身一人,直至终老。我们总会与别人产生交集,一起经历形形色色的事情,...
    曾国藩小姐姐阅读 842评论 6 15