【问题标题】:XMPPIQ doesn't set vCard tag in the vCardXMPPIQ 不在 vCard 中设置 vCard 标签
【发布时间】:2016-02-05 20:57:02
【问题描述】:

我正在尝试检索几个 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 直接从源中获取电子名片,使用以下代码 -

- (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 永远不会被初始化。我检查了智商,我收到了正确的。然后我正确地检查了整个 XML,发现 vCard 标签不存在,它被替换为联系人的实际姓名。例如,这是我为其中一位联系人获得的 -

<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>

标签&lt;Abhi&gt; 应该是&lt;vCard&gt;,以便vCardTempSubElementFromIQ 方法将其识别为vCard。我想知道这是正常行为还是我在这里做错了什么?如果是我做错了什么,正确的做法应该是什么?

【问题讨论】:

    标签: ios objective-c xmppframework vcf-vcard


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-17
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多