名片(vCard) 屬于 XMPP 擴(kuò)展協(xié)議 XEP - 0054 部分。
每一個(gè)名片模塊的實(shí)例都包含了一個(gè)用戶實(shí)例的所有身份信息丑罪。雖然針對(duì)單純集成 XMPP
實(shí)現(xiàn) IM
功能的應(yīng)用來說可能并不是很需要用到這部分協(xié)議,但是作為純使用 XMPP
協(xié)議開發(fā)的應(yīng)用來說這個(gè)模塊就顯得很有必要了宅楞。(舉個(gè)栗子:Facebook 與 Facebook Messenger)
XMPPFramework 中的 vCard
如果我們想要在 XMPPFramework
中使用 vCard
功能,那么有三個(gè)類是必須要接觸的:XMPPvCardTemp
、XMPPvCardTempModule
彤枢、XMPPvCardCoreDataStorage
。
-
XMPPvCardTemp
: vCard 實(shí)例模型雷滋,包含用戶的信息 -
XMPPvCardTempModule
: 交互模塊旷偿,需要加載在XMPPStream
中 -
XMPPvCardCoreDataStorage
:XMPPvCardTemp
的緩存模塊萍程,避免重復(fù)請(qǐng)求網(wǎng)絡(luò)
下面我們直接上代碼
// 使用 vCard 模塊步驟:
// 1茫负、在初始化 XMPPStream 時(shí)啟用 vCard 模塊
- (void)initalize
{
// 初始化連接
_xmppStream = [[XMPPStream alloc] init];
[_xmppStream setHostName:XMPP_HOST];
[_xmppStream setHostPort:XMPP_PORT];
[_xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
[_xmppStream setKeepAliveInterval:30];
[_xmppStream setEnableBackgroundingOnSocket:YES];
// 接入斷線重連模塊
_xmppReconnect = [[XMPPReconnect alloc] initWithDispatchQueue:dispatch_get_main_queue()];
[_xmppReconnect setAutoReconnect:YES];
[_xmppReconnect activate:_xmppStream];
// 接入流管理模塊
_streamStorage = [[XMPPStreamManagementMemoryStorage alloc] init];
_xmppStreamManagement = [[XMPPStreamManagement alloc] initWithStorage:_streamStorage];
[_xmppStreamManagement setAutoResume:YES];
[_xmppStreamManagement addDelegate:self delegateQueue:dispatch_get_main_queue()];
[_xmppStreamManagement activate:_xmppStream];
// 接入好友模塊
_rosterStorage = [[XMPPRosterMemoryStorage alloc] init];
_xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:_rosterStorage];
[_xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
[_xmppRoster activate:_xmppStream];
// 接入好友名片模塊
_vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
_xmppVCard = [[XMPPvCardTempModule alloc] initWithvCardStorage:_vCardStorage];
[_xmppVCard addDelegate:self delegateQueue:dispatch_get_main_queue()];
[_xmppVCard activate:_xmppStream];
}
// 2羹蚣、針對(duì)好友,在獲取到好友列表后匹配對(duì)應(yīng)名片
- (void)xmppRosterDidChange:(XMPPRosterMemoryStorage *)sender
{
// 獲取自己的名片
_myVCard = [_xmppVCard myvCardTemp];
// 獲取好友名片
NSArray *users = [sender unsortedUsers];
[users enumerateObjectsUsingBlock:^(XMPPUserMemoryStorageObject * _Nonnull user, NSUInteger idx, BOOL * _Nonnull stop)
{
// 關(guān)鍵代碼戚哎,匹配好友名片并存入緩存中
[_xmppVCard fetchvCardTempForJID:user.jid ignoreStorage:NO];
}];
// 通知更新花名冊(cè)
[[NSNotificationCenter defaultCenter] postNotificationName:XMPPRosterChanged object:nil];
}
// 3槐脏、取出緩存中的名片
- (void)getFriendsVCard
{
// 從數(shù)據(jù)庫中獲取成員名片
_memberVCards = [NSMutableArray array];
[_members enumerateObjectsUsingBlock:^(IMRoomMemberModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
XMPPJID *jid = [XMPPJID jidWithString:obj.jid];
XMPPvCardTemp *memberVCard = [getXMPPManager().xmppVCard vCardTempForJID:jid shouldFetch:YES];
if (memberVCard) {
[_memberVCards addObject:memberVCard];
}
}];
}
想了想名片也不知道還有什么值得的寫的,就這樣結(jié)束這篇內(nèi)容好了蔑担。如果有問題的歡迎在評(píng)論中提出來