XMPPFramework(二)

2014-11-24 10:47:49 · 作者: · 浏览: 1
t and received, and after the stream features have been received, and any required features have been fullfilled. At this point it's safe to begin communication with the server.

身份认证方法 - (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

方法

当接收到 标签的内容时,XMPPFramework 框架回调该方法

一个 标签的格式一般如下:

   这里是显示的内容

   这里是显示的状态

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;

方法

当接收到 标签的内容时,XMPPFramework 框架回调该方法

根据 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 需要客户端发送 标签向 XMPP 服务器端查询

一个 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 相同

子标签,说明了客户端需要查询 roster

复制代码
- (void)queryRoster {
    NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
    NSXMLElement *iq = [NSXMLElement elementWithName:@"i