ios xmpp研究探索:删除好友

XMPP中删除好友,就是发送一个presence,其类型为:unsubscribe

- (void)removeBuddyWithJid:(NSString *)jidString completion:(HYBCompletionBlock)completion {
  if (![jidString hasSuffix:kServer]) {
    jidString = [NSString stringWithFormat:@"%@@%@", jidString, kServer];
  }
  
  self.completionBlock = completion;
  
  // 设置服务器
  [_xmppStream setHostName:kServer];

  // 发送移除好友请求
  [_xmppRoster removeUser:[XMPPJID jidWithString:jidString]];
  // 如果用下面的方法来移除,则需要在移除后,手动调用从数据库中移除,否则会有问题
 // [_xmppRoster unsubscribePresenceFromUser:[XMPPJID jidWithString:jidString]];
}

发出删除好友请求后,会先IQ查询:

/*
 一个 IQ 响应:
 <iq type="result"
   id="1234567"
   to="xiaoming@example.com">
   <query xmlns="jabber:iq:roster">
     <item jid="xiaoyan@example.com" name="小燕" />
     <item jid="xiaoqiang@example.com" name="小强"/>
   <query />
 <iq />
 type 属性,说明了该 iq 的类型为 result,查询的结果
 <query xmlns="jabber:iq:roster"/> 标签的子标签 <item />,为查询的子项,即为 roster
 item 标签的属性,包含好友的 JID,和其它可选的属性,例如昵称等。
 */
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq {
  NSLog(@"xmpp stream 接收到查询消息:%@", [iq XMLString]);
  
  // 获取好友列表结果
  if ([iq.type isEqualToString:@"result"]) {
    NSXMLElement *query = [iq elementForName:@"query"];
    // 如果是注册,from和to都不为空,如果是删除,且待删除的用户在服务器中并没有,那么就没有from和to
    if ([iq attributeStringValueForName:@"from"] && [iq attributeStringValueForName:@"to"]) {
      return YES;
    }
    
    if (query == nil) { // 用户不存在,直接从数据库删除即可
      if (self.completionBlock && !_isLogining && !_isRegistering) {
        self.completionBlock(YES, nil);
      }
      return YES;
    }
    // 这种方式是通过手动发送IQ来查询好友列表的,不过这样操作不如使用XMPP自带的coredata操作方便
//    NSString *thdID = [NSString stringWithFormat:@"%@", [iq attributeStringValueForName:@"id"] ];
//    if ([thdID isEqualToString:kFetchBuddyListQueryID]) {
//      NSXMLElement *query = [iq elementForName:@"query"];
//      
//      NSMutableArray *result = [[NSMutableArray alloc] init];
//      for (NSXMLElement *item in query.children) {
//        NSString *jid = [item attributeStringValueForName:@"jid"];
//        NSString *name = [item attributeStringValueForName:@"name"];
//        
//        HYBBuddyModel *model = [[HYBBuddyModel alloc] init];
//        model.jid = jid;
//        model.name = name;
//        
//        [result addObject:model];
//      }
//      
//      if (self.buddyListBlock) {
//        self.buddyListBlock(result, nil);
//      }
//      
//      return YES;
//    }
  }
  // 删除好友需要先查询,所以会进入到此代理回调函数中,如果type=@"set",
  // 说明是更新操作,即删除好友或者添加好友查询
  else if ([iq.type isEqualToString:@"set"] && !_isRegistering && !_isLogining) {
    NSXMLElement *query = [iq elementForName:@"query"];
    for (NSXMLElement *item in query.children) {
      NSString *ask = [item attributeStringValueForName:@"ask"];
      NSString *subscription = [item attributeStringValueForName:@"subscription"];
      if ([ask isEqualToString:@"unsubscribe"] && ![subscription isEqualToString:@"none"]) { // 删除好友成功
        if (self.completionBlock) {
          self.completionBlock(YES, nil);
        }
        return YES;
      }
      // 请求添加好友,但是查询没有结果,表示用户不存在
      // none表示未确认
      else if ([ask isEqualToString:@"subscribe"] && [subscription isEqualToString:@"none"]) {
        if (self.completionBlock) {
          self.completionBlock(YES, @"发送添加好友请求成功");
        }
        return YES;
      } else if (![subscription isEqualToString:@"none"]) { // 添加好友请求,查询成功
        return YES;
      }
    }
  }
  
  return NO;
}

删除好友成功后:

// 添加好友同意后,会进入到此代理
- (void)xmppRoster:(XMPPRoster *)sender didReceiveRosterPush:(XMPPIQ *)iq {
  NSLog(@"添加成功!!!didReceiveRosterPush -> :%@",iq.description);
  
  DDXMLElement *query = [iq elementsForName:@"query"][0];
  DDXMLElement *item = [query elementsForName:@"item"][0];
  
  NSString *subscription = [[item attributeForName:@"subscription"] stringValue];
  // 对方请求添加我为好友且我已同意
  if ([subscription isEqualToString:@"from"]) {// 对方关注我
    NSLog(@"我已同意对方添加我为好友的请求");
  }
  // 我成功添加对方为好友
  else if ([subscription isEqualToString:@"to"]) {// 我关注对方
    NSLog(@"我成功添加对方为好友,即对方已经同意我添加好友的请求");
  } else if ([subscription isEqualToString:@"remove"]) {
    // 删除好友
    if (self.completionBlock) {
      self.completionBlock(YES, nil);
    }
  }
}


当然也可以在这里处理:

- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence {
  NSLog(@"接收到好友申请消息:%@", [presence fromStr]);
  // 好友在线状态
  NSString *type = [presence type];
  // 发送请求者
  NSString *fromUser = [[presence from] user];
  // 接收者id
  NSString *user = _xmppStream.myJID.user;
  
  NSLog(@"接收到好友请求状态:%@   发送者:%@  接收者:%@", type, fromUser, user);
  
  // 防止自己添加自己为好友
  if (![fromUser isEqualToString:user]) {
    if ([type isEqualToString:@"subscribe"]) { // 添加好友
      // 接受添加好友请求,发送type=@"subscribed"表示已经同意添加好友请求并添加到好友花名册中
      [_xmppRoster acceptPresenceSubscriptionRequestFrom:[XMPPJID jidWithString:fromUser]
                                          andAddToRoster:YES];
      NSLog(@"已经添加对方为好友,这里就没有弹出让用户选择是否同意,自动同意了");
    } else if ([type isEqualToString:@"unsubscribe"]) { // 请求删除好友
      
    }
  }
}

但是在这个方法中处理的话,还是会调用上一个方法,因此我觉得还是在前一个方法中处理更好些。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取好友列表和加入好友都是 XMPP 协议中常见的操作,可以使用 XMPP 客户端库来实现。 获取好友列表: 获取好友列表需要先建立与服务器的连接,然后向服务器发送获取好友列表的请求,服务器会返回当前用户的好友列表。 在使用 XMPP 客户端库时,可以通过调用 `getRoster()` 方法来获取好友列表: ```java Roster roster = connection.getRoster(); Collection<RosterEntry> entries = roster.getEntries(); for (RosterEntry entry : entries) { System.out.println(entry.getName() + " (" + entry.getUser() + ")"); } ``` 这段代码会输出当前用户的好友列表,每个好友的名称和 JID。 加入好友: 加入好友需要知道好友的 JID,然后向服务器发送加入好友的请求,服务器会向好友发送一个订阅请求,好友同意后就成为了当前用户的好友。 在使用 XMPP 客户端库时,可以通过调用 `sendPacket()` 方法来发送加入好友的请求: ```java Presence subscribe = new Presence(Presence.Type.subscribe); subscribe.setTo(buddyJID); connection.sendPacket(subscribe); ``` 这段代码会向好友发送一个订阅请求,其中 `buddyJID` 是好友的 JID。 好友同意后,当前用户会收到一个订阅通知,可以通过监听 `RosterListener` 的 `entriesAdded()` 方法来处理: ```java roster.addRosterListener(new RosterListener() { public void entriesAdded(Collection<String> addresses) { for (String address : addresses) { System.out.println("New buddy added: " + address); } } // ... }); ``` 这段代码会在当前用户的好友列表中添加新的好友,并输出好友的 JID。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值