19-XMPP

/*
 继承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(@"密码错误");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值