XMPP使用浅谈;iOS开发。

半年前帮朋友公司写了一款App,实现通讯功能时非要用XMPP。于是开始研究,当时没有及时总结,近期公司稍微空闲,于是抽出时间来聊聊这个框架。

首先我们去gitHub下载相关的资源。

//xmpp底层是socket,是一种长链接形式,如果不主动断开,是不会断开的。


接下来就开始使用了:主要用到的一些东西:XMPPStream、XMPPRoster、XMPPMessageArchiving、XMPPJID、XMPPPresence。


使用之初我先创建了一个工具类来处理xmpp相关的操作。
1.创建通道XMPPStream并打开配置服务地址(hostName)和服务器端口(hostPort)设置代理。
2.创建花名册XMPPRoster  我们通过花名册来获取好友列表,新增好友等等;记得激活通道哦。
3.创建信息归档处理的对象XMPPMessageArchiving用它来处理信息。


其中我们也用到了xmpp的代理方法
#pragma mark XMPPStreamDelegate
- (void)xmppStreamWillConnect:(XMPPStream *)sender {
      NSLog(@"通道将要链接");
}

- (void)xmppStreamDidConnect:(XMPPStream *)sender {
      NSLog(@"通道已经链接");
}
#pragma mark - 注册成功的回调方法
- (void)xmppStreamDidRegister:(XMPPStream *)sender {
     
      NSLog(@"注册成功");
     
}

#pragma mark - 注册失败的回调方法
- (void)xmppStream:(XMPPStream *)senderdidNotRegister:(DDXMLElement *)error {
     
      NSLog(@"注册失败");
     
}





//登录失败
- (void)xmppStream:(XMPPStream *)senderdidNotAuthenticate:(DDXMLElement *)error {
     
      NSLog(@"登录失败");
     
}

- (void)xmppStream:(XMPPStream *)sendersocketDidConnect:(GCDAsyncSocket *)socket {
     
      //xmpp底层是socket,是一种长链接形式,如果不主动断开,是不会断开的
     
     
      NSLog(@"socket");
}

登录注册时创建XMPPJID来模型化用户    参数1.用户名2.域名3.标识
XMPPJID *loginJid = [XMPPJID jidWithUser:userName domain:kDomin resource:kResource ];
    self.xmppStream.myJID = loginJid;



//取消数据发送
- (void)connectToServer {
      if([self.xmppStream isConnected] || [self.xmppStream isConnecting]){
              //取消上线状态
              XMPPPresence *presence = [XMPPPresencepresenceWithType:@"unavailable"];
              //告诉通道下线
              [self.xmppStream sendElement:presence];
              //取消链接
              [self.xmppStream disconnect];
             
      }
      NSError*error = nil;
      [self.xmppStream connectWithTimeout:-1 error:&error];
}

添加好友:
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence {
    ///去的好友状态
//    NSString *presenceType = [NSString stringWithFormat:@"%@",[presence type]];///online, offline
    ///请求的用户
    NSString *presenceFromUser = [NSString stringWithFormat:@"%@",[[presence from] user]];
    XMPPJID *jid = [XMPPJID jidWithString:presenceFromUser];
    //接收添加好友请求
    [_xmppRoster acceptPresenceSubscriptionRequestFrom:jid andAddToRoster:YES];
    
}
-(void)goOnline{
    
    //发送在线状态
    XMPPPresence *presence = [XMPPPresence presence];
    [[self xmppStream] sendElement:presence];
    
}
-(void)goOffline{
    
    //发送下线状态
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
    [[self xmppStream] sendElement:presence];
    
}
//链接服务器
-(BOOL)connect{

    //从本地取得用户名,密码和服务器地址
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    NSString *userId = [defaults stringForKey:self.model.telephone];

    NSString *pass = [defaults stringForKey:self.model.picUrl];
    NSString *server = [defaults stringForKey:kHostName1];
    
    if (![_xmppStream isDisconnected]) {
        return YES;
    }
    
    if (userId == nil || pass == nil) {
        return NO;
    }
    
    //设置用户
    [_xmppStream setMyJID:[XMPPJID jidWithString:userId]];
    //设置服务器
    [_xmppStream setHostName:server];

    
    //连接服务器
    [self connectToServer];
    
    return YES;
    
}
-(void)disconnect{
    
    [self goOffline];
    [_xmppStream disconnect];
    
}

//下面是聊天时发送消息
NSString *siID = [XMPPStream generateUUID];
    
    XMPPMessage *xmppMessage = [XMPPMessage messageWithType:@"chat" to:self.jid elementID:siID];
    NSXMLElement *receipt = [NSXMLElement elementWithName:@"requst" xmlns:@"urn:xmpp:receipts"];
    [xmppMessage addChild:receipt];
    [xmppMessage addBody:textField.text];
    [[ManagerData shareManagerData].xmppStream sendElement:xmppMessage];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值