Pregunta

Estoy creando una aplicación para iPhone con XMPFramework, todo funciona bien, pero me gustaría actualizar mi foto de perfil con el siguiente código. Y obtuve una solicitud de VCARD-TEMP recursiva incorrecta al servidor. Pero la imagen se actualizó y notificó a todos los amigos en mi lista.

//I clicked on the button
-(void)updatevCardButtonClicked{
   XMPPvCardTemp *vCardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
   NSLog(@"my vCardTemp: %@", vCardTemp);
   NSData *tempImage = [self getDataFromImage:[self resizeImage:userImage]];
   [vCardTemp setPhoto: tempImage];
   [[[self appDelegate] xmppvCardTempModule]updateMyvCardTemp:vCardTemp];
}

salida y explicación a continuación

my vCardTemp: *nil description*
MyApp[60625:6c1b] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0)
MyApp[60625:207] MyAppDelegate: xmppStream:didReceiveIQ: - E49C843A-5A05-4148-A4CF-B400062A83C0
MyApp[60625:207] MyAppDelegate: xmppStream:didReceivePresence: - <presence xmlns="jabber:client"    from="myJabberAccount@127.0.0.1/1948110991326183732515886" to="myJabberAccount@127.0.0.1/1948110991326183732515886">
  <status>At  work</status>
  <x xmlns="vcard-temp:x:update">
        <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
  </x>
  <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
  <x xmlns="vcard-temp:x:update">
        <photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo></x><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
  </presence>
MyApp[60625:5323] XMPPRosterCoreDataStorage: handlePresence:xmppStream:

//repeat start from here, and the DidReceivePresence: will grow into tons of lines with the samthing
MyApp[60625:207] XMPPRosterCoreDataStorage: userForJID:xmppStream:managedObjectContext:
MyApp[60625:1e0b] XMPPRosterCoreDataStorage: userForJID:xmppStream:managedObjectContext:
MyApp[60625:207] XMPPRosterCoreDataStorage: resourceForJID:xmppStream:managedObjectContext:
MyApp[60625:5323] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0)
MyApp[60625:207] MyAppDelegate: xmppStream:didReceiveIQ: - (null)
MyApp[60625:1e0b] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0)
MyApp[60625:207] MyAppDelegate: xmppStream:didReceivePresence: - <presence xmlns="jabber:client" from="myJabberAccount@127.0.0.1/1948110991326183732515886" to="myJabberAccount@127.0.0.1/1948110991326183732515886">
 <status>At work</status>
 <x xmlns="vcard-temp:x:update">
     <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
 </x>
 <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
 <x xmlns="vcard-temp:x:update">
     <photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo>
 </x>
 <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
 <x xmlns="vcard-temp:x:update">
     <photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo>
 </x>
 <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4=">
 </c>
 </presence>

//repeat the above in the rest of the output with more and more "vcard-temp:x:update"

Lo que encontré hasta ahora, lo siguiente causa este problema, pero no puedo entender dónde puedo solucionarlo.

//i found that these two "SEND" cause the problem, the app just keep sending these two 
SEND: <iq type="get" to="myJabberAccount@127.0.0.1"><vCard xmlns="vcard-temp"/></iq>
SEND: <presence>
    <x xmlns="vcard-temp:x:update">
        <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
    </x>
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
    <x xmlns="vcard-temp:x:update">
        <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
    </x>
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
    <x xmlns="vcard-temp:x:update">
        <photo>f93ee3918c7baaf095edb9f6bede892c603161af</photo>
    </x>
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
    <x xmlns="vcard-temp:x:update">
        <photo>f93ee3918c7baaf095edb9f6bede892c603161af</photo>
    </x>
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
</presence>
 //this presence keep growing as you can see the repeated parts
¿Fue útil?

Solución

He estado tratando de abordar este problema durante bastante tiempo. Hazme saber si esto funciona para ti. Aquí está mi explicación:

Cada vez que envía un elemento de presencia a través de XMPPStream, almacena una copia bajo la variable de instancia "mypresence".

Si busca el siguiente método en xmppstream.m:

- (void)continueSendElement:(NSXMLElement *)element withTag:(long)tag

Hay un comentario sobre 10-20 líneas hacia abajo que dice:

// Update myPresence if this is a normal presence element.
// In other words, ignore presence subscription stuff, MUC room stuff, etc.

Cuando la clase XMPPVCARDAVATARMODULE actualiza el VCard, presenta cosas como elu003Cx> y elu003Cc> (Capacidad) Etiquetas que contamina el elemento de presencia normal.

Para solucionar esto, necesitamos limpiar esas etiquetas innecesarias. Aquí hay una sección de mi código editado:

else if ([element isKindOfClass:[XMPPPresence class]])
{
    // Update myPresence if this is a normal presence element.
    // In other words, ignore presence subscription stuff, MUC room stuff, etc.

    XMPPPresence *presence = (XMPPPresence *)element;

    // We use the built-in [presence type] which guarantees lowercase strings,
    // and will return @"available" if there was no set type (as available is implicit).

    NSString *type = [presence type];
    if ([type isEqualToString:@"available"] || [type isEqualToString:@"unavailable"])
    {
        NSArray *vCardXElem = [presence elementsForName:@"x"];
        NSArray *capabilitiesHash = [presence elementsForName:@"c"];

        for (NSXMLElement *x in vCardXElem)
        {
            [presence removeChildAtIndex:[x index]];
        }

        for (NSXMLElement *c in capabilitiesHash)
        {
            [presence removeChildAtIndex:[c index]];
        }

        if ([presence toStr] == nil && myPresence != presence)
        {
            myPresence = presence;
        }
    }

    [multicastDelegate xmppStream:self didSendPresence:(XMPPPresence *)element];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top