身份认证方法 - (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];
}
好友状态
获取好友状态,通过实现
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
方法
当接收到
一个
presence 的状态:
available 上线
away 离开
do not disturb 忙碌
unavailable 下线
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
NSString *presenceType = [presence type];
NSString *presenceFromUser = [[presence from] user];
if (![presenceFromUser isEqualToString:[[sender myJID] user]]) {
if ([presenceType isEqualToString:@"available"]) {
//
} else if ([presenceType isEqualToString:@"unavailable"]) {
//
}
}
}
接收消息
通过实现
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message;
方法
当接收到
根据 XMPP 协议,消息体的内容存储在标签 内
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {
NSString *messageBody = [[message elementForName:@"body"] stringValue];
}
发送消息
发送消息,我们需要根据 XMPP 协议,将数据放到
Hello World!
- (void)sendMessage:(NSString *) message toUser:(NSString *) user {
NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
[body setStringValue:message];
NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
[message addAttributeWithName:@"type" stringValue:@"chat"];
NSString *to = [NSString stringWithFormat:@"%@@example.com", user];
[message addAttributeWithName:@"to" stringValue:to];
[message addChild:body];
[self.xmppStream sendElement:message];
}
好友列表
好友列表,在 XMPP 中被称为 roster,花名册?
获取 roster 需要客户端发送
一个 IQ 请求:
from="xiaoming@example.com"
to="example.com"
id="1234567">
type 属性,说明了该 iq 的类型为 get,与 HTTP 类似,向服务器端请求信息
from 属性,消息来源,这里是你的 JID
to 属性,消息目标,这里是服务器域名
id 属性,标记该请求 ID,当服务器处理完毕请求 get 类型的 iq 后,响应的 result 类型 iq 的 ID 与 请求 iq 的 ID 相同
- (void)queryRoster {
NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
NSXMLElement *iq = [NSXMLElement elementWithName:@"i