XMPPIQ 不在 vCard 中设置 vCard 标签
XMPPIQ doesn't set vCard tag in the vCard
我正在尝试检索几个 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];
}
问题是 none 这些委托方法曾经被调用过。我可以在日志数据中看到 vCard 输出,这意味着可以正确获取 vCard。所以我实现了 didReceiveIQ
以直接从源获取 vCards,使用以下代码 -
- (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>
标签 <Abhi>
应该是 <vCard>
,以便 vCardTempSubElementFromIQ
方法将其识别为 vCard
。我想知道这是正常行为还是我在这里做错了什么?如果这是我做错了什么,正确的做法应该是什么?
保存 vCard 时,我使用 vCard
的 name
属性 来设置联系人姓名。 属性 实际上更改的是标签名称,而不是联系人名称。我意识到自己的错误后开始使用 nickname
属性。
我正在尝试检索几个 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];
}
问题是 none 这些委托方法曾经被调用过。我可以在日志数据中看到 vCard 输出,这意味着可以正确获取 vCard。所以我实现了 didReceiveIQ
以直接从源获取 vCards,使用以下代码 -
- (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>
标签 <Abhi>
应该是 <vCard>
,以便 vCardTempSubElementFromIQ
方法将其识别为 vCard
。我想知道这是正常行为还是我在这里做错了什么?如果这是我做错了什么,正确的做法应该是什么?
保存 vCard 时,我使用 vCard
的 name
属性 来设置联系人姓名。 属性 实际上更改的是标签名称,而不是联系人名称。我意识到自己的错误后开始使用 nickname
属性。