XMPPFramework 实现IM客户端 (1)

来源:互联网 发布:张小龙ppt知乎 编辑:程序博客网 时间:2024/06/06 11:10

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
原创粉丝点击