以下は、私が自分の問題をどのように解決したかです。このソリューションには、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 を楽しんでください。