XMPPFramework - How can I update my own avatar ima

2019-01-24 17:51发布

I am developing an application in that I want to update my avatar image. I am following XEP-0153 guidelines to update my avatar image and I constructed an NSXMLElement correspond to the following code in XEP-0153 and sent that element through 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>

The server responses the following error:

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

Instead of <iq to='juliet@capulet.com' type='result' id='vc1'/>

Please can anyone post the code or the link related to update avatar image? Thanks in advance.

3条回答
可以哭但决不认输i
2楼-- · 2019-01-24 18:12
- (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];
    });
}
查看更多
等我变得足够好
3楼-- · 2019-01-24 18:31

#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];
        }
     }
查看更多
手持菜刀,她持情操
4楼-- · 2019-01-24 18:33

From the XMPP Core RFC, <error type='wait'> means:

retry after waiting (the error is temporary)

so your code should wait a while and re-send the request.

(This is assuming that you are actually sending a base64-encoded JPEG image as the BINVAL of your vCard. The reply from the server doesn't correspond to the request you say you sent, so I'm assuming you've edited both. It would be better to include the exact request and reply in your question, but truncate the base64-encoded image to a few characters for concision.)

查看更多
登录 后发表回答