代码之家  ›  专栏  ›  技术社区  ›  0xC0DED00D

XMPPIQ未在vCard中设置vCard标签

  •  1
  • 0xC0DED00D  · 技术社区  · 9 年前

    我正在尝试检索几个JID的vCard,包括当前用户。我已初始化并激活 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,发现 电子名片交换格式 标签不存在,它被替换为联系人的实际姓名。例如,这是我为其中一个联系人得到的-

    <iq
        xmlns="jabber:client" from="xxx@xxx.com" to="xxx@xxx.com/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 方法将其标识为 电子名片交换格式 。我想知道这是正常行为还是我做错了什么?如果这是我做错的事情,那么正确的做法应该是什么?

    1 回复  |  直到 9 年前
        1
  •  0
  •   0xC0DED00D    8 年前

    保存我正在使用的vCard时 name 的属性 vCard 设置联系人的姓名。此属性实际上更改了标记名,而不是联系人名。我开始使用 nickname 意识到我的错误后。