用户登录
准备工作
比较知名的开源XMPP服务器:一个是Openfire,一个是ejabberd
Openfire 使用 Java 语言编写,比较容易上手,地址:http://www.igniterealtime.org/projects/openfire/
ejabberd 使用 Erlang 语言编写,是一款非常知名的 Erlang 开源项目,地址:http://www.ejabberd.im/
安装 ejabberd,可以参考我的博客:【ejabberd】安装XMPP服务器ejabberd(Ubuntu 12.04)
搭建一个自己的 XMPP 服务器之后,就让我们开始吧!
连接服务器
1、新建一个 XMPPStream 对象,添加委托
添加委托方法 - (void)addDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue
参数 delegateQueue 为委托回调所使用的 GCD 队列,dispatch_get_main_queue() 获取主线程 GCD 队列
2、设置 JID 和 主机名
JID 一般由三部分构成:用户名,域名和资源名,例如 [email protected]/Anthony
如果没有设置主机名,则使用 JID 的域名作为主机名
端口号是可选的,默认是 5222
3、连接
- (void)connect { if (self.xmppStream == nil) { self.xmppStream = [[XMPPStream alloc] init]; [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; } if (![self.xmppStream isConnected]) { NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"]; XMPPJID *jid = [XMPPJID jidWithUser:username domain:@"lizhen" resource:@"Ework"]; [self.xmppStream setMyJID:jid]; [self.xmppStream setHostName:@"10.4.125.113"]; NSError *error = nil; if (![self.xmppStream connect:&error]) { NSLog(@"Connect Error: %@", [[error userInfo] description]); } } }
身份认证
实现 - (void)xmppStreamDidConnect:(XMPPStream *)sender 委托方法
连接服务器成功后,回调该方法
This method is called after the XML stream has been fully opened. More precisely, this method is called after an opening
身份认证方法 - (BOOL)authenticateWithPassword:(NSString *)inPassword error:(NSError **)errPtr
- (void)xmppStreamDidConnect:(XMPPStream *)sender { NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; NSError *error = nil; if (![self.xmppStream authenticateWithPassword:password error:&error]) { NSLog(@"Authenticate Error: %@", [[error userInfo] description]); } }
上线
实现 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender 委托方法
身份认证成功后,回调该方法
This method is called after authentication has successfully finished.
If authentication fails for some reason, the xmppStream:didNotAuthenticate: method will be called instead.
新建一个 XMPPPresence 对象,类型为 available,发送!
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"]; [self.xmppStream sendElement:presence]; }
退出并断开连接
新建一个 XMPPPresence 对象,类型为 unavailable,发送!
断开连接
- (void)disconnect { XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; [self.xmppStream sendElement:presence]; [self.xmppStream disconnect]; }