【问题标题】:XMPPFramework - How can I update my own avatar image?XMPPFramework - 如何更新我自己的头像图像?
【发布时间】:2012-10-24 23:43:15
【问题描述】:

我正在开发一个应用程序,我想更新我的头像图像。我遵循XEP-0153 指南更新我的头像图像,我构造了一个NSXMLElement 对应于XEP-0153 中的以下代码,并通过XMPPStream 发送该元素。

<iq from='juliet@capulet.com' 
    type='set'
    id='vc1'>
  <vCard xmlns='vcard-temp'>
    <PHOTO>
      <TYPE>image/jpeg</TYPE>
      <BINVAL>
        Base64-encoded-avatar-file-here!
      </BINVAL>
    </PHOTO>
  </vCard>
</iq>

服务器响应以下错误:

<iq xmlns="jabber:client" type="error" id="vc1" to="vvreddy50@gmail.com/83557F96">
<vCard xmlns="vcard-temp">
      <photo>
        <type>image/jpeg</type>
        <binval>Base64-encoded-avatar-file-here</binval>
      </photo>
</vCard>
<error code="500" type="wait">
      <internal-server-error xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
      </internal-server-error>
</error>
</iq>

而不是&lt;iq to='juliet@capulet.com' type='result' id='vc1'/&gt;

任何人都可以发布与更新头像图像相关的代码或链接吗?提前致谢。

【问题讨论】:

    标签: ios xmpp xmppframework avatar


    【解决方案1】:
    - (void)updateAvatar:(UIImage *)avatar 
    {
        NSData *imageData = UIImagePNGRepresentation(avatar);
        dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
        dispatch_async(queue, ^{
            XMPPvCardTempModule *vCardTempModule = [[XMPPHandler sharedInstance] xmppvCardTempModule];
            XMPPvCardTemp *myVcardTemp = [vCardTempModule myvCardTemp];
            [myVcardTemp setName:[NSString stringWithFormat:@"%@",name.text]];
            [myVcardTemp setPhoto:imageData];
            [vCardTempModule updateMyvCardTemp:myVcardTemp];
        });
    }
    

    【讨论】:

    • 什么是 XMPPHandler ?
    • XMPPHandler 是您自己的类,其中包含您实例化的 xmpp 模块。
    • 你有'XMPPHandler'的解决方案吗?
    【解决方案2】:

    来自XMPP Core RFC&lt;error type='wait'&gt; 表示:

    等待后重试(错误是暂时的)

    所以您的代码应该等待一段时间并重新发送请求。

    (这是假设您实际上正在发送一个 base64 编码的 JPEG 图像作为您的 vCard 的 BINVAL。来自服务器的回复与您所说的发送的请求不对应,所以我假设您'已经编辑了两者。最好在您的问题中包含确切的请求和回复,但为了简洁起见,将 base64 编码的图像截断为几个字符。)

    【讨论】:

      【解决方案3】:

      #import "XMPPvCardTemp.h"

         - (void)updateAvatar:(UIImage *)avatar{  
        NSData *imageData1 = UIImageJPEGRepresentation(avatar,0.5);
              NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
              NSXMLElement *photoXML = [NSXMLElement elementWithName:@"PHOTO"];
              NSXMLElement *typeXML = [NSXMLElement elementWithName:@"TYPE"stringValue:@"image/jpeg"];
              NSXMLElement *binvalXML = [NSXMLElement elementWithName:@"BINVAL" stringValue:[imageData1 base64Encoding]];
      
              [photoXML addChild:typeXML];
              [photoXML addChild:binvalXML];
              [vCardXML addChild:photoXML];
              XMPPvCardTemp *myvCardTemp = [[[self appDelegate] xmppvCardTempModule]myvCardTemp];
              if (myvCardTemp) {
                  [myvCardTemp setPhoto:imageData1];
                  [[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp
                   :myvCardTemp];
      
              }
              else{
      
                  XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML];
                  [[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:newvCardTemp];
              }
           }
      

      【讨论】:

      • 你应该在 [vCardXML addChild:photoXML] 之后发送 xmpp 元素
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多