Я пытаюсь получить vCard для нескольких JID, включая текущего пользователя. Я инициализировал и активировал XMPPvCardTempModule
, используя следующий код -
_xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
_xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:self.xmppvCardStorage];
_xmppvCardAvatarModule = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:self.xmppvCardTempModule];
[self.xmppvCardTempModule activate:self.xmppStream];
[self.xmppvCardAvatarModule activate:self.xmppStream];
[self.xmppvCardAvatarModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
[self.xmppvCardTempModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
А затем я реализовал следующие методы делегата -
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule
didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp
forJID:(XMPPJID *)jid{
DDLogDebug(@"Received vCard for %@ \n vCard:%@",jid.full,vCardTemp.XMLString);
ContactCore* contact = [appDelegate.coreDataController findContact:jid.user];
contact.vCard = vCardTemp;
[appDelegate.dataController postContactUpdateNotification:contact];
}
- (void)xmppvCardTempModuleDidUpdateMyvCard:(XMPPvCardTempModule *)vCardTempModule{
[self.selfContact setVCard:vCardTempModule.myvCardTemp];
}
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule failedToUpdateMyvCard:(DDXMLElement *)error{
DDLogDebug(@"failedToUpdateMyvCard Error: %@",error.XMLString);
}
-(void)xmppvCardAvatarModule:(XMPPvCardAvatarModule *)vCardTempModule didReceivePhoto:(UIImage *)photo forJID:(XMPPJID *)jid{
ContactCore* contact = [appDelegate.coreDataController findContact:jid.user];
}
Проблема в том, что ни один из этих методов делегата никогда не вызывается. Я вижу вывод vCard в данных журнала, что означает, что vCard извлекаются правильно. Поэтому я реализовал didReceiveIQ
, чтобы получать vCard прямо из источника, используя следующий код:
- (BOOL)xmppStream:(XMPPStream*)sender didReceiveIQ:(XMPPIQ *)iq{
XMPPvCardTemp *vCard = [XMPPvCardTemp vCardTempSubElementFromIQ:iq];
if(vCard){
ContactCore* contact = [appDelegate.coreDataController findContact:iq.from.user];
contact.vCard = vCard;
}
return NO;
}
Но vCard
никогда не инициализируется. Я проверил IQ и получил их правильно. Затем я тщательно проверил весь XML и обнаружил, что тег vCard
отсутствует и был заменен фактическим именем контакта. Например, вот что я получал от одного из контактов -
<iq
xmlns="jabber:client" from="[email protected]" to="[email protected]/xxx" id="12345" type="result">
<Abhi
xmlns="vcard-temp" prodid="-//HandGen//NONSGML vGen v1.0//EN" version="2.0">
<PHOTO>
<TYPE>image/jpeg</TYPE>
<BINVAL><!--A long Base64 code--></BINVAL>
</PHOTO>
</Abhi>
</iq>
Тег <Abhi>
должен быть <vCard>
, чтобы метод vCardTempSubElementFromIQ
идентифицировал его как vCard
. Я хочу знать, нормальное ли это поведение или я что-то здесь делаю не так? Если что-то я делаю неправильно, как я должен это делать правильно?