Как получить друзей из XMPPRoster?

Я пытаюсь так:

XMPPRosterMemoryStorage *xmppRosterMemStorage = [[XMPPRosterMemoryStorage alloc] init];
XMPPRoster *xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterMemStorage
                                         dispatchQueue:dispatch_get_main_queue()];
[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = true;
xmppRoster.autoFetchRoster = true;
[xmppRoster activate:xmppStream];
[xmppRoster fetchRoster];

Но xmppRoster пуст. Почему?


person solid    schedule 01.04.2014    source источник
comment
Я также использую xmppRosterDidPopulate. Но этот метод отправил один раз после обеденного приложения. В комментариях напишите: Уведомление о том, что ростер получил состав с сервера. Если для parent.autoFetchRoster установлено значение YES, список будет автоматически загружен после аутентификации пользователя. Но этого не произошло   -  person solid    schedule 01.04.2014


Ответы (3)


Элементы реестра хранятся в [xmppRosterMemStorage mainThreadManagedObjectContext], вы можете использовать его с NSFetchedResultsController в качестве источника данных для вашего UITableView, см. пример iPhoneXMPP в исходниках XMPPFramework.

person vitalyster    schedule 01.04.2014
comment
Могу ли я получать элементы списка автоматически? Например, если какой-либо пользователь удалил или добавил из/в список, отправил какую-либо функцию - person solid; 01.04.2014
comment
Когда вы отправляете xmppRoster activate:xmppStream, элементы списка автоматически извлекаются, сохраняются в xmppRosterMemStorage и xmppRoster автоматически отслеживают изменения (добавления или удаления) для вас. - person vitalyster; 01.04.2014
comment
Я пытаюсь сделать так, как вы говорите - используйте NSFetchedResultsController, но ничего. Теперь я могу добавить пользователя в список, удалить, принять запрос на дружбу. Я хочу понять, как определить, переходит ли пользователь в автономный режим, онлайн, удаляет, добавляет и просматривает новый список списков в UITableViewController. Извините за мой английский. Вы можете дать мне простой рабочий код? - person solid; 01.04.2014
comment
Просто откройте пример iPhoneXMPP из XMPPFramework — и вы увидите это в действии — UITableViewController с NSFetchedResultsController, который показывает вам разделы Online, Away, Offline и т. д., и он будет корректно обновляться, когда ваши контакты изменяют свой статус. - person vitalyster; 01.04.2014
comment
Ok. Большое спасибо. Пробую сделать все как в iPhonwXMPP. В методе fetchedResultController переменная mod == nil. Это произошло потому, что метод [xmppRosterStorage mainThread...] закомментирован. Почему? Что мне делать? - person solid; 02.04.2014
comment
mainThreadManagedObjectContext унаследован от XMPPCoreDataStorage, поэтому, когда вы правильно инициализируете XMPPRoster с экземпляром XMPPRosterMemoryStorage или XMPPRosterCoreDataStorage - все должно работать нормально. Вы пытались запустить пример iPhoneXMPP как есть? - person vitalyster; 02.04.2014
comment
Я это сделал! Спасибо за помощь - person solid; 02.04.2014
comment
У меня есть база данных на сервере. Он хранит данные пользователя, такие как имя, фамилия, фотография, статус и т. д. Теперь я получаю XMPPUserCoreDataSorage, который содержит jid. Я хочу получить данные пользователя из моей базы данных о каждом пользователе в моем списке. Но я не хочу делать запрос каждый раз, когда приятель уходит в офлайн или удаляется. Как это сделать? - person solid; 02.04.2014

Если вы не хотите использовать NSFetchedResultsController, вы можете получить JID вашего списка, вызвав jidsForXMPPStream в объекте хранения списка.

Вот как я его использовал -

- (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender{
    [appDelegate.mContactHandler clearContacts];
    NSArray* jids = [mXmppRosterStorage jidsForXMPPStream:self.xmppStream];
    for (int i=0; i<jids.count; i++)
    {
        RosterContact* contact = [[RosterContact alloc]init];
        contact.jid = [jids objectAtIndex:i];
        [appDelegate.mContactHandler addContact:contact];
    }
    [self postResultNotification:kReload withResult:nil];
}

Я использовал метод делегата XMPPRoster, чтобы узнать, когда закончилась загрузка списка. Затем я извлекаю jid из хранилища и создаю свой собственный объект RosterContact, который является просто пользовательским классом, который я создал для хранения контактных данных. Затем я публикую уведомление, чтобы перезагрузить табличное представление, в котором я показываю список контактов.

Вот моя декларация о ростере -

mXmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];

mXmppRoster = [[XMPPRoster alloc] initWithRosterStorage:mXmppRosterStorage];

mXmppRoster.autoFetchRoster = YES;
mXmppRoster.autoAcceptKnownPresenceSubscriptionRequests = YES;

Я надеюсь, что это будет полезно.

person noob    schedule 20.03.2015

Вот мое решение для быстрого.

https://stackoverflow.com/a/50151198/2781720

func getList() {
  let query = try! XMLElement(xmlString: "<query xmlns='http://jabber.org/protocol/disco#items' node='all users'/>")
  let iq = XMPPIQ(type: "get", to: XMPPJID(string: "Your Host Name"), elementID: xmppStream.generateUUID(), child: query)
  iq?.addAttribute(withName: "id", stringValue: "get")
  xmppStream.send(iq)
}

extension YourClassName: XMPPRosterDelegate {

   func xmppRosterDidEndPopulating(_ sender: XMPPRoster!) {
     if let jids = xmppRoster.xmppRosterStorage.jids(for: xmppStream) as? [XMPPJID] {
       print("JIDS: \(String(describing: jids))")
       for item in jids {
         print(item.user)
       }
     }
   }
 }

Надеюсь это поможет!

person ZeroOne    schedule 03.05.2018