您的位置:首页 > 移动开发 > IOS开发

19-XMPP

2015-07-13 18:01 369 查看
/*
继承XMPP的注意点:
(1)XMPP中使用了KissXml  依赖libXml2.2.dylib -> 在Build Settings里找到 header search path 添加   /usr/include/libxml2
(2)XMPP依赖的另一个框架:libresolv9.dylib
(3)新建个.pch文件 导入UIKit和Foundation框架
*/

@interface ViewController ()<XMPPStreamDelegate>
@property (weak, nonatomic) IBOutlet UITextField *userName;
@property (weak, nonatomic) IBOutlet UITextField *passWord;

@property (nonatomic, strong) XMPPStream *stream;
@property (nonatomic, assign) BOOL isLogin;
@property (nonatomic, strong) XMPPRoster *roster;

- (IBAction)reg:(id)sender;
- (IBAction)login:(id)sender;
- (IBAction)getFriendsAction:(id)sender;
- (IBAction)logOutAction:(id)sender;
- (IBAction)addFriends:(id)sender;

@end

@implementation ViewController

/*
继承XMPP的注意点:
(1)XMPP中使用了KissXml  依赖libXml2.2.dylib -> 在Build Settings里找到 header search path 添加   /usr/include/libxml2
(2)XMPP依赖的另一个框架:libresolv9.dylib
(3)新建个.pch文件 导入UIKit和Foundation框架
*/

- (void)viewDidLoad {
[super viewDidLoad];

[self setupXMPP];

}

//----------------------------------------------------------------配置XMPP------------------------------------------------------------------
#pragma mark - 配置XMPP

//配置XMPP信息
- (void)setupXMPP
{
//    1.创建数据流对象
XMPPStream *stream = [[XMPPStream alloc] init];
self.stream = stream;
//    设置代理
[stream addDelegate:self delegateQueue:dispatch_get_main_queue()];

//    2.创建重新连接对象,离线时会自动登录
XMPPReconnect *reconnect = [[XMPPReconnect alloc] init];
[reconnect activate:stream];

//    3.创建花名册存储对象
XMPPRosterCoreDataStorage *storage = [[XMPPRosterCoreDataStorage alloc] init];
//    创建花名册
XMPPRoster *roster = [[XMPPRoster alloc] initWithRosterStorage:storage dispatchQueue:dispatch_get_main_queue()];
[roster activate:stream];
self.roster = roster;

//    4.设置服务器
//    设置主机名
NSString *hostName = @"192.168.10.254";
[stream setHostName:hostName];
//    设置端口
[stream setHostPort:5222];
}

//-------------------------------------------------------注册---------------------------------------------------------------------------
#pragma mark - 注册

//注册
- (IBAction)reg:(id)sender {

self.isLogin = NO;
//    匿名ID
XMPPJID *jid = [XMPPJID jidWithString:@"anonymous@wxhl"];
//    设置连接ID
[self.stream setMyJID:jid];

BOOL isYes = [self.stream connectWithTimeout:-1 error:nil];

if (isYes) {
NSLog(@"服务器连接成功");
}else{
NSLog(@"服务器连接失败");
}

}

//-----------------------------------------------------------登陆-----------------------------------------------------------------------
#pragma mark - 登陆

//登陆
- (IBAction)login:(id)sender {

self.isLogin = YES;
//    jid:给服务器发送用户名的对象
NSString *name = [NSString stringWithFormat:@"%@@wxhl", self.userName.text];
XMPPJID *jid = [XMPPJID jidWithString:name];
[self.stream setMyJID:jid];

//连接服务器
BOOL success = [self.stream connectWithTimeout:-1 error:nil];
if (success) {
NSLog(@"和服务连接成功");
}else {
NSLog(@"和服务连接失败");
}

}

//------------------------------------------------------------注销----------------------------------------------------------------------
#pragma mark - 注销

//注销
- (IBAction)logOutAction:(id)sender {

//设置状态对象
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];

//发送下线消息
[self.stream sendElement:presence];

NSLog(@"注销成功");

}

//----------------------------------------------------------添加好友------------------------------------------------------------------------
#pragma mark - 添加好友

//添加好友
- (IBAction)addFriends:(id)sender
{
[self xmppAddFriendSubscribeUser:@"gaojq2"];
}

//自定义的加好友方法
- (void)xmppAddFriendSubscribeUser:(NSString *)name
{

//创建用户jid
XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@wxhl",name]];

//添加好友 调用花名册的方法
[self.roster subscribePresenceToUser:jid];

}

//----------------------------------------------------------删除好友------------------------------------------------------------------------
#pragma mark - 删除好友

//删除好友
- (IBAction)removeFriends:(id)sender
{
[self xmppUnsubscribeUser:@"gaojq2"];
}

//删除好友方法
- (void)xmppUnsubscribeUser:(NSString *)name
{

XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@wxhl",name]];

[self.roster removeUser:jid];

}

//-----------------------------------------------------------获取好友列表-----------------------------------------------------------------------
#pragma mark - 获取好友列表

/*
<iq type="get"
from="xiaoming@example.com"  //JID
to="example.com"
id="1234567">
  <query xmlns="jabber:iq:roster"/>
<iq />
*/
//获取好友列表
- (IBAction)getFriendsAction:(id)sender {

//用户JID
XMPPJID *jid = self.stream.myJID;

//创建xml
DDXMLElement *iq = [DDXMLElement elementWithName:@"iq"];

//设置iq的属性
[iq addAttributeWithName:@"type" stringValue:@"get"];
[iq addAttributeWithName:@"from" stringValue:jid.description];
//设置服务器的域名
[iq addAttributeWithName:@"to" stringValue:jid.domain];
[iq addAttributeWithName:@"id" stringValue:@"123456"];

//创建iq的子标签
DDXMLElement *query = [DDXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
[iq addChild:query];

[self.stream sendElement:iq];
}

//-----------------------------------------------------------发送消息-----------------------------------------------------------------------
#pragma mark - 发送消息

- (IBAction)sendMessage:(id)sender
{
[self sendMessage:@"你收到了没有啊。。。" toUser:@"gaojq2"];
}

- (void)sendMessage:(NSString *) message toUser:(NSString *) user {

NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
[body setStringValue:message];

NSXMLElement *message1 = [NSXMLElement elementWithName:@"message"];
[message1 addAttributeWithName:@"type" stringValue:@"chat"];

NSString *to = [NSString stringWithFormat:@"%@@wxhl", user];
[message1 addAttributeWithName:@"to" stringValue:to];
[message1 addChild:body];
[self.stream sendElement:message1];
}

//---------------------------------------------------------XMPPStreamDelegate------------------------------------------------------------------
#pragma mark - 和服务器连接成功后调用

//和服务器连接成功后调用 注册和登陆都会调用
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
if (self.isLogin) {

//登陆
BOOL success = [self.stream authenticateWithPassword:self.passWord.text error:nil];

if (!success) {

NSLog(@"登陆失败");
}

}else{

//    jid:给服务器发送用户名的对象
NSString *name = [NSString stringWithFormat:@"%@@wxhl", self.userName.text];
XMPPJID *jid = [XMPPJID jidWithString:name];

[self.stream setMyJID:jid];

//    向服务器发送注册请求
BOOL isYes = [self.stream registerWithPassword:self.passWord.text error:nil];

if (isYes) {
NSLog(@"向服务器发送信息成功");
}else{
NSLog(@"向服务器发送信息失败");
}
}
}

//-----------------------------------------------------------注册成功或失败调用-------------------------------------------------------------------
#pragma mark - 注册成功或失败调用

//注册成功调用
- (void)xmppStreamDidRegister:(XMPPStream *)sender {

NSLog(@"注册成功");
[self.stream disconnect];
}

//注册失败调用
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error {
NSLog(@"注册失败");

}

//-----------------------------------------------------------登陆成功或失败调用-------------------------------------------------------------------

#pragma mark - 登陆成功后调用的代理方法
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {

XMPPPresence *presence = [[XMPPPresence alloc] init];
//发送登陆上线的消息
[self.stream sendElement:presence];

NSLog(@"登陆成功");

//发送下线消息
//    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
//    //发送登陆上线的消息
//    [_xmppStream sendElement:presence];
//
//    NSLog(@"presence:%@",presence.XMLString);
}

//登陆失败调用的代理方法
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error {

NSLog(@"密码错误");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IOS开发 XMPP