2016-11-13 2 views
1

Я использую IOS XMPPFramework для нашего приложения чата, и я создаю группу и добавляю выбранный элемент с приведенным ниже кодом, и получатели успешно присоединяются к группе. И если я запрашиваю список членов этой группы администраторов успешно извлекать участник группы, но члены не могу получить тот же самый список, и вместо этого они получают ошибку ниже:Пользователи не могут получить список участников в комнате muc

<iq xmlns="jabber:client" from="[email protected]" to="[email protected]/15323458207749806891286" id="FF691FF5-D12B-4BAA-AB19-84E7A2B945D4" type="error"><query xmlns="http://jabber.org/protocol/muc#admin"><item affiliation="member"/></query><error code="403" type="auth"><forbidden xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/><text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">Administrator privileges required</text></error></iq> 

Вы можете найти создать и предложить коды ниже:

- (void)xmppRoom:(XMPPRoom*)sender didFetchMembersList:(NSArray *)items 
{ 
    CLS_LOG(@"Received MemberList: %@",items); 
    if (sender.inviteMemberList) { 
     if ([sender.inviteMemberList count]) { 

      for (NSString *user in sender.inviteMemberList) { 
       [sender inviteUser:[XMPPJID jidWithString:user] withMessage:nil]; 
      } 


      CLS_LOG(@"Adding Members To Group %@",sender.inviteMemberList); 
      XMPPIQ *addMemberIQ = [XMPPIQ addMembersToGroup:sender.inviteMemberList withElementId:[self generateMessageID] andNick:sender.nickName andGroupJid:[sender.roomJID bare]]; 
      CLS_LOG(@"Sending IQ To Add Member: %@",addMemberIQ); 
      [xmppStream sendElement:addMemberIQ]; 
      sender.inviteMemberList = nil; 
     } 
    } 


} 

+ (nonnull instancetype) addMembersToGroup:(NSArray *)memberList withElementId:(NSString*)elementId andNick:(NSString*)nick andGroupJid:(NSString*)groupJid 
{ 
    NSXMLElement *queryElement = [self elementWithName:@"query" xmlns:XMPPMUCAdminNamespace]; 

    for (NSString *member in memberList) { 
     NSXMLElement *itemElement = [self elementWithName:@"item"]; 
     [itemElement addAttributeWithName:@"affiliation" stringValue:@"member"]; 
     [itemElement addAttributeWithName:@"jid" stringValue:member]; 

     [queryElement addChild:itemElement]; 
    } 


    return [self iqWithType:@"set" to:[XMPPJID jidWithString:groupJid] elementID:elementId child:queryElement]; 
} 

[EDIT] Вы также можете найти мою комнату конфигурации в поле ниже XML:

<?xml version="1.0" encoding="UTF-8"?> 
<x xmlns="jabber:x:data" type="form"> 
    <title>Configuration of room [email protected]</title> 
    <field type="hidden" var="FORM_TYPE"> 
     <value>http://jabber.org/protocol/muc#roomconfig</value> 
    </field> 
    <field type="text-single" label="Room title" var="muc#roomconfig_roomname"> 
     <value>osmannn</value> 
    </field> 
    <field type="text-single" label="Room description" var="muc#roomconfig_roomdesc"> 
     <value /> 
    </field> 
    <field type="boolean" label="Make room persistent" var="muc#roomconfig_persistentroom"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Make room public searchable" var="muc#roomconfig_publicroom"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Make participants list public" var="public_list"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Make room password protected" var="muc#roomconfig_passwordprotectedroom"> 
     <value>0</value> 
    </field> 
    <field type="text-private" label="Password" var="muc#roomconfig_roomsecret"> 
     <value /> 
    </field> 
    <field type="list-single" label="Maximum Number of Occupants" var="muc#roomconfig_maxusers"> 
     <value>200</value> 
     <option label="5"> 
     <value>5</value> 
     </option> 
     <option label="10"> 
     <value>10</value> 
     </option> 
     <option label="20"> 
     <value>20</value> 
     </option> 
     <option label="30"> 
     <value>30</value> 
     </option> 
     <option label="50"> 
     <value>50</value> 
     </option> 
     <option label="100"> 
     <value>100</value> 
     </option> 
     <option label="200"> 
     <value>200</value> 
     </option> 
    </field> 
    <field type="list-single" label="Present real Jabber IDs to" var="muc#roomconfig_whois"> 
     <value>anyone</value> 
     <option label="moderators only"> 
     <value>moderators</value> 
     </option> 
     <option label="anyone"> 
     <value>anyone</value> 
     </option> 
    </field> 
    <field type="list-multi" label="Roles for which Presence is Broadcasted" var="muc#roomconfig_presencebroadcast"> 
     <value>moderator</value> 
     <value>participant</value> 
     <value>visitor</value> 
     <option label="Moderator"> 
     <value>moderator</value> 
     </option> 
     <option label="Participant"> 
     <value>participant</value> 
     </option> 
     <option label="Visitor"> 
     <value>visitor</value> 
     </option> 
    </field> 
    <field type="boolean" label="Make room members-only" var="muc#roomconfig_membersonly"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Make room moderated" var="muc#roomconfig_moderatedroom"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Default users as participants" var="members_by_default"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Allow users to change the subject" var="muc#roomconfig_changesubject"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Allow users to send private messages" var="allow_private_messages"> 
     <value>1</value> 
    </field> 
    <field type="list-single" label="Allow visitors to send private messages to" var="allow_private_messages_from_visitors"> 
     <value>anyone</value> 
     <option label="nobody"> 
     <value>nobody</value> 
     </option> 
     <option label="moderators only"> 
     <value>moderators</value> 
     </option> 
     <option label="anyone"> 
     <value>anyone</value> 
     </option> 
    </field> 
    <field type="boolean" label="Allow users to query other users" var="allow_query_users"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Allow users to send invites" var="muc#roomconfig_allowinvites"> 
     <value>0</value> 
    </field> 
    <field type="boolean" label="Allow visitors to send status text in presence updates" var="muc#roomconfig_allowvisitorstatus"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Allow visitors to change nickname" var="muc#roomconfig_allowvisitornickchange"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Allow visitors to send voice requests" var="muc#roomconfig_allowvoicerequests"> 
     <value>1</value> 
    </field> 
    <field type="boolean" label="Allow subscription" var="muc#roomconfig_allow_subscription"> 
     <value>1</value> 
    </field> 
    <field type="text-single" label="Minimum interval between voice requests (in seconds)" var="muc#roomconfig_voicerequestmininterval"> 
     <value>1800</value> 
    </field> 
    <field type="jid-multi" label="Exclude Jabber IDs from CAPTCHA challenge" var="muc#roomconfig_captcha_whitelist" /> 
</x> 

Можете ли вы помочь мне с этой проблемой?

[EDIT 2:] Я изменил свой код, как в приведенном ниже коде. И я также сделал конфигурацию с тобой, Но все тот же результат. Я что-то пропустил на стороне сервера?

- (void)xmppRoom:(XMPPRoom *)sender didFetchConfigurationForm:(NSXMLElement *)configForm{ 

     NSXMLElement *newConfig = [configForm copy]; 
     NSArray* fields = [newConfig elementsForName:@"field"]; 
     for (NSXMLElement *field in fields) { 
      NSString *var = [field attributeStringValueForName:@"var"]; 

      if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) { 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 

      }else if ([var isEqualToString:@"muc#roomconfig_roomname"]){ 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:sender.groupName]]; 

      } 
      else if ([var isEqualToString:@"muc#roomconfig_publicroom"]){ 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"0"]]; 
      } 
      else if ([var isEqualToString:@"muc#roomconfig_whois"]) { 
       [field removeChildAtIndex:0]; 
       [field insertChild:[NSXMLElement elementWithName:@"value" stringValue:@"anyone"] atIndex:0]; 
      } 
      else if ([var isEqualToString:@"muc#roomconfig_allow_subscription"]) { 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
      } 
      else if ([var isEqualToString:@"muc#roomconfig_membersonly"]){ 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
      } 
      else if ([var isEqualToString:@"public_list"]){ 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
      } 
      else if ([var isEqualToString:@"muc#roomconfig_allowinvites"]){ 
       [field removeChildAtIndex:0]; 
       [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
      } 
     } 
     CLS_LOG(@"Sending Configuration: %@",newConfig); 
     [sender configureRoomUsingOptions:newConfig]; 


     if (sender.inviteMemberList) { 
      CLS_LOG(@"Adding Members To Group %@",sender.inviteMemberList); 
      XMPPIQ *addMemberIQ = [XMPPIQ addMembersToGroup:sender.inviteMemberList withElementId:[self generateMessageID] andNick:sender.nickName andGroupJid:[sender.roomJID bare]]; 
      CLS_LOG(@"Sending IQ To Add Member: %@",addMemberIQ); 
      [xmppStream sendElement:addMemberIQ]; 
      [sender fetchMembersList]; 

     } 

} 

- (void)xmppRoom:(XMPPRoom*)sender didFetchMembersList:(NSArray *)items{ 

    CLS_LOG(@"Fetched Members: %@",items); 

    if (sender.inviteMemberList) { 
     if ([sender.inviteMemberList count]) { 

      for (NSString *user in sender.inviteMemberList) { 
       [sender inviteUser:[XMPPJID jidWithString:user] withMessage:nil]; 
      } 


      sender.inviteMemberList = nil; 
     } 
    } 

} 

ответ

1

Убедитесь, что вы установите muc#roomconfig_whois в anyone при настройке комнаты.

<field 
      label='Who May Discover Real JIDs?' 
      type='list-single' 
      var='muc#roomconfig_whois'> 
     <option label='Moderators Only'> 
      <value>moderators</value> 
     </option> 
     <option label='Anyone'> 
      <value>anyone</value> 
     </option> 
    </field> 

http://xmpp.org/extensions/xep-0045.html#roomconfig

[Отредактировано 2]:

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

Не могли бы вы попытаться изменить поток. Сначала добавьте всех участников, а затем пригласите. В противном случае, когда пользователь получит приглашение, члены могут быть недоступны на сервере Xmpp.

Вот что я сделал:

  • Регистрация номер, (если номер не существует, сервер будет создавать его).
  • В xmppRoomDidCreate, выберите конфигурационную форму.
  • Отправить форму конфигурации, и Добавить все члены сразу после.
  • В didConfigure отправьте приглашения.

Поток медленный, я предлагаю вам добавить настройки в качестве параметров по умолчанию в mod_muc. Просто убедитесь, что добавьте участников перед отправкой приглашения.

[Изменено]:

Вот моя форма при настройке номер:

<x xmlns=\"jabber:x:data\" type=\"form\"> 
     <title>Configuration of room [email protected]</title> 
     <field type=\"hidden\" var=\"FORM_TYPE\"> 
     <value>http://jabber.org/protocol/muc#roomconfig</value> 
     </field> 
     <field type=\"text-single\" label=\"Room title\" var=\"muc#roomconfig_roomname\"> 
     <value></value> 
     </field> 
     <field type=\"text-single\" label=\"Room description\" var=\"muc#roomconfig_roomdesc\"> 
     <value></value> 
     </field> 
     <field type=\"boolean\" label=\"Make room persistent\" var=\"muc#roomconfig_persistentroom\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Make room public searchable\" var=\"muc#roomconfig_publicroom\"> 
     <value>0</value> 
     </field> 
     <field type=\"boolean\" label=\"Make participants list public\" var=\"public_list\"> 
     <value>0</value> 
     </field> 
     <field type=\"boolean\" label=\"Make room password protected\" var=\"muc#roomconfig_passwordprotectedroom\"> 
     <value>0</value> 
     </field> 
     <field type=\"text-private\" label=\"Password\" var=\"muc#roomconfig_roomsecret\"> 
     <value></value> 
     </field> 
     <field type=\"list-single\" label=\"Maximum Number of Occupants\" var=\"muc#roomconfig_maxusers\"> 
     <value>200</value> 
     <option label=\"5\"> 
      <value>5</value> 
     </option> 
     <option label=\"10\"> 
      <value>10</value> 
     </option> 
     <option label=\"20\"> 
      <value>20</value> 
     </option> 
     <option label=\"30\"> 
      <value>30</value> 
     </option> 
     <option label=\"50\"> 
      <value>50</value> 
     </option> 
     <option label=\"100\"> 
      <value>100</value> 
     </option> 
     <option label=\"200\"> 
      <value>200</value> 
     </option> 
     </field> 
     <field type=\"list-single\" label=\"Present real Jabber IDs to\" var=\"muc#roomconfig_whois\"> 
     <option label=\"moderators only\"> 
      <value>moderators</value> 
     </option> 
     <option label=\"anyone\"> 
      <value>anyone</value> 
     </option> 
     <value>anyone</value> 
     </field> 
     <field type=\"list-multi\" label=\"Roles for which Presence is Broadcasted\" var=\"muc#roomconfig_presencebroadcast\"> 
     <value>moderator</value> 
     <value>participant</value> 
     <value>visitor</value> 
     <option label=\"Moderator\"> 
      <value>moderator</value> 
     </option> 
     <option label=\"Participant\"> 
      <value>participant</value> 
     </option> 
     <option label=\"Visitor\"> 
      <value>visitor</value> 
     </option> 
     </field> 
     <field type=\"boolean\" label=\"Make room members-only\" var=\"muc#roomconfig_membersonly\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Make room moderated\" var=\"muc#roomconfig_moderatedroom\"> 
     <value>0</value> 
     </field> 
     <field type=\"boolean\" label=\"Default users as participants\" var=\"members_by_default\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Allow users to change the subject\" var=\"muc#roomconfig_changesubject\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Allow users to send private messages\" var=\"allow_private_messages\"> 
     <value>1</value> 
     </field> 
     <field type=\"list-single\" label=\"Allow visitors to send private messages to\" var=\"allow_private_messages_from_visitors\"> 
     <value>anyone</value> 
     <option label=\"nobody\"> 
      <value>nobody</value> 
     </option> 
     <option label=\"moderators only\"> 
      <value>moderators</value> 
     </option> 
     <option label=\"anyone\"> 
      <value>anyone</value> 
     </option> 
     </field> 
     <field type=\"boolean\" label=\"Allow users to query other users\" var=\"allow_query_users\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Allow users to send invites\" var=\"muc#roomconfig_allowinvites\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Allow visitors to send status text in presence updates\" var=\"muc#roomconfig_allowvisitorstatus\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Allow visitors to change nickname\" var=\"muc#roomconfig_allowvisitornickchange\"> 
     <value>1</value> 
     </field> 
     <field type=\"boolean\" label=\"Allow visitors to send voice requests\" var=\"muc#roomconfig_allowvoicerequests\"> 
     <value>1</value> 
     </field> 
     <field type=\"text-single\" label=\"Minimum interval between voice requests (in seconds)\" var=\"muc#roomconfig_voicerequestmininterval\"> 
     <value>1800</value> 
     </field> 
     <field type=\"jid-multi\" label=\"Exclude Jabber IDs from CAPTCHA challenge\" var=\"muc#roomconfig_captcha_whitelist\"></field> 
    </x> 

Как вы можете видеть, есть некоторые различия по пунктам:

  • MUC# roomconfig_publicroom
  • public_list
  • muC# roomconfig_moderatedroom
  • MUC# roomconfig_allowinvites

я попытался установить "MUC# roomconfig_moderatedroom" 1, до сих пор все участники могут получить список участников. Не уверен, что произошло на вашей стороне.

+0

Я изменил это кому угодно, но результат тот же. Вы можете видеть, что моя конфигурация xml на отредактированной странице – tolgatanriverdi

+0

отредактировала мое сообщение – tolgatanriverdi

+0

действительно странно, возможно, вы заархивируете весь свой связанный код, от createRoom до InviteUser и ваш файл конфигурации сервисов и поделитесь им со мной, я попытаюсь выяснить. Никогда не получай свою проблему. – dichen

0

Позвольте мне добавить мой рабочий код в swift, вы можете проверить, есть ли разница. Извините, не мог больше.

func onButtonClicked(_ button: UIButton) { 

     let roomJIDStr = theRoomJidStr // get the roomJid 
     self.xmppRoom = joinRoom(with: roomJIDStr, delegate: self) 
    } 

    func joinRoom(with jidString: String, delegate: XMPPRoomDelegate) -> XMPPRoom { 

     let roomJID = XMPPJID(string: jidString) 
     let roomStorage = XMPPRoomCoreDataStorage.sharedInstance() 

     let room = XMPPRoom(roomStorage: roomStorage, jid: roomJID, dispatchQueue: DispatchQueue.main)! 

     room.activate(xmppStream) 

     room.addDelegate(delegate, delegateQueue: DispatchQueue.main) 

     room.join(usingNickname: xmppStream.myJID.user, history: nil) 

     return room 
    } 

    public func xmppRoomDidCreate(_ sender: XMPPRoom!) { 
     print("xmppRoomDidCreate") 

     // Accept default settings 
     let config = DDXMLElement(name: "x", xmlns: "jabber:x:data") 
     sender.configureRoom(usingOptions: config) 

     // Add members 
     let query = DDXMLElement(name: "query", xmlns: XMPPMUCAdminNamespace) 
     if let contacts = selectedContacts { 

      for c in contacts { 

       let item = DDXMLElement(name: "item") 
       item.addAttribute(withName: "affiliation", stringValue: "member") 
       item.addAttribute(withName: "jid", stringValue: c.xmppAccount!) 

       query?.addChild(item) 
      } 
     } 

     let id = XMPPStream.generateUUID() 
     let to = sender.roomJID 
     let iq = XMPPIQ(type: "set", to: to, elementID: id, child: query) 

     chatManager.xmppStream.send(iq) 
    } 

Предпосылками:

  • я установить некоторые параметры как параметры mod_muc по умолчанию, так что не нужно настроить комнату. не

    mod_muc: ## host: "[email protected]@" access: - allow access_admin: - allow: admin access_create: muc_create access_persistent: muc_create history_size: 0 default_room_options: allow_user_invites: true anonymous: false members_by_default: true members_only: true moderated: false persistent: true public: false public_list: false

  • Там будет не Приглашаю в моем коде, я добавляю их непосредственно в список участников. И используйте ejabberd_mod_offline_post для Push Notification. Когда владелец отправляет первое сообщение, все остальные участники получат push и начинают получать список участников.

+0

Что произойдет, если владелец не отправит какое-либо сообщение и просто создаст комнату? В этом случае получатели не знают, какая группа создана правильно? – tolgatanriverdi

+0

В моем приложении комната создается, только если пользователь отправляет первое сообщение. Но вы правы, это зависит от поведения приложения. – dichen

+0

@tolgatanriverdi - не могли бы вы поделиться тем, что было проблемой для стручка? У меня такая же проблема (хотя я не использую стручки, но напрямую интегрирую код), но все равно могу помочь в том, что происходит ... Большое спасибо. – vikram17000

Смежные вопросы