XMPPFramework:尝试更新 VCard 上的昵称

Posted

技术标签:

【中文标题】XMPPFramework:尝试更新 VCard 上的昵称【英文标题】:XMPPFramework: Trying to update nickname on VCard 【发布时间】:2013-05-13 14:54:26 【问题描述】:

这个问题就像它的标题所说的那样简单:我正在尝试更新他的 VCard 上的用户昵称,但我不能。我正在使用此代码:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
    dispatch_async(queue, ^
        XMPPvCardTemp *myVcardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
        [myVcardTemp setNickname:@"a_nickname"];
        [[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:myVcardTemp];
    );

我无法想象为什么这段代码不想工作,而同一段但更新照片却像魅力一样工作:

NSData *imageData = UIImagePNGRepresentation(anImage);
        dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
        dispatch_async(queue, ^
            XMPPvCardTemp *myVcardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
            [myVcardTemp setPhoto:imageData];
            [[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:myVcardTemp];
        );

任何帮助将不胜感激......这让我发疯了

注意:我使用 OpenFire 作为 XMPP 服务器

这是我尝试更新昵称时服务器返回给我的节

RECV: <iq xmlns="jabber:client" type="result" from="7db55e68-cb18-4826-befd-0eb9269637aa@000.000.000.000" to="7db55e68-cb18-4826-befd-0eb9269637aa@000.000.000.000/2cfc4f88"><chat_jorges xmlns="vcard-temp"><NICKNAME>chat_jorges</NICKNAME></chat_jorges></iq>

(我将服务器的 ip 更改为 000.000.000.000)

【问题讨论】:

也许这很愚蠢,但您是否尝试过:setNICKNAME = @"您的昵称"? 好吧,XMPPvCardTemp 没有实现 setNICKNAME,但 setNickname 如图所示...不过谢谢 :) 对不起。但是我越读你的问题,它就越让我发疯。如果您也将其作为数据推送? (想知道它怎么会……) 好点弗兰克,真的好点...让我试试... 好吧,setNickname 方法需要一个 NSString 参数而不是 NSData 参数... :( 【参考方案1】:

编辑:我完全错了不要读这个

其实我在看XMPP的源码的时候,就想知道它是怎么设置值的。 在 XMPPvCardTempBase.h 中:

#define XMPP_VCARD_SET_STRING_CHILD(Value, Name) NSXMLElement *elem = [self elementForName:(Name)];
//it looks like a get and not a set??

在 XMPPvCardTemp.m 中:

- (void)setNickname:(NSString *)nick 
    XMPP_VCARD_SET_STRING_CHILD(nick, @"NICKNAME");

也许某处有 KVC 之类的东西...... 你能在源代码中试试这个吗:

 - (void)setNickname:(NSString *)nick 
       XMPP_VCARD_SET_STRING_CHILD(nick, @"NICKNAME") = nick ;
   

【讨论】:

好的,我马上试试。感谢您的时间。我会提供反馈:) 实际上,如果我使用您提出的调整,XCode 会给出错误“预期表达式”。如果可以看到,XMPP_VCARD_SET_STRING_CHILD 的定义已经将“nick”设置为“Value”... 哦,是的,你是对的,我没有看到定义的完整实现。 看来,如果我在更新昵称后立即发送出席信息,委托方法 didReceivePresence 将在其他设备上触发,然后我可以触发此代码: [xmppRoster setNickname:@"name" forUser: [来自]];它现在似乎可以作为一个补丁工作......但是知道这种行为的起源会很有趣

以上是关于XMPPFramework:尝试更新 VCard 上的昵称的主要内容,如果未能解决你的问题,请参考以下文章

Outlook 中 PHP 生成的 vCard 的字符编码问题

XMPPFramework 整理文件传输

为啥 XMPPFramework 会阻塞?

Excel 转 vCard格式CSV格式

XMPPFramework - 存在不变

MS“VCard”法国特色字符