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 />,为查询的子项,即为 rosteritem 标签的属性,包含好友的 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和toif ([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];// 接收者idNSString *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"]) { // 请求删除好友}}
}

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

ios xmpp研究探索:删除好友相关推荐

  1. iOS —— XMPP 详解

    iOS - XMPP 的使用 转载 https://www.cnblogs.com/QianChia/p/6411914.html 1.XMPP XMPP 是一个基于 Socket 通信的即时通讯的协 ...

  2. ios xmpp 发送语音图片解决方案

    http://www.cnblogs.com/yulang314/p/3705611.html ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项 ...

  3. Scrapy研究探索(六)——自动爬取网页之II(CrawlSpider)

    原创,转载注明: http://blog.csdn.net/u012150179/article/details/34913315 基于上面的博客修改而得 一 目的 在教程(二)中使用基于Spider ...

  4. iOS GPUImage研究总结

    小专栏:GPUImage的源码解读,带你打造一个实用框架 Part one: 关于GPUImage 这里直接引用官方描述: The GPUImage framework is a BSD-licens ...

  5. 【腾讯金融学院香港分院成立,将推动区块链等领域的研究探索】GBCAX

    gbcax链交所 [腾讯金融学院香港分院成立,将推动区块链等领域的研究探索] 腾讯在"粤港澳大湾区金融科技论坛"上宣布,正式成立腾讯金融学院与腾讯粤港澳大湾区金融科技创新实验室.依 ...

  6. iOS XMPP Framework 中文概述

    本篇文章翻译XMPP Framework中的Overview of the XMPP Framework部分 介绍 The framework is divided into 2 parts: 1. ...

  7. iOS Healthkit 使用探索分析

    一 基本认知层面: HealthKit框架提供了一个结构,应用可以使用它来分享健康和健身数据.HealthKit管理从不同来源获得的数据,并根据用户的偏好设置,自动将不同来源的所有数据合并起来.应用还 ...

  8. iOS GPUImage研究序一:内置滤镜

    本片介绍关于GPUImage的125个内置过滤器:xoxo_x 著 本文参考:https://github.com/BradLarson/GPUImage#gpuimage 颜色调整 GPUImage ...

  9. 中国银联基于软件定义网络的下一代金融云研究探索

    一. 研究背景情况 (一) 问题和挑战 银联基于 OpenStack开源技术的金融云平台已运行 5年,目前已达数千台级物理服务器规模,银联互联网.移动支付等关键业务,特别是提供多样化支付服务的全渠道系 ...

最新文章

  1. codeforces432D[kmp的next数组的运用]
  2. win7安装omnetpp-4.6
  3. Python的数据库mongoDB的入门操作
  4. 全球地区资料json 含中英文 经纬度_[喵咪软件推荐(1)]全球国家信息库
  5. 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
  6. 杂牌手柄模拟xboxone手柄_震了,Xbox One 精英手柄2代摸了一次就不舍得放下了
  7. nand flash和nor flash的这几点区别你知道吗?
  8. 2014届去哪儿校园招聘笔试题
  9. linux dns服务无效,Linux下搭建DNS服务器及踩坑
  10. windows 快捷方式(.lnk)代码执行漏洞(CVE-2017-8464 )[附EXP生成工具]
  11. KITTI数据集详解
  12. 怎么用php跨域请求
  13. WPF系列教程(十九):日期控件——Calendar、DatePicker日历控件
  14. 破解tomcat管理员密码
  15. npm publish常见问题
  16. 背景扣除matlab_基于背景减法的目标检测在Matlab中的实现方法
  17. halcon裁剪图像_【Halcon】Halcon学习之七:改变图像的现实方式和大小
  18. 51单片机与STM32的区别(为何51单片机IO引脚的驱动能力弱)
  19. PDF压缩文件怎么压缩?两分钟让你学会三种方法
  20. Git概念:什么是分支

热门文章

  1. 希尔排序、快速排序、归并排序的实现分析以及时间复杂度
  2. 内存占用少的linux桌面,不同桌面环境占用内存/CPU对比
  3. 小偷和抢劫是被怎么遏制的?
  4. LCD1602显示字母和数字--51
  5. WebDay05 JQuery框架
  6. html点击弹出文本框,html制作,点击文字超链接显示文本框,再点击文字超链接隐藏文本框...
  7. JQuery-Snowfall降雪插件使用
  8. 自己写一个控制台人脸识别程序
  9. 虾皮电商平台怎么样?新手能挣到钱吗?
  10. 怎么用计算机算数表白,数说精选 | 如何用数学表白