也就是说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
CardTempModule这几个类应用做电子名片的读取和仓储,XMPPvCardCoreDataStorage用来做电子名片的当地存储,XMPPvCardAvatarModule是用来做头像的储存和读取的,XMPPvCardTemp则是电子名片.

此间我要说一下有关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>

好友列表获取流程.


当用户登录成功之后,我们做的最重大的一个模块就是加载好友列表模块.那么好友加载模块的完好流程是何等的呢?我们先看一个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是每一个JID的首字母大写(或者是用户名称的首字母大写).因为字典是无序的,那么哪些形成有序的排列呢?大家必要树立其余一个数组作为排序数组,同时也起着索引数组的成效.大家把字典中持有的Key放入数组中,然后排序,数据提取进度中大家只要求基于数组的排列顺序拿取即可.示意图如下所示.

那么我们看一下实在代码进度中,对于字典的多少拉长整理部分,首先大家要开首化字典对象,然后大家遍历好友节点数组([SDUser defaulUser].contactsArray),取出大家须求排序的每一个珍贵字符串(不管是JID依然用户名).我们调用-(NSString *)transform:(NSString *)chinese本条方式回去首字母并且大写.在那一个方法中大家有三种景况须要处理,一种是收获字符串失利,也就是说传入的是一个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];
}

那就是说通过再次来到首字母,大家须要判定一下当下的字典对象中是或不是早已存在了改分组的数组,若是存在,那么直接存储,假若不设有,那么伊始化一个数组之后,以首字母为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;

            }
        }
    }

万一存在”#”,为了界面的华美,大家把”#”放在索引数组的结尾一位,然后,咱们就刷新大家的页面即可.

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

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

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

[self.contactsList reloadData];

如此那般在tableView的数据源方法中,分组个数为索引数组的要素个数self.indexArray.count;每一个section中元素的个数(除了一个分组)都是为字典中对应的每一个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中的好友获取的逻辑和代理方法就说到那里了,那里自己要先声澳优下,SDChat中或者还设有着Bug,借使有别的问题,欢迎联系骚栋,谢谢.接下来的一篇我觉着应该先把XMPPFramework电子名片的完结说一下,XMPPFramework我以为最坑的就是丰富好友这一块了,逻辑比较多,准备在第五篇中展开教学表明.希望大家不断关怀~最后把SDChat的传送门送给大家.大家可以对照着Demo来看本篇博客.

电子名片的业务流程


地点大家对电子名片举办了简约的介绍,那么接下去大家就SDChat这些Demo中的电子名片的取得以及安装来进展业务流程表达.流程分为三大部分.(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)中新建一个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对象添加一个轻点手势.让用户点击图片的时候能够切换图像.

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;

接下来大家把开展削减,修改图片的尺寸,(注意:❗️❗️❗️图片过大的时候,可能会冒出图片上传败北的场地,所以咱们把它进行图片的修改),那里自己提供了一个图形修改的方法并且用它对大家的头像图片举行了尺寸修改.

- (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格式的,请查看Demo源码),然后把头像文件更新到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;

骚栋先前时期也是直接拿走电子名片数据的,不过如此直白拿到电子名片数据是有自然弊端的,那就是得到服务器中电子名片数据是有肯定时间的,若是在页面刷新之前还尚无收获到数量的话,那么在页面上多少像是就为空了,所以提出利用代理回调方法来进展好友数据的获取.(SDChat中二种艺术都是兼备保存的.)

</br>

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

用户在签到之后,跟注册进程看似,也是足以设置相应的电子名片数据的.首先我们获获得登录者的电子名片,如下所示.

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

接下来,大家修改电子名片中的属性.那里拿名称来比喻表达.

myCard.nickname = textField.text;

说到底,大家上传到服务器上进行更新.

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

然则那里必要留意的是代理方法的回调难题,咱们怎样知道大家的至交已经开展了头像的更改或者说是电子名片的修改呢?那就须要落成三个代理方法,一个是我们地方说到收获到相知节点的电子名片回调方法,此外一个就是得到好友节点的头像更改的代理回调方法,五个格局如下所示.(前提,大家先要在开端化进度中安装代理)

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

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

在艺术中,大家须求区分处理,大家当得到到登录者本身的电子名片的改动该咋做,我们收起牵连人中电子名片又该怎么操作,须要大家依照实际处境来开展处理.

好了上述就是电子名片的相干那是赢得和装置,当大家成功未来,大家就足以等到上面的界面了,比较于只显示JID确实是天生丽质了广大吗~~

村办菜单

知音列表

</br>

–>SDChat传送门🚪

</br>

结束


地点基本就是XMPPFramework中电子名片的有关技术点了,假设其它童鞋有疑难,欢迎指出,骚栋至极欢迎各位童鞋前来互换.下一篇我准备写写XMPPFramework中逻辑最多的好友添加和删除模块,希望我们频频关怀骚栋,谢谢.最终把SDChat的传送门送给大家.大家可以对照着Demo来看本篇博客.

–>SDChat传送门🚪

</br>

相关文章