ios xmpp研究探索:获取好友列表

简介:
/*
 一个 IQ 请求:
 <iq type="get"
   from="xiaoming@example.com"
   to="example.com"
   id="1234567">
   <query xmlns="jabber:iq:roster"/>
 <iq />
 
 type 属性,说明了该 iq 的类型为 get,与 HTTP 类似,向服务器端请求信息
 from 属性,消息来源,这里是你的 JID
 to 属性,消息目标,这里是服务器域名
 id 属性,标记该请求 ID,当服务器处理完毕请求 get 类型的 iq 后,响应的 result 类型 iq 的 ID 与 请求 iq 的 ID 相同
 <query xmlns="jabber:iq:roster"/> 子标签,说明了客户端需要查询 roster
 */
- (void)fetchBuddyListWithCompletion:(HYBFetchResultBlock)completion {
  self.buddyListBlock = completion;
  
  // 通过coredata获取好友列表
  NSManagedObjectContext *context = [self rosterContext];
  NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject"
                                            inManagedObjectContext:context];
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:entity];
  
 __block NSError *error = nil;
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSArray *results =[context executeFetchRequest:request error:&error];
    
    dispatch_async(dispatch_get_main_queue(), ^{
      if (completion) {
        completion(results, [error description]);
      }
    });
  });
  // 下面的方法是从服务器中查询获取好友列表
//  // 创建iq节点
//  NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];
//  [iq addAttributeWithName:@"type" stringValue:@"get"];
//  [iq addAttributeWithName:@"from" stringValue:[NSString stringWithFormat:@"%@@%@", _jid, kServer]];
//  [iq addAttributeWithName:@"to" stringValue:kServer];
//  [iq addAttributeWithName:@"id" stringValue:kFetchBuddyListQueryID];
//  // 添加查询类型
//  NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
//  [iq addChild:query];
//  
//  // 发送查询
//  [_xmppStream sendElement:iq];
}



另外,在对方同意添加为好友时,也更新好友列表:

/**
 * Sent when the roster receives a roster item.
 *
 * Example:
 *
 * <item jid='romeo@example.net' name='Romeo' subscription='both'>
 *   <group>Friends</group>
 * </item>
 **/
// 已经互为好友以后,会回调此
- (void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(NSXMLElement *)item {
  NSString *subscription = [item attributeStringValueForName:@"subscription"];
  if ([subscription isEqualToString:@"both"]) {
    NSLog(@"双方已经互为好友");
    if (self.buddyListBlock) {
      // 更新好友列表
      [self fetchBuddyListWithCompletion:self.buddyListBlock];
    }
  }
}


目录
相关文章
|
JSON 小程序 Android开发
小程序列表左滑效果在IOS呈上下滑动影响样式
小程序列表左滑效果在IOS呈上下滑动影响样式
126 0
|
7月前
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
77 2
|
iOS开发
iOS UIKit Dynamics Demo 学习地址列表
iOS UIKit Dynamics Demo 学习地址列表
52 0
|
iOS开发
iOS开发-聊天气泡的绘制和聊天消息列表
iOS开发-聊天气泡的绘制和聊天消息列表
252 0
iOS开发-聊天气泡的绘制和聊天消息列表
|
iOS开发
iOS多线程的初步研究-- dispatch同步
GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。
184 0
|
安全 iOS开发 开发者
ios应用列表调整后排名规则
ios应用列表调整后排名规则
|
程序员 iOS开发
iOS 列表 UITableView 提速指南
从08年到现在开发过的iOS应用不计其数了,但是面试很多人的时候,发现依然很多同学在最基本的列表控件上懂得不够深,下面就结合各方面的资料进行再一次讲解。 我们都知道纯代码是效率最高的,但是在开发成本上已经越来越不如使用Storyboard性价比高,速度快,所以本文试图结合UIStoryboard来描述一整套方案。
195 0
iOS 列表 UITableView 提速指南
|
缓存 算法 iOS开发
iOS性能优化系列篇之“列表流畅度优化”
原文作者:Hello_Vincent原文地址:https://juejin.im/post/5b72aaf46fb9a009764bbb6a#heading-1 这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关于列表流畅度的优化。
1457 0
|
iOS开发
iOS开发之让列表滚回最顶端最佳实践
原来项目中一直用这个方法滚动回到首页: NSIndexPath *bottomIndexPath=[NSIndexPath indexPathForItem:0 inSection:0]; [self.
931 0
|
存储 XML 数据库
iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一、ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二、应用沙盒 每个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。
898 0