5

私は、Robbie Hanson の XMPPFramework を利用する iOS XMPP チャット アプリを開発しています。

メッセージの送受信という最も重要な機能が実装されています。基本的に、私は基本的な機能のチャット アプリを既に構築していますが、もちろんちょっとした見栄えもあります。

さて、私が抱えている問題はMUCに関するものです。私が他のウェブサイトから見たコードは、 にメソッドがあることを示していinitWithRoomNameますXMPPRoom。ただし、このメソッドは、クローンした git リポジトリにはありません。それで、これに代わるものは何ですか?または、何もない場合、XMPPFramework を使用してルームを作成するにはどうすればよいですか?

ありがとう。

4

4 に答える 4

11

以下は、私が自分の問題をどのように解決したかです。このソリューションには、XMPPRoom はまったく含まれないことに注意してください。まず、状況に応じてルームを作成または入力するメソッドを作成しました。(XMPP のドキュメントによると、作成するための XML 要求は、部屋に入るために送信するものと同じです。つまり、部屋に入ったときにまだ部屋が存在しない場合は、サービスがそれを作成します。 .)

どうぞ。ルームを作成・入室するメソッドです。このメソッドが行うことは、作成/入力しようとしているルームにプレゼンスを送信することです。あなたが最初にルームに入室し、ルームがまだ作成されていない場合、あなたは自動的にその所有者およびモデレーターになります。

- (void)createOrEnterRoom:(NSString *)roomName
{
//here we enter a room, or if the room does not yet exist, this method creates it
//per XMPP documentation: "If the room does not yet exist, the service SHOULD create the room"
//this method accepts an argument which is what you would baptize the room you wish created
NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
NSString *room = [roomName stringByAppendingString:@"@conference.jabber.com/iMac"];
[presence addAttributeWithName:@"to" stringValue:room];
 NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"http://jabber.org/protocol/muc"];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
 [history addAttributeWithName:@"maxstanzas" stringValue:@"50"];
 [x addChild:history];
 [presence addChild:x];
 [[self xmppStream] sendElement:presence];
}

次に、XMPPStream メソッドが宣言されている AppDelegate で、サーバーから送信されたステータス コードを確認することで、didReceivePresence メソッドで受信した XML 応答をフィルター処理します。ステータスコードが201ならビンゴ!部屋の作成はうまくいきました。201 以外のステータス コードは意味が異なりますが、目的のために 201 に注目しましょう。

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
     NSXMLElement *x = [presence elementForName:@"x" xmlns:@"http://jabber.org/protocol/muc#user"];
    for (NSXMLElement *status in [x elementsForName:@"status"])
    {
        switch ([status attributeIntValueForName:@"code"])
        {
            case 201: [self notifyRoomCreationOk:room];
        }
    }
 }

次に、「インスタント」タイプのルームを作成していることをサーバーに伝えます。これは、ルームのデフォルトを伝える IQ 要素を送信することを意味します。notifyRoomCreationOk は、ルームの作成が成功したときに別のビューで呼び出されるデリゲート メソッドです。結局、ルームをテキスト ファイルに記録して永続化する必要があるため、次にアプリを開いたときに以前に作成したルームが表示されます。私のnotifyRoomCreationOkメソッドには、基本的に、この段落の最初の文で述べられていることを説明するsendDefaultRoomConfigがあります。

-(void)sendDefaultRoomConfig:(NSString *)room
{
NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"jabber:x:data"];
[x addAttributeWithName:@"type" stringValue:@"submit"];
NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"http://jabber.org/protocol/muc#owner"];
[query addChild:x];
XMPPIQ *iq = [XMPPIQ iq];
[iq addAttributeWithName:@"id" stringValue:[NSString stringWithFormat:@"inroom-cr%@", room]];
[iq addAttributeWithName:@"to" stringValue:room];
[iq addAttributeWithName:@"type" stringValue:@"set"];
[iq addChild:query];
[[self xmppStream ] sendElement:iq];
}

上記のメソッドを呼び出すビューで XMPPStream が有効になっていることを確認してください。そうでない場合、これらは機能しません。それだけです。XMPP を楽しんでください。

于 2012-06-09T08:05:01.643 に答える
2
    XMPPRoom *room = [[XMPPRoom alloc] initWithRoomName:@"user101@conference.jabber.org/room" nickName:@"room"];
    [room createOrJoinRoom];
    [room sendInstantRoomConfig];
    [room setInvitedUser:@"ABC@jabber.org"];
    [room activate:[self xmppStream]];    
    [room inviteUser:jid1 withMessage:@"hello please join."];
    [room sendMessage:@"HELLO"];

ユーザー ABC@jabber.org が招待メッセージを受信する必要があります

于 2012-04-30T06:32:44.187 に答える
0

XMPPFRAMWORK を使用して、以下のコードでチャット ルームを作成します。

    let roomStorage: XMPPRoomMemoryStorage = XMPPRoomMemoryStorage()
    /**
     * Remember to add 'conference' in your JID like this:
     * e.g. uniqueRoomJID@conference.yourserverdomain
     */
    let roomJID: XMPPJID = XMPPJID.jidWithString("chatRoom_name@conference.myhostname")
    let xmppRoom: XMPPRoom = XMPPRoom(roomStorage: roomStorage,
        jid: roomJID,
        dispatchQueue: dispatch_get_main_queue())
    xmppRoom.activate(SKxmpp.manager().xmppStream)
    xmppRoom.addDelegate(self, delegateQueue: dispatch_get_main_queue())
    xmppRoom.joinRoomUsingNickname(SKxmpp.manager().xmppStream.myJID.user, history: nil, password: nil)
    xmppRoom.fetchConfigurationForm()
于 2016-04-19T06:14:04.497 に答える
0

あなたの投稿は古いですが、今は次のようにします:

- (void)createRoomWithJid:(XMPPJID*)roomJID
{
    XMPPRoom *xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:self.xmppRoomHybridStorage
                                                           jid:roomJID
                                                 dispatchQueue:dispatch_get_main_queue()];
    [xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
    [xmppRoom activate:self.xmppStream];

    [xmppRoom joinRoomUsingNickname:self.xmppStream.myJID.user
                            history:nil
                           password:nil];
}
于 2014-10-09T18:17:15.673 に答える