XMPPIQ не устанавливает тег vCard в vCard

Я пытаюсь получить 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. Я хочу знать, нормальное ли это поведение или я что-то здесь делаю не так? Если что-то я делаю неправильно, как я должен это делать правильно?


person noob    schedule 05.02.2016    source источник


Ответы (1)


При сохранении vCard я использовал свойство name vCard, чтобы установить имя контакта. Это свойство фактически изменяет имя тега, а не имя контакта. Я начал использовать свойство nickname после того, как осознал свою ошибку.

person noob    schedule 20.05.2016