iOS XMPP——電子名片 與 頭像模塊

一、簡介

  • vCard(或稱做Versitcard),vCard的常用文件擴展名是.vcf
  • vCard是電子名片的文件格式標準,一般附加在電子郵件之后,但也可以用于其它場合(如在因特網(wǎng)上相互交換)

二、實現(xiàn)分析

  • 1.XEP-0054提供了一種機制,可以通過XMPP發(fā)送電子名片
  • 2.要使用個人名片首先需要在XMPPFramework.h中啟用電子名片與頭像模塊的擴展頭文件:
 // 電子名片
 #import "XMPPvCardCoreDataStorage.h"
 #import"XMPPvCardTempModule.h"

 // 頭像模塊
 #import "XMPPvCardAvatarModule.h"
  • 3.定義屬性及成員變量
  • 4.為XMPPSteam添加電子名片擴展
  • 5.在需要時使用電子名片

三、實現(xiàn)具體步驟

  • 1、在XMPPFramework框架的XMPPFramework.h頭文件中,啟動電子名片擴展頭文件,加入下列代碼:

    // 電子名片模塊
    #import "XMPPvCardTempModule.h"
    #import "XMPPvCardCoreDataStorage.h"
    
  • 2、定義電子名片屬性及成員變量

    • 在AppDelegate.h文件中,加入 全局電子名片模塊屬性:下列代碼,

// 全局電子名片模塊
@property (nonatomic, strong,readonly) XMPPvCardTempModule *vCardModule;

   -  在AppDelegate.m文件中,添加如下,電子名片數(shù)據(jù)存儲模塊成員變量

  ```objc
 @interface JPAppDelegate()<XMPPStreamDelegate>{
       
  // 自動連接模塊
   XMPPReconnect *_reconnect;

 // 電子名片數(shù)據(jù)存儲
  XMPPvCardCoreDataStorage *_vCardStorage;

  // 頭像模塊
  XMPPvCardAvatarModule *_vCardAvatar;
    
    XMPPResultBlock _resultBlock;
}
  • 3、為XMPPSteam添加電子名片擴展和頭像擴展
    • 修改setupXmppStream方法:如下:
#pragma mark 初始化xmppStrem對象
-(void)setupXmppStream{
    
    NSAssert(_xmppStream == nil, @"xmppStream對象初始化多次");
    
    // 1. 創(chuàng)建xmppStrem對象
    _xmppStream = [[XMPPStream alloc] init];
    // 2. 添加代表
    [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
    
    // 3. 添加自動連接模塊
    _reconnect = [[XMPPReconnect alloc] init];
    //激活
    [_reconnect activate:_xmppStream];
  
    //電子名片數(shù)據(jù)存儲
    _vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
    
    // 4. 添加電子名片模塊
    _vCardModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:_vCardStorage];
    //激活
    [_vCardModule activate:_xmppStream];

 // 5. 添加頭像模塊
    _vCardAvatar = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:_vCardModule];
    [_vCardAvatar activate:_xmppStream];
}
  • 4、需要我們手動釋放資源
#pragma mark 釋放資源
-(void)teardownXmppstream{
    // 移動代理
    [_xmppStream removeDelegate:self];
    
    // 停止模塊
    // 停止自動連接模塊
    [_reconnect deactivate];
    
    // 停止電子名片模塊
    [_vCardModule deactivate];

   // 停止頭像模塊
    [_vCardAvatar deactivate];    
    
   // 斷開連接
    [_xmppStream disconnect];
    
    // 清空資源為nil
    _xmppStream = nil;
    _reconnect = nil;
    _vCardModule = nil;
    _vCardStorage = nil;
   _vCardAvatar = nil;
}
  • 注意:初次運行會自動生成一個SQLite數(shù)據(jù)庫文件:XMPPvCard.sqlite

四、展示電子名片

  • 1、創(chuàng)建JPVCardViewController控制器,并導(dǎo)入頭文件
#import "JPAppDelegate.h"
#import "XMPPvCardTemp.h"
  • 2、加載電子名片數(shù)據(jù)到視圖中
@interface JPVCardViewController ()
- (IBAction)logout:(id)sender;
@property (weak, nonatomic) IBOutlet UIImageView *avatar;
@property (weak, nonatomic) IBOutlet UILabel *nickNameLabel;//昵稱
@property (weak, nonatomic) IBOutlet UILabel *jidLabel;//jid(用戶id)

@property (weak, nonatomic) IBOutlet UILabel *orgNameLabel;//公司名稱
@property (weak, nonatomic) IBOutlet UILabel *orgUnitLabel;//公司部門
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;//公司職位
@property (weak, nonatomic) IBOutlet UILabel *telLabel;//電話
@property (weak, nonatomic) IBOutlet UILabel *emailLabel;//郵箱

@end
-(void)viewDidLoad{
    [super viewDidLoad];
   
    [self dataBind];
}


// 電子名片數(shù)據(jù)綁定
-(void)dataBind{
    
    //初始化登錄用戶的電子名片信息
    XMPPvCardTemp *myCard = xmppDelegate.vCardModule.myvCardTemp;
    
    if (myCard.photo) {
        NSLog(@"有頭像");
        //設(shè)置頭像
        self.avatar.image = [UIImage imageWithData:myCard.photo];
    }
    
    //設(shè)置昵稱
    self.nickNameLabel.text = myCard.nickname;
    
    //設(shè)置jid
    self.jidLabel.text = xmppDelegate.xmppStream.myJID.bare;
    
    //設(shè)置公司
    self.orgNameLabel.text = myCard.orgName;
    
    //設(shè)置部門
    if (myCard.orgUnits.count > 0) {
        self.orgUnitLabel.text = myCard.orgUnits[0];
    }
    
    //設(shè)置職位
    self.titleLabel.text = myCard.title;
    
    //設(shè)置電話 (隨便用一個字段充當電話號碼)
    self.telLabel.text = myCard.note;
    
    //設(shè)置郵件 (隨便用一個字段充當郵件)
    self.emailLabel.text = myCard.mailer;
    
    //myCard.jid沒有正確返回當用戶的jid
    //NSLog(@"jid:%@",myCard.jid.bare);
    
//    NSLog(@"%@ %@ %@ %@ %@ %@ %@", myCard.nickname, myCard.formattedName, myCard.familyName, myCard.givenName, myCard.middleName, myCard.prefix, myCard.suffix);
//    // jid 為空
//    NSLog(@"%@ %@ %@ %@ %@ %@ %@ %@", myCard.addresses, myCard.labels, myCard.telecomsAddresses, myCard.emailAddresses, myCard.jid, myCard.mailer, myCard.timeZone, myCard.location);
//    // 職務(wù),[], 公司,部門數(shù)組
//    NSLog(@"%@ %@ %@ %@ %@ %@ %@ %@ %@", myCard.title, myCard.role, myCard.orgName, myCard.orgUnits[0], myCard.categories, myCard.note, myCard.prodid, myCard.sortString, myCard.phoneticSound);
//    NSLog(@"%@ %@ %@ %@ %@", myCard.uid, myCard.url, myCard.version, myCard.description, myCard.keyType);
}

五、修改電子名片

  • 獲取到之前的電子名片模型,進行修改,修改之后,要記得更新到服務(wù)器上。
-(void)editVCardViewControllerFinish{
    // 把新的電子名片數(shù)據(jù)上傳到服務(wù)
    // 1. 獲取以前的電子名片數(shù)據(jù)
    XMPPvCardTemp *myCard = xmppDelegate.vCardModule.myvCardTemp;
    
    // 設(shè)置頭像
    
    NSData *avatarData = UIImageJPEGRepresentation(self.avatar.image, 0.7);
    if (avatarData) {
        myCard.photo = avatarData;
    }

    // 昵稱
    myCard.nickname = self.nickNameLabel.text;
    
    // 公司
    myCard.orgName = self.orgNameLabel.text;
    
    // 部門是一個數(shù)組
    NSString *orgUnit = self.orgUnitLabel.text;
    if (orgUnit.length > 0) {
        myCard.orgUnits = @[orgUnit];
    }
    
    // 職位
    myCard.title = self.titleLabel.text;
    
    // 電話
    myCard.note = self.telLabel.text;
    
    // 郵件
    myCard.mailer = self.emailLabel.text;
    
    // 保存數(shù)據(jù)
    // 先存儲到本地,接著上傳到服務(wù)器
    [xmppDelegate.vCardModule updateMyvCardTemp:myCard];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容