电子厂XMPPFramework开发(四):电子名片

</br>

前言


达一致首博客中我们说及何以通过XMPPFramework中之代理方来收获到相知节点数据信息,但是咱发现节点信息能够亮的只有JID,所以今天咱们就算说一下每当XMPPFramework如何设置名片信息及哪取得自己之同挚友的片子信息.

登记下的头像的安

</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>

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这个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>

结束


面基本就是XMPPFramework中电子名片的连锁技术点了,如果另外童鞋有问号,欢迎提出,骚栋非常欢迎各位童鞋前来交流.下一样篇自准备写写XMPPFramework中逻辑最多的至交添加和去模块,希望大家频频关注骚栋,谢谢.最后把SDChat的传递门送给大家.大家可比着Demo来拘禁本篇博客.

–>SDChat传送门🚪

</br>

相关文章