/*
继承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(@"密码错误");
}
19-XMPP
最新推荐文章于 2023-11-28 23:50:04 发布