XMPP书签的自动加入选项不起作用

Car*_*ine 5 bookmarks xmpp ejabberd publish-subscribe xmppframework

我正在尝试使用XEP-0048-书签(http://xmpp.org/extensions/xep-0048.html)自动加入会议室。

我正在使用RobbieHanson XMPPFramework,ejabberd v13.x到目前为止,我已经能够使用以下代码将书签添加到房间中:

-(void) createBookmarkforRoom:(NSString *)roomJid {
    NSXMLElement *nick = [NSXMLElement elementWithName:@"nick" stringValue:@"Marge"];

    NSXMLElement *conference = [DDXMLNode elementWithName:@"conference"];
    [conference addAttributeWithName:@"name" stringValue:@"BookmarkName"];
    [conference addAttributeWithName:@"autojoin" stringValue:@"true"];
    [conference addAttributeWithName:@"jid" stringValue:roomJid];

    [conference addChild:nick];

    NSXMLElement *storage =[DDXMLNode elementWithName:@"storage"];
    [storage addAttributeWithName:@"xmlns" stringValue:@"storage:bookmarks"];

    [storage addChild:conference];

    NSDictionary *options = [NSDictionary dictionaryWithObjects:@[@"pubsub#persist_items",@"pubsub#access_model"]
                                                    forKeys:@[@"true",@"whitelist"]];

    [self.publishSubscribeModule publishToNode:@"storage:bookmarks"
                                     entry:(NSXMLElement *)storage
                                withItemID:(NSString *)@"current"
                                   options:(NSDictionary *)options];

}
Run Code Online (Sandbox Code Playgroud)

以下xml已成功发送:

<iq type="set" id="2749368B-E365-45D6-A4B0-2F79DC6F4747">
   <pubsub xmlns="http://jabber.org/protocol/pubsub">
      <publish node="storage:bookmarks">
         <item id="current">
            <storage xmlns="storage:bookmarks">
               <conference name="BookmarkName" autojoin="true" jid="testroom@conference.mydomain.com">
                  <nick>Marge</nick>
               </conference>
            </storage>
         </item>
      </publish>
      <publish-options>
         <x xmlns="jabber:x:data" type="submit">
            <field var="FORM_TYPE" type="hidden">
               <value>http://jabber.org/protocol/pubsub#publish-options</value>
            </field>
            <field var="true">
               <value>pubsub#persist_items</value>
            </field>
            <field var="whitelist">
               <value>pubsub#access_model</value>
            </field>
         </x>
      </publish-options>
   </pubsub>
</iq>
Run Code Online (Sandbox Code Playgroud)

我收到:

<iq xmlns="jabber:client" from="marge@mydomain.com" to="marge@mydomain.com/41045582821403862604272126" id="2749368B-E365-45D6-A4B0-2F79DC6F4747" type="result">
   <pubsub xmlns="http://jabber.org/protocol/pubsub">
      <publish node="storage:bookmarks">
         <item id="current" />
      </publish>
   </pubsub>
</iq>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下代码获取书签时:

-(void)requestBookmarks {
    DDXMLElement *pubsub = [DDXMLElement elementWithName:@"pubsub" xmlns:@"http://jabber.org/protocol/pubsub"];

    DDXMLElement *items = [DDXMLElement elementWithName:@"items"];
    [items addAttributeWithName:@"node" stringValue:@"storage:bookmarks"];

    [pubsub addChild:items];

    XMPPIQ *iqBookmark = [XMPPIQ iqWithType:@"get" elementID:@"retrievebookmark10" child:pubsub];
    [self.stream sendElement:iqBookmark];
}
Run Code Online (Sandbox Code Playgroud)

它发送以下xml:

<iq type="get" id="retrievebookmark10">
    <pubsub xmlns="http://jabber.org/protocol/pubsub">
        <items node="storage:bookmarks"/>
    </pubsub>
</iq>
Run Code Online (Sandbox Code Playgroud)

我收到:

<iq xmlns="jabber:client" from="marge@mydomain.com" to="marge@mydomain.com/41045582821403862604272126" id="retrievebookmark10" type="result">
    <pubsub xmlns="http://jabber.org/protocol/pubsub">
        <items node="storage:bookmarks">
            <item id="current">
                <storage xmlns="storage:bookmarks">
                    <conference name="BookmarkName" autojoin="true" jid="testroom@conference.mydomain.com">
                        <nick>Marge</nick>
                    </conference>
                </storage>
            </item>
        </items>
    </pubsub>
</iq>
Run Code Online (Sandbox Code Playgroud)

因此,看来我可以成功存储书签并检索它们。但是,当我尝试在会议室中讲话testroom@conference.mydomain.com而没有手动加入时,我收到一个错误消息,说我必须先加入会议室,然后才能在会议室中讲话。如果我(手动)加入房间,那么一切都很好。

在服务器端,我将该mod_pubsub模块与以下选项一起使用:

  mod_pubsub:
   access_createnode: pubsub_createnode
    ## reduces resource comsumption, but XEP incompliant
   ignore_pep_from_offline: true
    ## XEP compliant, but increases resource comsumption
    ## ignore_pep_from_offline: false
   last_item_cache: false
   plugins:
     - "flat"
     - "hometree"
     - "pep" # pep requires mod_caps
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我必须手动加入带有“ auto-join = true”房间的书签。有什么线索吗?