Frage

Ich erstelle eine iPhone -App mit XMPFramework, alles funktioniert gut, aber ich möchte mein Profilbild mit dem folgenden Code aktualisieren. Und ich habe eine falsche rekursive VCard-Temp-Anforderung an den Server erhalten. Aber das Bild wurde aktualisiert und alle Freunde in meinem Dienstplan informiert.

//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];
}

Ausgabe und Erklärung unten

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"

Was ich bisher gefunden habe, verursachte dieses Problem, aber ich kann nicht herausfinden, wo ich es beheben kann.

//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
War es hilfreich?

Lösung

Ich habe seit einiger Zeit versucht, dieses Problem anzugehen. Lassen Sie mich wissen, ob dies für Sie funktioniert. Hier ist meine Erklärung:

Immer wenn Sie ein Präsenzelement über XMPPStream senden, zwischengespeichert es eine Kopie davon unter der Instanzvariablen "Mypresence".

Wenn Sie nach der folgenden Methode in xmppstream.m suchen:

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

Es gibt einen Kommentar über 10-20 Zeilen, der steht::

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

Wenn die XMPPVCardavatarmodule -Klasse die VCARD aktualisiert, führt sie Dinge wie die voru003Cx> und dieu003Cc> (Fähigkeit) Tags, die das normale Vorhandenseinelement verschmutzen.

Um dies zu beheben, müssen wir diese unnötigen Tags aufräumen. Hier ist ein Abschnitt meines bearbeiteten Code:

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];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top