最近一直相研究下如何用xmpp第三方库写一个实现群组聊天的Demo但苦于没人给指路,所以就从个人聊天开始下手。这里就讲一下个人聊天用xmpp如何实现
//
// ViewController.m
// XMPPDemo
//
// Created by pk on 14/10/17.
// Copyright (c) 2014年 pk. All rights reserved.
//
#import "ViewController.h"
#import "XMPPFramework.h"
#define HOST @"1000phone.net"
@interface ViewController (){
IBOutlet UITextField* _nameField;
IBOutlet UITextField* _passwordField;
IBOutlet UITextField* _friendField;
IBOutlet UITextField* _textField;
XMPPStream* _stream;
XMPPRoster* _roster;
}
- (IBAction)reg:(id)sender;
- (IBAction)login:(id)sender;
- (IBAction)addFriend:(id)sender;
- (IBAction)sendMessage:(id)sender;
- (IBAction)getFriendList:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//xmpp流
_stream = [[XMPPStream alloc] init];
//设定服务器
[_stream setHostName:HOST];
//添加代理
[_stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
//roster
_roster = [[XMPPRoster alloc] initWithRosterStorage:[[XMPPRosterCoreDataStorage alloc] init]];
[_roster addDelegate:self delegateQueue:dispatch_get_main_queue()];
//和stream关联
[_roster activate:_stream];
}
//上线
- (void)goOnline{
//
XMPPPresence* presence = [XMPPPresence presence];
//发送
[_stream sendElement:presence];
}
//下线
- (void)goOffline{
//
XMPPPresence* presence = [XMPPPresence presenceWithType:@"unavailable"];
[_stream sendElement:presence];
[_stream disconnect];
}
//注册
- (void)reg:(id)sender{
//如果现在已经连接,先断开
if (_stream.isConnected) {
[self goOffline];
}
//设置jid
[_stream setMyJID:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _nameField.text, HOST]]];
//设置tag
_stream.tag = @"注册";
//连接服务器
[_stream connectWithTimeout:30 error:nil];
}
//登陆
- (void)login:(id)sender{
//如果连接,断开
if (_stream.isConnected) {
[self goOffline];
}
//设置登陆jid
[_stream setMyJID:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _nameField.text, HOST]]];
//tag值
_stream.tag = @"登陆";
[_stream connectWithTimeout:30 error:nil];
}
//添加好友
- (void)addFriend:(id)sender{
[_roster subscribePresenceToUser:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _friendField.text, HOST]]];
}
//得到好友列表
- (void)getFriendList:(id)sender{
XMPPIQ* iq = [XMPPIQ iqWithType:@"get"];
[iq addAttributeWithName:@"id" stringValue:@"roster"];
NSXMLElement* query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
[iq addChild:query];
[_stream sendElement:iq];
}
//发送消息
- (void)sendMessage:(id)sender{
XMPPMessage* msg = [XMPPMessage messageWithType:@"chat" to:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _friendField.text, HOST]]];
NSXMLElement* body = [NSXMLElement elementWithName:@"body" stringValue:_textField.text];
[msg addChild:body];
[_stream sendElement:msg];
}
//连接到服务器
- (void)xmppStreamDidConnect:(XMPPStream *)sender{
//注册
if ([sender.tag isEqualToString:@"注册"]) {
[_stream registerWithPassword:_passwordField.text error:nil];
}
//登陆
if ([sender.tag isEqualToString:@"登陆"]) {
[_stream authenticateWithPassword:_passwordField.text error:nil];
}
}
//注册成功
- (void)xmppStreamDidRegister:(XMPPStream *)sender{
NSLog(@"注册成功");
}
//注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{
NSLog(@"注册失败");
}
//登陆成功
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
NSLog(@"登陆成功");
//上线
[self goOnline];
}
//登录失败
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
NSLog(@"登陆失败");
}
//接收到好友请求
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{
//同意添加好友,是否也要添加对方为好友
[_roster acceptPresenceSubscriptionRequestFrom:presence.from andAddToRoster:NO];
}
//得到好友列表
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{
for (NSXMLElement* item in iq.childElement.children) {
NSString* jid = [item attributeStringValueForName:@"jid"];
NSLog(@"%@", jid);
}
return YES;
}
//接收到消息
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
NSLog(@"%@", message.XMLString);
}
@end