博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS XMPP研究探索:添加好友
阅读量:5844 次
发布时间:2019-06-18

本文共 3726 字,大约阅读时间需要 12 分钟。

公开一个API,提供添加好友功能:

- (void)addBuddyWithJid:(NSString *)jidString completion:(HYBCompletionBlock)completion {  if (![jidString hasSuffix:kServer]) {    jidString = [NSString stringWithFormat:@"%@@%@", jidString, kServer];  }    // 先判断是否已经是我的好友,如果是,就不再添加  if ([_xmppRosterStorage userForJID:[XMPPJID jidWithString:jidString]                          xmppStream:_xmppStream                managedObjectContext:[self rosterContext]]) {    if (completion) {      completion(NO, [NSString stringWithFormat:@"%@已经是您的好友!", jidString]);    }    return;  }    self.completionBlock = completion;    // 设置服务器  [_xmppStream setHostName:kServer];  // 发送添加好友请求  /*   presence.type有以下几种状态:      available: 表示处于在线状态(通知好友在线)   unavailable: 表示处于离线状态(通知好友下线)   subscribe: 表示发出添加好友的申请(添加好友请求)   unsubscribe: 表示发出删除好友的申请(删除好友请求)   unsubscribed: 表示拒绝添加对方为好友(拒绝添加对方为好友)   error: 表示presence信息报中包含了一个错误消息。(出错)   */  [_xmppRoster subscribePresenceToUser:[XMPPJID jidWithString:jidString]];}
注意:这里添加了是否已经是好友的判断,

[_xmppRosterStorage userForJID:[XMPPJID jidWithString:jidString]                          xmppStream:_xmppStream                managedObjectContext:[self rosterContext]])
这个方法是判断用户jid是否已经存在,如果存在,表示已经是我的好友了,如果为nil,表示不存在我的好友列表中,

则可以发送好友添加请求。

节点presence的类型type可以有多种值:

available: 表示处于在线状态(通知好友在线)   unavailable: 表示处于离线状态(通知好友下线)   subscribe: 表示发出添加好友的申请(添加好友请求)   unsubscribe: 表示发出删除好友的申请(删除好友请求)   unsubscribed: 表示拒绝添加对方为好友(拒绝添加对方为好友)   error: 表示presence信息报中包含了一个错误消息。(出错)
发送后, 会在代理函数中调用:

// 加好友回调函数/* presence.type有以下几种状态:  available: 表示处于在线状态(通知好友在线) unavailable: 表示处于离线状态(通知好友下线) subscribe: 表示发出添加好友的申请(添加好友请求) unsubscribe: 表示发出删除好友的申请(删除好友请求) unsubscribed: 表示拒绝添加对方为好友(拒绝添加对方为好友) error: 表示presence信息报中包含了一个错误消息。(出错) */- (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"]) { // 请求删除好友          }  }}// 添加好友同意后,会进入到此代理- (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);    }  }}/** * Sent when the roster receives a roster item. * * Example: * * 
*
Friends
*
**/// 已经互为好友以后,会回调此- (void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(NSXMLElement *)item { NSString *subscription = [item attributeStringValueForName:@"subscription"]; if ([subscription isEqualToString:@"both"]) { NSLog(@"双方已经互为好友"); if (self.buddyListBlock) { // 更新好友列表 [self fetchBuddyListWithCompletion:self.buddyListBlock]; } }}

转载地址:http://wshcx.baihongyu.com/

你可能感兴趣的文章
使用Filter跟踪Asp.net MVC页面加载时间
查看>>
python学习(五)列表
查看>>
使用GHOST对Windows操作系统进行备份和还原
查看>>
KMeans (K均值)算法讲解及实现
查看>>
23种设计模式之装饰者模式
查看>>
为什么不应该使用Zookeeper做服务发现?(转载)
查看>>
Vue源码探究-类初始化函数详情
查看>>
Docker 数据管理
查看>>
什么是最适合云数据库的架构设计?
查看>>
【前端工程师手册】30分钟看懂函数防抖和节流
查看>>
JavaScript-面试
查看>>
Java 内部类(10)
查看>>
Python模块
查看>>
系统优化怎么做-开篇
查看>>
js原型链
查看>>
《CSS世界》笔记三:内联元素与对齐
查看>>
【开源】Tsar——灵活的系统和应用采集软件
查看>>
自己动手搭建webpack
查看>>
centos安装mysql
查看>>
我终于搞清楚了和String有关的那点事儿。
查看>>