我创建房间的代码:
XMPPRoomCoreDataStorage *rosterstorage = [[XMPPRoomCoreDataStorage alloc] init];
XMPPRoom *xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:rosterstorage jid:[XMPPJID jidWithString:@"groupchat@xmpp.getkismet.com/groupchat"] dispatchQueue:dispatch_get_main_queue()];

[xmppRoom activate:[[self appDelegate] xmppStream]];
if ([xmppRoom preJoinWithNickname:@"nametoCreateRoom"]) 
{
    NSLog(@"room created");
    [xmppRoom joinRoomUsingNickname:self.userName history:nil];
}
[xmppRoom fetchConfigurationForm];
[xmppRoom configureRoomUsingOptions:nil];
[xmppRoom addDelegate:[self appDelegate] delegateQueue:dispatch_get_main_queue()];

调试:

2012-08-03 07:46:29.204 iPhoneXMPP[9887:fb03] room created
2012-08-03 07:46:29:230 iPhoneXMPP[9887:15003] SEND: <iq type="get" to="groupchat@xmpp.getkismet.com" id="B793062B-0E09-492F-BC0F-703503AAA664"><query xmlns="http://jabber.org/protocol/muc#owner"/></iq>
2012-08-03 07:46:29:237 iPhoneXMPP[9887:15003] SEND: <iq type="set" to="groupchat@xmpp.getkismet.com" id="392D5BFC-707B-4F68-A829-56F949F4E96D"><query xmlns="http://jabber.org/protocol/muc#owner"><x xmlns="jabber:x:data" type="submit"/></query></iq>
2012-08-03 07:46:29:326 iPhoneXMPP[9887:14f03] SEND: <presence to="groupchat@xmpp.getkismet.com"><x xmlns="http://jabber.org/protocol/muc"/><x xmlns="vcard-temp:x:update"><photo>91217a961321f8f6380ea2feefd0632353ad296c</photo></x><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/></presence>
2012-08-03 07:46:29:327 iPhoneXMPP[9887:14f03] RECV: <iq xmlns="jabber:client" from="groupchat@xmpp.getkismet.com" to="lee@xmpp.getkismet.com/41068195801343976386548353" type="error" id="B793062B-0E09-492F-BC0F-703503AAA664"><query xmlns="http://jabber.org/protocol/muc#owner"/><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
2012-08-03 07:46:29:343 iPhoneXMPP[9887:fb03] iPhoneXMPPAppDelegate: xmppStream:didReceiveIQ:
2012-08-03 07:46:29:421 iPhoneXMPP[9887:15003] RECV: <iq xmlns="jabber:client" from="groupchat@xmpp.getkismet.com" to="lee@xmpp.getkismet.com/41068195801343976386548353" type="error" id="392D5BFC-707B-4F68-A829-56F949F4E96D"><query xmlns="http://jabber.org/protocol/muc#owner"><x xmlns="jabber:x:data" type="submit"/></query><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
2012-08-03 07:46:29:440 iPhoneXMPP[9887:fb03] iPhoneXMPPAppDelegate: xmppStream:didReceiveIQ:

我看到它正在创建/加入groupchat@xmpp.getkismet.com而不是像我指定的groupchat@xmpp.getkismet.com/groupchat.我读到这很可能是问题所在.但是,我已经指定了完整的jid,所以我迷路了.

在此先感谢所有帮助的人.

解决方法

首先,请看一下 XEP-0045: Multi-User Chat.如您所见,首先您必须发现您的用户(XMPPJID)在Jabber服务器上具有哪些功能.为此,请将下一个命令发送到您的Jabber服务器:
<iq from='user@jabber.server.com/resource' id='some_expression' to='jabber.server.com' type='get'>
    <query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>

或使用XMPP库函数在objective-c中写入:

NSError *error = nil;
NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='http://jabber.org/protocol/disco#items'/>" 
                                                        error:&error];
XMPPIQ *iq = [XMPPIQ iqWithType:@"get" 
                             to:[XMPPJID jidWithString:@"jabber.server.com"] 
                      elementID:[xmppStream generateUUID] child:query];
[xmppStream sendElement:iq];

现在在XMPPStream委托中侦听来自服务器的响应 – (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq和服务器响应应该是这样的:

<iq from='jabber.server.com' id='some_expression' to='user@jabber.server.com/resource' type='result'>
    <query xmlns='http://jabber.org/protocol/disco#items'>
        <item jid='im.jabber.server.com' name='Instant Message Service'/>
        <item jid='conference.jabber.server.com' name='Chatroom Service'/>
    </query>
</iq>

或目标c:

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{

    if([iq isResultIQ])
    {
        if([iq elementForName:@"query" xmlns:@"http://jabber.org/protocol/disco#items"])
        {
            NSLog(@"Jabber Server's Capabilities: %@",[iq XMLString]);
        }
    }
}

现在,对于返回的每个项目,将IQ发送到您的服务器以获取它的属性,并确定哪个是会议类型,如下所示:

<iq from='user@jabber.server.com/resource' id='some_expression' to='conference.jabber.server.com' type='get'>
    <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>

或在目标c:

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{

    if([iq isResultIQ])
    {
        if([iq elementForName:@"query" xmlns:@"http://jabber.org/protocol/disco#items"])
        {
            NSXMLElement *query = [iq childElement];
            NSArray *items = [query children];
            for(NSXMLElement *item in items)
            {
                NSError *error = nil;
                NSXMLElement *sendQuery = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='http://jabber.org/protocol/disco#info'/>" 
                                                                            error:&error];
                XMPPIQ *sendIQ = [XMPPIQ iqWithType:@"get" 
                                                 to:[XMPPJID jidWithString:[item attributeStringValueForName:@"jid"]] 
                                          elementID:[xmppStream generateUUID] 
                                              child:sendQuery];
                [xmppStream sendElement:sendIQ];
            }
        }
    }
}

听取服务器的回复:

<iq from='conference.jabber.server.com' id='some_expression' to='user@jabber.server.com/resource' type='result'>
    <query xmlns='http://jabber.org/protocol/disco#info'>
        <identity category='conference' name='Server Group Chat Service' type='text'/>
        <feature var='http://jabber.org/protocol/muc'/>
    </query>
</iq>

并从类别:会议中识别群组聊天域名

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{

    if([iq isResultIQ])
    {
        if([iq elementForName:@"query" xmlns:@"http://jabber.org/protocol/disco#items"])
        {
            ...
        }
        else if([iq elementForName:@"query" xmlns:@"http://jabber.org/protocol/disco#info"])
        {
            NSXMLElement *query = [iq childElement];
            NSXMLElement *identity = [query elementForName:@"identity"];
            if([[identity attributeStringValueForName:@"category"] isEqualToString:@"conference"])
            {
                groupChatDomain = [iq fromStr];
            }
        }
    }
}

最后,当我们获得群聊字段时,我们可以创建如下的聊天室:

XMPPJID *chatRoomJID = [XMPPJID jidWithUser:@"chat_room" 
                                     domain:groupChatDomain 
                                   resource:@"user"];
XMPPRoomMemoryStorage *roomMemoryStorage = [[XMPPRoomMemoryStorage alloc] init];
XMPPRoom *xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:roomMemoryStorage
                                                       jid:roomChatJID
                                             dispatchQueue:dispatch_get_main_queue()];
[xmppRoom activate:xmppStream];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppRoom joinRoomUsingNickname:user history:nil];

并添加< XMPPRoomDelegate>视图控制器及其委托中的协议:

- (void)xmppRoomDidCreate:(XMPPRoom *)sender
- (void)xmppRoomDidDestroy:(XMPPRoom *)sender
- (void)xmppRoom:(XMPPRoom *)sender didConfigure:(XMPPIQ *)iqresult
- (void)xmppRoom:(XMPPRoom *)sender didNotConfigure:(XMPPIQ *)iqresult
- (void)xmppRoomDidJoin:(XMPPRoom *)sender
- (void)xmppRoomDidLeave:(XMPPRoom *)sender
- (void)xmppRoom:(XMPPRoom *)sender occupantDidJoin:(XMPPJID *)occupantJID withPresence:(XMPPPresence *)presence
- (void)xmppRoom:(XMPPRoom *)sender occupantDidLeave:(XMPPJID *)occupantJID withPresence:(XMPPPresence *)presence
- (void)xmppRoom:(XMPPRoom *)sender didReceiveMessage:(XMPPMessage *)message fromOccupant:(XMPPJID *)occupantJID

注意:在邀请其他用户访问聊天室之前,您必须发送并确认房间配置(可以邀请其他用户,但无法发送消息).所以你可以在创建Room之后(委托 – (void)xmppRoomDidCreate

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

ios – 无法创建xmpp muc room:代码503(服务不可用)的更多相关文章

  1. ios – XMPP应用终止而不是回复消息

    我在XMPP应用程序中工作.当我终止并杀死我的应用程序时,1)XMPP服务器中未连接用户.用户离线.但我希望用户连接和在线.喜欢WhatsApp(应用).2)我当时无法从XMPP服务器端获取任何消息,这种方法不是调用.那么,我如何获得消息?

  2. XMPP iOS框架检测与OpenFire服务器的互联网断开连接问题

    我已经使用XMPPiOS框架与OpenFire服务器实现聊天应用程序.幸运的是,应用程序正在运行,但我在应用程序中面临一个互联网断开的问题.当用户正在注销或手动进入离线模式时,它会将节发给他/她的名单.所以他/她的名单知道用户进入离线模式.现在当互联网从用户设备断开连接时,由于互联网断开,应用程序无法向服务器发送存在节.所以他/她的名单将不会获得关于该离线用户的信息,用户将只显示在线模式.我认为像

  3. 在android中创建聊天应用程序的最佳做法是什么

    我打算创建一个Android聊天应用程序.实际上聊天将成为应用程序的一项功能.我想知道有关Android聊天应用程序的最佳实践.我熟悉的两个选项是C2MD,每隔几秒就会对服务器db进行一次自定义轮询.现在,我知道C2MD本来应该是伟大的,但根据我的理解,它并不可靠.我试图实现它,它似乎没有工作.此外,如果由于某种原因谷歌结束时发生了某些事情(就像他们的服务器已关闭–不太可能但可能发生)我无法联系他

  4. Smack(XMPP)聊天应用程序的Android后台服务

    我正在使用asmack库实现一个聊天应用程序.我想启动一个始终运行的服务,其中所有的连接管理任务都要完成,并且应该继续接收传入的数据包并将消息保存在我的sqlite数据库中.当我的应用程序启动时,我希望我的应用程序也会收到通知,而后台服务将消息插入sqlite数据库.如何用粘性服务实现这种结构.是否还需要部分唤醒锁定.因为,有时也会根据特定需求使用http来下载图像.解决方法您可以在服务器上注册后

  5. android – 如何使用Smack了解XMPP openfire中的键入状态

    我正在使用OpenfireXMPP服务器开发聊天应用程序.我可以在两个用户之间进行文字聊天但我想知道某人输入消息时的打字状态.所以我创建了一个类:–但我很困惑,所以它将如何运作?我知道我需要一个数据包,我可以在Listener中使用它.但我无法找到该数据包.请任何人建议,它将如何运作?还有Smack和asmack有什么区别?解决方法要启用ChatStateListener,您需要创建自定义MessageListener类然后创建MessageListener对象然后在createchat方法中传递它Sma

  6. android – 如何添加和订阅jabber条目到我的XMPP帐户?

    >如何获取入站在线通知?>如何发送出站在线通知?

  7. 使用Smack for Android实现FCM与XMPP

    我正在使用XMPP在我的Android应用程序中实现聊天,我已经使用了SmackAPI.我的聊天工作正常,我在本地保存Android设备上的所有聊天消息.以下是我目前面临的一些问题.>在聊天期间,如果某种方式连接丢失,那么它需要很长时间再次重新连接,有时它甚至没有连接.即使之后连接已连接,停止发送聊天消息,因为它不再在另一边接收.我有再次初始化资源但有时会有效>如果我的USER断开连接,我想使用F

  8. 如何使用PHP和JQuery开发基于Web的XMPP聊天工具?

    )处理,并且如弃用文章所述,有几个很好的将SSE带到旧版浏览器.

  9. Ajax jabber/XMPP客户推荐(只有真实体验)!

    我正在为我的利基社区网站建立一个聊天系统,并决定在服务器端使用ejabberd,但是我找不到任何体面的基于web的ajax客户端。我在这里看过一个人:http://xmpp.org/xmpp-software/clients/有人正在运行一个活动网站,并使用一个基于ajax的客户端,他们可以保证这个工作正在积极发展?我不确定它的维护状态,但我通常指出谁要求我这个问题的人到TrophyIM.它是一个小的,可主题的聊天客户端写在Strophe.js年以上。大多数人在Web域中都有非常明确的需求,我认为这有助于

  10. php – jaxl无法连接到Prosody

    在此先感谢您的帮助.正如日志所述,Prosody未通过身份验证.请尝试使用PLAIN,DIGEST-MD5,ANONYMOUS身份验证机制之一,它应该工作正常.SCRAM-SHA-1和CRAM-MD5目前在JAXLv3.x中都已中断.如果它仍然不起作用,请告诉我.

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部