0

iOS/OSX 用の XMPP フレームワークを使用して iPhone アプリを開発しており、XEP-0045 拡張 (マルチユーザー チャット) を使用しています。ルームの作成と構成が正常に完了し、他のユーザーを招待してチャットできるようになりました。問題は、作成した部屋を破壊しに行くときに発生します。フレームワーク内で実行されるコードパスをたどり、フレームワークがメソッドを起動しない理由を理解しましたが、私が見ている動作を考えると、どのようにメソッドを起動するかわかりません.

その動作は次のとおりです。

1) [room destroyRoom] を呼び出してルームの破棄をリクエストします

2) 次に、XMPPRoom クラスがその XMPPIDResponse トラッカーをセットアップして、サーバーがルームを正常に削除したことを示す「結果」iq スタンザを監視することを確認します。

3) (ここで問題が発生します) ルームから現在利用できないというプレゼンス スタンザを受け取り (私もルームの占有者であるため)、フレームワークは応答トラッカーをクリアし、-xmppRoomDidLeave: を呼び出します。

4) サーバーは、ルームが正常に削除されたことを示す「結果」の iq スタンザを返しますが、誰も聞いていません。これにより、xmppRoomDidDestroy の呼び出しが失われます。

この動作は、私が XEP-0045 定義で読んだ内容と一致しており、それを考えると、 -xmppRoomDidDestroy: デリゲートがどのように呼び出されるかはわかりません。ここで何か間違ったことをしていますか?

4

2 に答える 2

0

私は同じ問題を抱えていましたが、これが私の解決策です:

XMPPRoom メソッドで

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence

交換

[responseTracker removeAllIDs];

と:

if ([x elementForName:@"destroy"]) {
    NSArray *allKeys = [responseTracker allIDs];
    for (NSString *key in allKeys) {
        SEL aSel = [responseTracker selectorForElementID:key];
        if (aSel != @selector(handleDestroyRoomResponse:withInfo:)) {
            [responseTracker removeID:key];
        }
    }
} else {
    [responseTracker removeAllIDs];
}

XMPPIDTracker.h で、新しいパブリック メソッドの宣言を追加します。

- (NSArray *)allIDs;

- (SEL)selectorForElementID:(NSString *)elementID;

また、XMPPBasicTrackingInfo インターフェイスに追加

@property (nonatomic, readonly) SEL selector;

XMPPIDTracker.m に 2 つのパブリック メソッドを追加します。

- (NSArray *)allIDs {
    return [dict allKeys];
}

- (SEL)selectorForElementID:(NSString *)elementID {
    id <XMPPTrackingInfo> info = [dict objectForKey:elementID];
    if ([info isKindOfClass:[XMPPBasicTrackingInfo class]]) {
        return [(XMPPBasicTrackingInfo *)info selector];
    }
    return nil;
}

@implementation XMPPBasicTrackingInfo の最後に追加

@synthesize selector;

基本的に、このコードは handleDestroyRoomResponse:withInfo: を除くすべての応答トラッカーを削除します。これは、このハンドラーが IQ destroy スタンザで応答する必要があるためです。

これが役立つことを願っています。

于 2014-03-10T14:58:04.163 に答える