(iOS) рекурсивный запрос vCard-temp к серверу jabber? - PullRequest
1 голос
/ 10 января 2012

Я создаю приложение для iphone с xmpframework, все работает нормально, но я хотел бы обновить фотографию своего профиля следующим кодом. и я получил неправильный рекурсивный запрос vCard-temp к серверу. Но картинка обновилась и уведомила всех друзей в моем списке.

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

вывод и пояснение ниже

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"

то, что я обнаружил до сих пор, ниже вызывает эту проблему, но я не могу понять, где я могу это исправить.

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

1 Ответ

2 голосов
/ 13 марта 2012

Я уже давно пытаюсь решить эту проблему.Дайте мне знать, если это работает для вас.Вот мое объяснение:

Каждый раз, когда вы отправляете элемент присутствия через xmppStream, он кэширует его копию в переменной экземпляра «myPresence».

Если вы ищете следующий метод в XMPPStream.m:

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

есть комментарий на 10-20 строк ниже, который говорит:

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

Когда класс XMPPvCardAvatarModule обновляет vcard, он вводит такие вещи, как и (возможность) теги, которые загрязняют обычный элемент присутствия.

Чтобы это исправить, нам нужно очистить эти ненужные теги.Вот часть моего отредактированного кода:

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