Я уже давно пытаюсь решить эту проблему.Дайте мне знать, если это работает для вас.Вот мое объяснение:
Каждый раз, когда вы отправляете элемент присутствия через 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];
}