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>

相关文章