也正是说A与B相互订阅

</br>

</br>

搞事前言


前一篇博客,大家对XMPPFramework的报到注册功效以及逻辑做了详尽的表达,用户登录成功之后,大家要求做的正是取获得当前账号的忘年之契列表和个人新闻,前几日这一篇博客正是对好友列表的连带逻辑以及代理方法来做一下教学表达.大家先看看SDChat中的好友列表示意图.

</br>

前言


上一篇博客中大家说到什么样通过XMPPFramework中的代理方法来博取到相知节点数据消息,可是大家发现节点音讯能显得的只有JID,所以前几天大家就说一下在XMPPFramework怎么着设置名片音讯以及怎样获取本人的和好友的片子音讯.

挂号时候的头像的安装

</br>

XMPPFramework中好友关系表明解释


在XMPPFramework中吗,好友关系是足以经过订阅来落实的,也正是说A与B相互订阅,那么A与B就是忘年交了,假如A只是订阅了B,B没有订阅A,那么大家就说A与B两者不是忘年交,当然了,我在其实过程中搞好友添加的逻辑依旧相比多的,那里必要掌握A与B相互订阅(openfire服务器中订阅状态为both,当然了,订阅状态也有from和to,那样的也算是好友.具体情形前面会详细表明),那么A与B就是好友那三个逻辑即可.

</br>

XMPP中的电子名片简介(来自互联网…)


在Extensions中有XEP-0054扩大,提供了一种能够经过XMPP发送电子著名影片的建制。

  • vCard,也叫Versitcard,vCard的常用文件扩展名是.vcf。在XMPPFramework中通过XMPPvCardTemp和XMPPvCardCoreDataStorage多个类来落到实处。
  • vCard是电子名片的文件格式标准,一般附加在电子邮件之后,但也能够用来别的场所,比如在因特网上互相沟通。

那里笔者要说一下在XMPPFramework香岛中华电力有限公司子名片的多少个相关的类.个中,XMPPv
卡德TempModule那一个类应用做电子名片的读取和储存,XMPPvCardCoreDataStorage用来做电子名片的本地存款和储蓄,XMPPvCardAvatarModule是用来做头像的囤积和读取的,XMPPv卡德Temp则是电子名片.

此间本人要说一下有关XMPPvCardTemp相关的性质,XMPPvCardTemp是电子名片类.用户的电子名片正是XMPPvCardTemp对象.那里作者就把多少个常用的性子列举出来.当然了,大家得以友善对中间一部分本性实行仓库储存修改,大家假若知道大家在哪贰特性能存款和储蓄了哪些数据即可,比如大家让nickname(标准化姓名)存款和储蓄一个地址字符串,然后取出来nickname的时候,大家知晓是nickname存款和储蓄的是怎么着即可.灵活运用XMPPvCardTemp的种种属性.

//头像图片属性
@property (nonatomic, strong) NSData *photo;
//标准化名称
@property (nonatomic, strong) NSString *nickname;
//地址数组
@property (nonatomic, strong) NSArray *addresses;
//公司名称
@property (nonatomic, strong) NSString *orgName;
//部门数组
@property (nonatomic, strong) NSArray *orgUnits;
//职位
@property (nonatomic, strong) NSString *title;
//邮件地址数组
@property (nonatomic, strong) NSArray *emailAddresses;
//备注
@property (nonatomic, strong) NSString *note;

</br>

好友列表获取流程.


当用户登录成功之后,大家做的最根本的四个模块正是加载好友列表模块.那么好友加载模块的完整流程是何等的吗?大家先看1个SDChat好友列表的流程图,帮忙大家耳熟能详好友列表在事实上进度中哪些彰显的.(图片或然看不清楚,请自行下载查看,感激.)

</br>

好友服务器数据获得代码部分

XMPPFramework中好友列表的管住主旨类是XMPPRoster,那么些类能够用来对忘年交的音讯获取,添加,删除等操作.在SDChat中,大家把XMPPRoster声明为SDXmppManager的八天性情对象,并且在起头化进程中激活好友模块.代码如下所示.(表达:XMPPRosterCoreDataStorage对象使用存款和储蓄好友数据的.)

self.rosterCoreDataStorage= [XMPPRosterCoreDataStorage sharedInstance];

self.roster = [[XMPPRoster alloc]initWithRosterStorage:self.rosterCoreDataStorage dispatchQueue:dispatch_get_global_queue(0, 0)];

//激活roster
[self.roster activate:self.stream];

其实好友获取是有二种办法的,骚栋使用的是代理方法得到好友节点的.由于代理方法默许的是在报到成功之后暗中认可就会调用获取好友节点,可是笔者做页面包车型大巴时候供给调剂一下密友节点获取的机遇,所以,作者就把XMPPRoster的电动获取好友节点成效关闭了.当然了,你能够运用自动获取.那一个要求基于实际景况而定,完结代码如下所示.

self.roster.autoFetchRoster = NO;

如此在大家登录成功之后,我们必要在- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender那些主意中手动调起获取好友的方法.调起方法也很简短,只须要一行代码就能够.

[[SDXmppManager defaulManager].roster fetchRoster];

当大家调起了拿到好友的法子之后,大家须要在在联系人列表(SDContactsVC)那几个控制器中先安装XMPPRoster目的的代理.作者是在伊始化就安装了代办对象.

[[SDXmppManager defaulManager].roster addDelegate:self delegateQueue:dispatch_get_main_queue()];

设置实现以往代理方法其实总共是有三个的,多少个代理调取的莫过于分别是具备好友节点获取开头,每二个密友节点获取到的时候,全部好友节点获取成功以后,我们能够依据实际景况来开始展览不一样的操作.比如我们在获取开头此前初步化好友节点数组,获取截至刷新页面等等,具体的八个代理方法如下所示.

//开始获取好友节点列表的时候
-(void)xmppRosterDidBeginPopulating:(XMPPRoster *)sender;

//获取每一个好友节点的时候
-(void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(DDXMLElement *)item;

//结束获取好友节点列表的时候
-(void)xmppRosterDidEndPopulating:(XMPPRoster *)sender;

这是自笔者只使用了后边的四个代理方法,那是有来头的,因为笔者的脱俗之交节点数组([SDUser defaulUser].contactsArray)不必要每二遍拿走都开始展览立异,而且那多个代理方法在其实使用进度中,自动调取的次数过多,比如添加完好友也许去除完好友都能自动调取这些八个代理方法,为了不须要的劳累,所以本身只是用了后头的三个代理方法.照旧那句话,大家能够依照自个儿的其真实情状况自行调用区别的代办方法.

大家先看一下SDChat中在-(void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(DDXMLElement *)item;骚栋都做了什么样的操作.首先,咱们获得到每三个好友节点item,然后大家先判断item节点的订阅消息subscription的值,我们供给的知心人是五头相互订阅,也正是”subscription”属性为”both”、”from”、”to”才是大家须要的好友节点.所以符合那三种情景的都是大家须要的好友节点,所以if的筛选标准就出去了,如下代码所示.其余订阅类型不相同的节点大家前面会说到具体的情况.

if ([[[item attributeForName:@"subscription"] stringValue] isEqualToString:@"both"]||[[[item attributeForName:@"subscription"] stringValue] isEqualToString:@"from"]||[[[item attributeForName:@"subscription"] stringValue] isEqualToString:@"to"]) {

}

在筛选达成未来,我们必要做的事体就是赢获得item节点的JID消息了,那里大家只须要两行代码就足以做到了.

NSString *SJid = [[item attributeForName:@"jid"] stringValue];

XMPPJID *jid = [XMPPJID jidWithString:SJid];

无论是早期界面上海展览中心示好友的JID消息,还是早先时期显示电子名片消息,大家都亟待先遍历好友节点数组([SDUser defaulUser].contactsArray)判断数组中是或不是早已存在该好友消息了.那样做的来头是因为-(void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(DDXMLElement *)item;其一代理方法恐怕对二个密友节点获取多次,即便大家不进行采纳性的增进的话,数组恐怕会产出好友重复的光景的,所以我们必要先判断是或不是留存该好友新闻,具体代码如下所示.(关于isDeleteFriend布尔值的存在的含义,当我们删除好友的时候,订阅新闻subscription的值或许并不是”remove”,有可能是”both”,全部我们那边必要加四个布尔值,前面包车型大巴去除好友,大家会详细表达的.)

BOOL isExist = NO;

for (SDContactModel *contact in self.user.contactsArray) {

       if ([contact.jid.user isEqualToString:jid.user]) {

            isExist = YES;

          }
}         

看清完是还是不是留存好友音信之后,大家就可以依照isExist这一个布尔值来判定了是还是不是要添加多少了,添加多少经过如下代码所示,那里本人是取得了忘年交的片子音讯实行的丰富,早先时期的话能够直接添加JID.

if (!isExist) {
    //添加数据
    XMPPvCardTemp *vCard =  [[SDXmppManager defaulManager].vCardTempModule vCardTempForJID:jid shouldFetch:YES];

    SDContactModel *contact =[[SDContactModel alloc]init];
    contact.jid = jid;
    contact.vCard =vCard;
    contact.isAvailable = NO;

    [self.user.contactsArray addObject:contact];

}

地点正是从服务器获取到相知数据的焦点流程了.

</br>

好友数据本地整理代码部分

当大家取得好友数据形成以往,大家并不是向来表现到页面上,大家供给对好友数据进行整理然后再突显到界面之上.我们经过-(void)xmppRosterDidEndPopulating:(XMPPRoster *)sender;那么些代理方法来调取大家的挚友数据整理方法-(void)networkingWithContactsArray;.

-(void)xmppRosterDidEndPopulating:(XMPPRoster *)sender{

    [self networkingWithContactsArray];

}

SDChat的好友界面是近似于微信的挚友界面包车型客车,是分组显示的.所以,数据存款和储蓄的完好思路是,列表的数据源是储存于二个字典个中,大家把首字母相同的JID也许是用户名存款和储蓄于一个数组个中.每种key是每1个JID的首字母大写(可能是用户名称的首字母大写).因为字典是无序的,那么哪些形成有序的排列呢?大家必要树立其余2个数组作为排序数组,同时也起着索引数组的成效.大家把字典中有着的Key放入数组中,然后排序,数据提取进程中大家只须要依照数组的排列顺序拿取即可.示意图如下所示.

那正是说大家看一下其实代码进程中,对于字典的多少拉长整理部分,首先我们要开始化字典对象,然后大家遍历好友节点数组([SDUser defaulUser].contactsArray),取出我们供给排序的每2个器重字符串(不管是JID如故用户名).我们调用-(NSString *)transform:(NSString *)chinese其一措施回去首字母并且大写.在这一个措施中我们有几种处境供给处理,一种是赢得字符串退步,也正是说传入的是1个nil值,大家直接重返”#”
,别的一种是要是首字母是数字,那么大家也是内需回到”#”的.所以那样回去首字母所使用到的点子总共就有了多个,五个用来判断是不是是数组,三个则是截取并且举办字母大写的操作.多个主意如下所示.

//截取首字母并且大写
-(NSString *)transform:(NSString *)chinese{

    if (chinese == nil ||[chinese isEqualToString:@""]) {

        return @"#";

    }

    NSMutableString *pinyin = [chinese mutableCopy];
    CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);
    CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);

    NSString *subString = [[pinyin uppercaseString] substringWithRange:NSMakeRange(0, 1)];

    if ([self isPureInt:subString] || [self isPureFloat:subString]) {

        return  @"#";
    }

    return subString;
}

//判断是否为整型:
- (BOOL)isPureInt:(NSString*)string{
    NSScanner* scan = [NSScanner scannerWithString:string];
    int val;
    return [scan scanInt:&val] && [scan isAtEnd];
}
//判断是否为浮点型:
- (BOOL)isPureFloat:(NSString*)string{
    NSScanner* scan = [NSScanner scannerWithString:string];
    float val;
    return[scan scanFloat:&val] && [scan isAtEnd];
}

那就是说通过重返首字母,大家须要判定一下当下的字典对象中是或不是早已存在了改分组的数组,即使存在,那么直接存款和储蓄,要是不设有,那么开端化2个数组之后,以首字母为Key,空数组为Value保存到字典中,然后再把数量存款和储蓄到数组中去.具体代码如下所示.

if (self.contactsPinyinDic[firstWord] ==nil) {

    //如果联系人字典数组中没有该分组,那么就初始化一个分组数组,然后存储.
    NSMutableArray *sectionArray =[NSMutableArray  arrayWithCapacity:16];

    [sectionArray addObject:contact];

    [self.contactsPinyinDic setValue:sectionArray forKey:firstWord];

}else{

    NSMutableArray *sectionArray =self.contactsPinyinDic[firstWord];

    [sectionArray addObject:contact];

}

累加完毕之后,大家就要求对索引数组进行操作了,首先大家照旧先开始化我们的索引数组,初叶化的进度中,大家就把持有的key值添加到我们的数组当中去.然后我们要求加上一个空字符串@"",那是为着给”新的仇人”那些分组做准备的.代码如下所示.

self.indexArray = [NSMutableArray arrayWithArray:self.contactsPinyinDic.allKeys];
[self.indexArray addObject:@""];//添加一个空的字符串,用于菜单分组

然后,大家对索引数组进行遍历排序操作.

    for (int i = 0; i<self.indexArray.count; i++) {

        for (int j = 0; j<i; j++) {

            if (self.indexArray[j]>self.indexArray[i]) {

                NSString *objString = self.indexArray[j];
                self.indexArray[j] =  self.indexArray[i];
                self.indexArray[i] = objString;

            }
        }
    }

如果存在”#”,为了界面包车型客车赏心悦目,大家把”#”放在索引数组的终极1个人,然后,大家就刷新大家的页面即可.

//索引数组移动#号到最后.
if ([self isIncludeWithJing]) {

    [self.indexArray removeObject:@"#"];

    [self.indexArray addObject:@"#"];
}

[self.contactsList reloadData];

如此那般在tableView的数据源方法中,分组个数为索引数组的要素个数self.indexArray.count;每3个section中成分的个数(除了3个分组)都是为字典中对应的每二个value数组的个数.

下一场,大家就能够做出开端的界面包车型客车楷模来了.当然了,那样的镜头必要大家做过多做事的,也是大家下一篇博客所要说到的,电子名片的达成.

</br>

XMPPFramework香江中华电力有限集团子名片相关的方法求证


上边是XMPPFramework中与电子著名影片相关的点子(下述的享有办法都在在X
MPPvCardTempModule类中).

注意:❗️❗️❗️最后二个是代理方法,大家调用前五个艺术在获取到电子名片数据以后,会调起最终的非常代理方法.

//到服务器上请求联系人名片信息 
- (void)fetchvCardTempForJID:(XMPPJID *)jid; 

//请求联系人的名片,如果数据库有就不请求,没有就发送名片请求 
- (void)fetchvCardTempForJID:(XMPPJID *)jid ignoreStorage:(BOOL)ignoreStorage; 

//获取联系人的名片,如果数据库有就返回,没有返回空,并到服务器上抓取 
- (XMPPvCardTemp *)vCardTempForJID:(XMPPJID *)jid shouldFetch:(BOOL)shouldFetch; 

//更新自己的名片信息 
- (void)updateMyvCardTemp:(XMPPvCardTemp *)vCardTemp; 

//获取到联系人的名片信息的回调 
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp forJID:(XMPPJID *)jid

</br>

结束


SDChat中的好友获取的逻辑和代理方法就说到此地了,那里本身要先声明一(Wissu)(Dumex)下,SDChat中可能还留存着Bug,即使有其余难点,欢迎联系骚栋,多谢.接下来的一篇笔者以为应该先把XMPPFramework电子名片的贯彻说一下,XMPPFramework作者觉得最坑的便是添加好友这一块了,逻辑相比较多,准备在第4篇中实行教学表达.希望大家频频关心~最终把SDChat的传送门送给大家.我们能够对照着德姆o来看本篇博客.

电子名片的业务流程


上面大家对电子名片实行了大致的牵线,那么接下去大家就SDChat这些德姆o中的电子名片的获得以及安装来拓展业务流程表明.流程分为三半数以上.(PS:高清图片过大,请下载再实行查看.)

甭管是做什么,大家都亟需先在SDXmppManager激活对应的模块.在SDXmppManager大家要证明八个属性,分别是电子名片本地存款和储蓄类性格XMPPvCardCoreDataStorage电子名片读取存款和储蓄属性XMPPvCardTempModule
以及电子名片的头像模块XMPPvCardAvatarModule.

@property(nonatomic,strong)XMPPvCardTempModule *vCardTempModule;
@property(nonatomic,strong)XMPPvCardCoreDataStorage *vCardCoreDataStorage;
@property(nonatomic,strong)XMPPvCardAvatarModule *vCardAvatarModule

下一场在SDXmppManager的起首化进程中对多个属性对象开始展览早先化并且激活电子名片模块以及头像模块.

        self.vCardCoreDataStorage = [XMPPvCardCoreDataStorage sharedInstance];
        self.vCardTempModule = [[XMPPvCardTempModule alloc]initWithvCardStorage:self.vCardCoreDataStorage];
        [self.vCardTempModule activate:self.stream];
        [self.vCardTempModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
        self.vCardAvatarModule = [[XMPPvCardAvatarModule alloc]initWithvCardTempModule:self.vCardTempModule];
        [self.vCardAvatarModule activate:self.stream];
        [self.vCardAvatarModule addDelegate:self delegateQueue:dispatch_get_main_queue()];

</br>

用户注册进程中的电子名片设置

用户在登记进程中就恐怕要求安装电子名片,大家在SDXmppManager单例的起头化过程中成就电子名片模块激活之后,在SDRegisterVC那么些类中,大家报了名成功之后,在注册成功之后,我们在登记成功的代办方法(-(void)xmppStreamDidRegister:(XMPPStream *)sender)中登录注册的账号密码(小编觉着应该可以向来上传的,但是自身怕出现难点,就让登录之后在上传电子名片数据,我们能够活动测试).代码如下所示.

-(void)xmppStreamDidRegister:(XMPPStream *)sender{

    [[SDXmppManager defaulManager] loginWithUserName:self.loginName.text AndPassWord:self.passWord.text];
}

当登录成功之后,大家在登录成功的代办方法(- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender)中新建1个XMPPvCardTemp对象并上传工作,代码如下所示.

XMPPvCardTemp *myCard = [XMPPvCardTemp vCardTemp];
    myCard.nickname = self.userName.text;
    [[SDXmppManager defaulManager].vCardTempModule updateMyvCardTemp:myCard];

并且弹出头像设置页面跳转的弹窗.

    UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"设置头像" message:@"设置属于自己的头像" preferredStyle:UIAlertControllerStyleAlert];
    __weak typeof(self)temp = self;
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"好的,没问题" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        [temp.navigationController pushViewController:[SDRegisterHeaderVC new] animated:YES];


    }];

    [alertView addAction:action];

    [self presentViewController:alertView animated:YES completion:nil];

进入头像设置页面之后,大家能够暗中认可给用户一张图纸,当用户不开始展览设置的时候,暗中认可上传的头像图片便是私下认可图片,那里本人就随便找了一张图纸,然后大家给UIImageView对象添加1个轻点手势.让用户点击图片的时候能够切换图像.

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickHeaderView)];
[self.headerView addGestureRecognizer:tap];
self.headerView.userInteractionEnabled = YES;

大家在点击事件中丰裕打开系统的图库以及系统的照相机的不二法门并且增加代理方法,即使不理解哪些打开系统相机或许相册,能够查阅昆仑山论剑之浅谈iOS调用大乱斗(电话,短信,浏览器,相机,相册).那么大家就能够通过代办方法来取获得我们的图样,代理方法如下所示.

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

在代理方法中,大家要求注意三个难题,假若大家根据恒山论剑之浅谈iOS调用大乱斗(电话,短信,浏览器,相机,相册)来获取图片的话只怕取得图片是变形的,大家供给把从info字典中拿走图片的key值UIImagePickerControllerOriginalImage换成UIImagePickerControllerEditedImage;

        UIImage* image = [info objectForKey:@"UIImagePickerControllerEditedImage"];

我们把图片保存在SDRegisterHeaderVC的性质对象headerImg个中,然后在用户点击”实现”时候,大家就会调用SDXmppManager获取到当前登录账号的d电子名片对象.

    XMPPvCardTemp *vCard = [SDXmppManager defaulManager].vCardTempModule.myvCardTemp;

下一场大家把开始展览压缩,修改图片的尺寸,(注意:❗️❗️❗️图片过大的时候,或然会产出图片上传战败的境况,所以我们把它举办图纸的改动),那里本人提供了1个图片修改的法门并且用它对大家的头像图片举行了尺寸修改.

- (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize{

    UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));

    [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];

    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return reSizeImage;

}

UIImage *headerimage = [self reSizeImage:self.headerImg toSize:CGSizeMake(100, 100)];

修改完图片的尺码之后,大家就对头像图片举行二级制文件的公文转换(那里只拿PNG格式图片作注明,具体还有JPEG格式的,请查看德姆o源码),然后把头像文件更新到Openfire服务器中.代码如下所示.

data = UIImagePNGRepresentation(headerimage);
vCard.photo = data;

[[SDXmppManager defaulManager].vCardTempModule updateMyvCardTemp:vCard];

最后,我们关闭与服务器之间的连日,跳转到登录界面.

[self dismissViewControllerAnimated:YES completion:nil];
[[SDXmppManager defaulManager] disconnectWithServer];

</br>

用户登录之后电子著名影片的得到(进程在SDContactsVC中落实)

上边大家说到哪边在用户的注册进度中对用户的电子名片进行安装,那么大家在登录成功之后怎么赢得用户的头像,名称以及好友的用户头像,名称呢?大家先用代理方法来落到实处获取电子名片的方法.

首先,大家须要在维系人界面初阶化方法中添加电子著名影片的有关代理.如下所示.

[[SDXmppManager defaulManager].vCardAvatarModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
[[SDXmppManager defaulManager].vCardTempModule addDelegate:self delegateQueue:dispatch_get_main_queue()];

随即,大家在获得每三个密友节点的代理方法中获取到相知节点所对应的JID音信,然后咱们选用SDXmppManager中的vCardTempModule调起- (void)fetchvCardTempForJID:(XMPPJID *)jid ignoreStorage:(BOOL)ignoreStorage
方法就能够调起代理方法来.代码如下所示.

[[SDXmppManager defaulManager].vCardTempModule fetchvCardTempForJID:jid ignoreStorage:YES];

下一场,大家经过下述代理方法的回调,大家能够收获到JID以及相应的电子著名影片音信.

- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule
        didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp
                     forJID:(XMPPJID *)jid 

不过,那里不仅能取得到相知的数目,而且登录者的电子名片也能够经过那一个代理方法进行获取,所以我们要判断区分.借使是登录者的JID,那么大家把收获到电子新知名片存款和储蓄到SDUser那一个单例个中方便别的职位获取,如若是忘年交的JID,那么大家就遍历我们的至交节点数组,然后经过比对JID音信,把相应的电子名片添加到Model中去,然后刷新当前的好友列表页面
.全体的代码如下所示.

    if ([jid.user isEqual:[SDUser defaulUser].jid.user]) {

        [SDUser defaulUser].vCard = vCardTemp;
        [self.userInformationView reloadAllData];

    }else{

        for (NSString * key in self.contactsPinyinDic) {
            NSMutableArray *array = [NSMutableArray arrayWithArray:self.contactsPinyinDic[key]];
            for (SDContactModel *model in array) {
                if ([model.jid isEqual:jid]) {
                    model.vCard =vCardTemp;
                }
            }
          }

        //刷新页面
        [self networkingWithContactsArray];
    }

</br>
上述的是透过代办方法来达成好友以及登陆者自个儿的电子名片获取.上面大家看一下什么通过XMPPvCardTempModule这几个类来开始展览电子名片的获取.

率先,咱们照旧在取得每三个好友节点的代办方法中赢得到相知节点所对应的JID音信,然后我们利用SDXmppManager中的vCardTempModule调起- (XMPPvCardTemp *)vCardTempForJID:(XMPPJID *)jid shouldFetch:(BOOL)shouldFetch;本条点子来.直接获得到相知自个儿的电子名片音讯,代码如下所示/

XMPPvCardTemp *vCard =  [[SDXmppManager defaulManager].vCardTempModule vCardTempForJID:jid shouldFetch:YES];

那么,大家如何直接获得登陆者自身的电子名片数据吧?咱们一贯动用SDXmppManager就可以直接获取到登陆者自个儿电子名片自个儿.

XMPPvCardTemp *myCard = [SDXmppManager defaulManager].vCardTempModule.myvCardTemp;
NSString *userName = [NSString stringWithFormat:@"  昵称: %@",myCard.nickname];
NSData *imgData = myCard.photo;

骚栋早先时期也是直接获得电子名片数据的,不过尔尔一向得到电子名片数据是有肯定弊端的,那正是获得服务器香港(Hong Kong)中华电力有限公司子名片数据是有一定时间的,假如在页面刷新以前还尚未获得到数码以来,那么在页面上数据像是就为空了,所以提议接纳代理回调方法来开始展览好友数据的获取.(SDChat中二种情势都以拥有保存的.)

</br>

签到之后设置电子名片流程

用户在签到之后,跟注册进度看似,也是能够安装相应的电子名片数据的.首先大家收获到登录者的电子名片,如下所示.

XMPPvCardTemp *myCard = [SDXmppManager defaulManager].vCardTempModule.myvCardTemp;

然后,我们修改电子名片中的属性.那里拿名称来比喻表达.

myCard.nickname = textField.text;

最终,大家上传到服务器上实行更新.

[[SDXmppManager defaulManager].vCardTempModule updateMyvCardTemp:myCard];

但是那里须求留意的是代理方法的回调难点,大家怎么着精通咱们的竹马之交已经进展了头像的更改只怕说是电子名片的修改呢?那就需求贯彻三个代理方法,2个是大家地方说到收获到相知节点的电子名片回调方法,别的一个正是收获好友节点的头像更改的代办回调方法,多个艺术如下所示.(前提,大家先要在开首化进度中设置代理)

//获取到好友节点的电子名片回调方法
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule
        didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp
                     forJID:(XMPPJID *)jid 

//获得好友节点的头像更改的代理回调方法
- (void)xmppvCardAvatarModule:(XMPPvCardAvatarModule *)vCardTempModule
              didReceivePhoto:(UIImage *)photo
                       forJID:(XMPPJID *)jid

在艺术中,大家须求区分处理,大家当获得到登录者自身的电子名片的改动该怎么做,大家吸收接纳牵连人Hong Kong中华电力有限公司子名片又该怎么操作,须要大家依据实际景况来开始展览处理.

好了上述正是电子名片的有关那是获取和装置,当大家做到之后,大家就足以等到上面的界面了,比较于只体现JID确实是精粹了好多啊~~

个体菜单

知音列表

</br>

–>SDChat传送门🚪

</br>

结束


上边基本正是XMPPFramework东方之珠中华电力有限集团子名片的相关技能点了,假若其余童鞋有问号,欢迎提议,骚栋非凡欢迎各位童鞋前来调换.下一篇我准备写写XMPPFramework中逻辑最多的好友添加和删除模块,希望大家频频关心骚栋,多谢.最后把SDChat的传送门送给我们.大家能够对照着Demo来看本篇博客.

–>SDChat传送门🚪

</br>