Добавить нескольких пользователей в реестр XMPP

Как я могу добавить нескольких пользователей в свой список? Прямо сейчас я могу добавить одного пользователя за раз. Но теперь я должен синхронизировать контакт устройства с XMPP. Используя бэкэнд API, я могу отфильтровать контакты, которые зарегистрированы в приложении. Теперь добавление их одного в список занимает слишком много времени.

Так есть ли более быстрый способ добавить несколько контактов в список?

Я уже прошел через много подобных вопросов, но они не помогают.

Является ли фильтрация контактов устройства с внутренним API хорошим подходом, или я должен заняться чем-то другим?

1 ответ

Решение

XMPP - это полноценный протокол на основе XML, даже если у библиотеки нет некоторых методов, мы можем расширять библиотеку в соответствии с нашими потребностями. Итак, как вы сказали, что вы хотите добавить несколько списков, есть два подхода к достижению этого: 1. Добавьте какой-либо метод в вашу клиентскую библиотеку XMPP или в ваше приложение и добавьте несколько элементов списка, как показано ниже:

- (void)addUsers:(NSArray<XMPPJID *> *)jids withNickname:(NSArray<NSString *> *)optionalNames groups:(NSArray *)groups {

if (jids == nil) return;
XMPPJID *myJID = xmppStream.myJID;



// Add the buddy to our roster
//
// <iq type="set">
//   <query xmlns="jabber:iq:roster">
//     <item jid="bareJID" name="optionalName">
//      <group>family</group>
//     </item>
//   </query>
// </iq>

XMPPIQ *iq = [XMPPIQ iqWithType:@"set"];

for (int i = 0; i < jids.count; i++) {

    XMPPJID *jid = jids[0];
    if ([myJID isEqualToJID:jid options:XMPPJIDCompareBare])
    {
        // You don't need to add yourself to the roster.
        // XMPP will automatically send you presence from all resources signed in under your username.
        //
        // E.g. If you sign in with robbiehanson@deusty.com/home you'll automatically
        //    receive presence from robbiehanson@deusty.com/work

        XMPPLogInfo(@"%@: %@ - Ignoring request to add myself to my own roster", [self class], THIS_METHOD);
        continue;
    }
    NSXMLElement *item = [NSXMLElement elementWithName:@"item"];
    [item addAttributeWithName:@"jid" stringValue:[jid bare]];
    NSString *optionalName = optionalNames[i];
    if(optionalName)
    {
        [item addAttributeWithName:@"name" stringValue:optionalName];
    }

    for (NSString *group in groups) {
        NSXMLElement *groupElement = [NSXMLElement elementWithName:@"group"];
        [groupElement setStringValue:group];
        [item addChild:groupElement];
    }

    NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
    [query addChild:item];
    [iq addChild:query];
}

[xmppStream sendElement:iq];

}

  1. Напишите некоторые API-интерфейсы сервисов с некоторыми сервисами rabbitmq на стороне сервера, и он вставит несколько пользователей в список, а сервер XMPP сообщит вам об обновлении реестра. Я надеюсь, что этот ответ поможет вам.

Я пробовал отправить эту строфу:

<iq type="set" id="15-47" to="940588870@localhost">
    <query xmlns="jabber:iq:roster" ver="1116247190">
        <item jid="1234@localhost" name="user1" subscription="both">
            <group>acceptance</group>
        </item>
        <item jid="7663@localhost" name="user2" subscription="both">
            <group>acceptance</group>
        </item>
        <item jid="9876@localhost" name="user3" subscription="both">
            <group>acceptance</group>
        </item>
        <item jid="1111@localhost" name="user4" subscription="both">
            <group>acceptance</group>
        </item>
    </query>
</iq>

я получил

this error : 00:32:03.163 [Smack Cached Executor] WARN  org.jivesoftware.smack.roster.Roster.handleIQRequest(1739) -  - Ignoring roster push with not exactly one entry. size=4

При дальнейшей проверке в руководстве XMPP говорится, что пакет с пространством имен "jabber:IQ:roster" и более чем одним элементом элемента внутри элемента запроса рассматривается как случай ошибки.

Другие вопросы по тегам