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
- XMPPFramework 实现IM客户端 (1)
- 简单IM客户端的实现
- XMPP协议实现即时通讯底层书写 (三) IOS XMPPFramework --IM底层架构设计+技术准备工作
- Asmact实现IM客户端所遇到的问题及解决方案
- IM聊实现客户端之间信息交互需求文档
- IM聊天进阶(三)IM>openfire>mina>mina搭建服务端和客户端 实现简单点对点聊天
- XMPPFramework
- XMPPFramework
- xmppframework
- XMPPFramework
- XMPPFramework
- XMPPFramework
- IM客户端一览。
- IM web客户端
- IOS -- XMPPFramework 即时聊天(3:XMPPFramework 实现连接服务器)
- WPF一步步开发XMPP IM客户端1:入门
- IOS -- XMPPFramework 即时聊天(1:XMPPFramework简介)
- IM 客户端C++版本改进。
- XMPPFramework 介绍
- Hibernate Session的Flush模式
- net_device
- Netbeans XDebug环境搭建
- java 选择文件夹 JFileChooser
- XMPPFramework 实现IM客户端 (1)
- Http Session 详解
- hdu4333----Revolving Digits
- Perl 检测域名是否正常解析
- HDU 1312
- Grant的时候报错的解决:Access denied for user 'root'@'localhost' (using password: YES)
- session 和cookies
- 在Ubuntu安装Tomcat7.0及开机自动运行
- 关于线程Thread的学习