Подтвердить что ты не робот

Как добавить список с режимом подписки "оба"

Я использую smack 3.1.0, и когда я добавляю список, я не могу получить подписку "оба". кто может мне помочь? ниже мой код:

Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
Roster roster = connection.getRoster();
roster.createEntry("[email protected]","me",null)

после выполнения кода, я наблюдал в openfire, что подписка "на"

4b9b3361

Ответ 1

Переписывание @mschonaker ответ будет немного более понятным.

Оба пользователя должны подписаться друг с другом и принять запрос на подписку, который они получили. Позвольте назвать их Алисой и Бобом. Алиса отправляет запрос на подписку Бобу:

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('[email protected]');
connection.sendPacket(subscribe);

Когда Боб получает запрос, он одобряет его:

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo('[email protected]');
connection.sendPacket(subscribed);

Боб может также быть заинтересован в присутствии Алисы, поэтому он подписывается на нее:

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('[email protected]');
connection.sendPacket(subscribe);

И Алисе нужно одобрить запрос Боба:

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo('[email protected]');
connection.sendPacket(subscribed);

Раздел 3.1 RFC6121 является лучшим справочником о том, как это работает.

Ответ 2

Оба пользователя должны подписаться друг с другом. Отправляя строфу подписки присутствия. В Smack:

    Presence presence = new Presence(Presence.Type.subscribe);
    presence.setTo(jid);
    connection.sendPacket(presence);

Раздел 3.1 RFC6121 даст вам семантические данные.

Ответ 3

Хорошо, я много работал над этим пару дней и, наконец, начал работать. Спасибо @Joe Hildebrand, ваш ответ поставил меня на правильный путь, чтобы решить эту проблему. Я реализовал его в режиме ручной подписки (т.е. Пользователю необходимо принять другой запрос пользователя вручную).

Сервер продолжает подталкивать запрос подписки пользователю (после повторного входа в систему), если пользователь не отправил подписанную или отмененную подписку. Итак, что вы можете сделать, это сохранить входящие запросы подписки локально в списке и отобразить это как "список запросов друга" для ручной приемки/отклонения. Если ваше приложение перезапустится (и, следовательно, снова подключится к серверу), сервер снова предложит запросы подписки.

Вот как это работает:

  • Пользователь1 отправляет подписку на пользователя2.
  • Запись реестров автоматически создается в списке User1 (но не в реестре User2).
  • Пользователь2 получает запрос на подписку от User1.
  • Пользователь2 отправляет обратно подписанное присутствие на подписку User2 (User2 > User1).
  • Пользователь2 проверяет, является ли User1 в реестре User2. Пользователь1 не входит в список User2. Пользователь2 отправляет обратно подписку на User1.
  • Запись реестров автоматически создается в реестре User2.
  • Пользователь1 получает доступ к подписке от User2.
  • Пользователь1 проверяет, является ли User2 в списке User1. Пользователь2 находится в списке User1. Пользователь1 отправляет обратно подписанное присутствие на подписку User2 (User2 > User1).

            final Presence newPresence = (Presence) packet;
            final Presence.Type presenceType = newPresence.getType();
            final String fromId = newPresence.getFrom();
            final RosterEntry newEntry = getRoster().getEntry(fromId);
    
            if (presenceType == Presence.Type.subscribe)
            {
                //from new user
                if (newEntry == null)
                {
                    //save request locally for later accept/reject
                    //later accept will send back a subscribe & subscribed presence to user with fromId
                    //or accept immediately by sending back subscribe and unsubscribed right now
                }
                //from a user that previously accepted your request
                else
                {
                    //send back subscribed presence to user with fromId
                }
            }
    

Ответ 4

Если вы используете open fire server, вы также можете использовать плагин User Service, который будет создавать список с подпиской как...

Ответ 5

Та же проблема, с которой я столкнулся, но я получил решение, как подписаться на "оба"

Ниже отправляется подписка на пользователя, когда вы добавили пользователя

 Presence pres = new Presence(Presence.Type.subscribed);
        pres.setPriority(24);
        pres.setMode(Presence.Mode.available);
        pres.setTo(friendJid);

        RoosterConnection.getConnection().sendStanza(pres);

а метод Receive end помещается ниже в классе соединений, а свойство presenceChanged - метод по умолчанию для RosterListener.

 @Override
public void presenceChanged(Presence presence) {
    mBus.post(presence);
    try {
        Presence pres = new Presence(Presence.Type.subscribed);
        pres.setTo(presence.getFrom());
        RoosterConnection.getConnection().sendStanza(pres);
    } catch (SmackException.NotConnectedException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}