XMPPFramework 实现IM客户端 (1)

1. 简介

服务器用ejabberd,因为觉得Erlang是一门很不错的语言,最近也在研究。然后采用XMPPFramework作为IOS客户端的xmpp库,我是一个功能一个功能的进行学习,一边学习xmpp协议,一边研究XMPPFramework,所以可能会有不足。

注册和登录

用XMPPFramework连接服务器并登录的整体流程为

1. connect -> authenticate -> goOnline

2. connect -> register ->authenticate -> goOnline

连接服务器

我们通过XMPPStream实例来和服务器进行数据交互

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  NSString *jid = [userDefaults stringForKey:@ "usrname" ];
  NSString *password = [userDefaults stringForKey:@ "password" ];
  if (jid!=nil&&password!=nil) {
  self.isRegister = NO;  //表面此时客户端需要注册还是验证
  } else {
  jid =@ "anonymous@danis-macbookair.local" ;
  }
  NSString *server = @ "danis-macbookair.local" ;
 
self.stream.myJID = [XMPPJID jidWithString:jid];
  self.stream.hostName = server;
 
NSError *error;
  if (![self.stream connectWithTimeout:30 error:&error]) {
  NSLog(@ "error : %@" ,error);
  }

这样就能够通过hostName找到server并进行连接,并根据isRegister判断是注册还是登录,当进行连接后,我们便能够通过XMPPStream的回调方法进行下一步操作,下面我们看看有现在要用到的几个回调方法

//当真个XML流的和标签收到的时候

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 
*当整个XML流的</stream>和</xml>标签收到的时候,此方法被调用
 
*此时我们就可以安全的和服务器进行通信了
 
*/
  - (void)xmppStreamDidConnect:(XMPPStream *)sender;
 
/**
  * This method is called after registration of a new user has successfully finished.
  * If registration fails for some reason, the xmppStream:didNotRegister: method will be called instead.
**/
- (void)xmppStreamDidRegister:(XMPPStream *)sender;
 
/**
  * This method is called if registration fails.
**/
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error;
 
/**
  * This method is called after authentication has successfully finished.
  * If authentication fails for some reason, the xmppStream:didNotAuthenticate: method will be called instead.
**/
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender;
 
/**
  * This method is called if authentication fails.
**/
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error;
 
- (XMPPIQ *)xmppStream:(XMPPStream *)sender willReceiveIQ:(XMPPIQ *)iq;
- (XMPPMessage *)xmppStream:(XMPPStream *)sender willReceiveMessage:(XMPPMessage *)message;
- (XMPPPresence *)xmppStream:(XMPPStream *)sender willReceivePresence:(XMPPPresence *)presence;
/**
  * This method is called after the stream is closed.
**/
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error;

以上就是一些常用的回调函数,然后我们在didConnect里面,进行下一步注册/验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
if ([self.stream isConnected]) {
if (self.isRegister) {
NSString *jidStr = @ "danis@danis-macbookair.local" ;
NSString *password = @ "15651803502" ;
[sender setMyJID:[XMPPJID jidWithString:jidStr]];
 
NSError *error;
NSXMLElement *passElem = [NSXMLElement elementWithName:@ "password" stringValue:password];
NSXMLElement *email = [NSXMLElement elementWithName:@ "email" stringValue:@ "danis@gmail.com" ];
NSXMLElement *phone = [NSXMLElement elementWithName:@ "phone" stringValue:@ "374627846" ];
 
if (![sender registerWithElements:@[email,phone,passElem] error:&error]) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@ "alert" message:@ "register failed" delegate:nil cancelButtonTitle:@ "cancel" otherButtonTitles: nil];
[alert show];
}
 
} else {
NSString *password = [[NSUserDefaults standardUserDefaults]stringForKey:@ "password" ];
NSError *error;
[sender authenticateWithPassword:password error:&error];
}
 
}
}
1
2
- (BOOL)registerWithElements:(NSArray *)elements error:(NSError **)errPtr;
- (BOOL)registerWithPassword:(NSString *)password error:(NSError **)errPtr;

这两个函数就是XMPPStream为我们提供的简单的注册的方式,我们可以通过第一个函数添加我们需要的属性,例如电话号码,生日等,而第二个就直接通过密码进行注册。

下面我们就可以进入下一步的回调了,这几个回调函数的作用刚才已经写过了,

1
2
3
4
5
6
7
8
9
10
11
12
13
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
  if ([sender isAuthenticated]) {
  NSLog(@ "authenticate succeess" );
  XMPPPresence *presence = [XMPPPresence presence];
  [self.stream sendElement:presence];
  }
}
-(void)xmppStreamDidRegister:(XMPPStream *)sender{
  NSLog(@ "did register" );
}
-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{
  NSLog(@ "register failed %@" ,error);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值