我在让Openfire向与用户jid关联的所有用户资源发送邀请消息时遇到问题。我正在使用Openfire(3.9.3)和Strophe(1.1.3)。
用户jid在openfire上登录了2个资源(例如userA@chat.mychatserver.com/e1ef0b84,userA@chat.mychatserver.com/fa51aad7)。
我已经向用户(即用户A)发送了MUC邀请消息以加入房间。
<?xml version="1.0"?>
<message xmlns:stream="http://etherx.jabber.org/streams"
xmlns="jabber:client" from="chatRoom@se.dev.openfire" to="userA@dev.openfire"
version="1.0">
<x xmlns="http://jabber.org/protocol/muc#user">
<invite from="userB@dev.openfire"/>
</x>
<x xmlns="jabber:x:conference" jid="chatRoom@dev.openfire"/>
</message>
我希望邀请被发送到这两个资源(例如userA@chat.mychatserver.com/e1ef0b84,userA@chat.mychatserver.com/fa51aad7),但它似乎只发送到最后登录的资源。例如,如果我以userA身份登录手机,然后以userA身份登录我的笔记本电脑,则邀请将仅发送给笔记本电脑用户。
Openfire似乎正确地将正常的xmpp消息路由到两个用户资源,我原本期望muc邀请以相同的方式处理。
有谁知道这是否可能?
谢谢, 史蒂夫
答案 0 :(得分:1)
组邀请也被视为普通邮件,它应该被路由到所有连接的资源。
但是,为了将消息路由到所有连接的资源,Openfire具有以下逻辑:
选择具有最高存在优先级的会话,如果没有会话限定,则消息存储在离线存储中,如果找到多个具有相同优先级的会话,则Openfire变得更加智能;)即检查“route.all-resources”属性的值。
如果“route.all-resources”为true,则将消息路由到所有选定的会话,如果value为false,则根据show value(chat,available,away,xa)对会话进行排序,然后再对结果进行排序在最后一个活动时间,最后选择第一个结果并将消息路由到该会话。
答案 1 :(得分:0)
注意:根据XEP-0045,从userB邀请userA的XML采用以下格式:
- (void)uploadVideoWithoutSettingsCredentials:(NSURL *)videoUrl withTitle:(NSString *)title withDesc:(NSString *)desc withPrivacy:(NSString *)privacy
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0), ^{
NSError * error = nil;
NSData * videoData = [NSData dataWithContentsOfURL:videoUrl options:0 error:&error];
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:4L];
[params setObject:videoData forKey:[NSString stringWithFormat:@"%@.MOV",title]];
[params setObject:desc forKey:@"description"];
NSString *privacyString = @"EVERYONE";
if (privacy.length > 0)
privacyString = privacy;
NSDictionary *privacyDict = [[NSDictionary alloc] initWithObjectsAndKeys: privacyString, @"value", nil];
[params setObject:[Utils objectToJsonString:privacyDict] forKey:@"privacy"];
dispatch_async(dispatch_get_main_queue(), ^{
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"/me/videos" parameters:params HTTPMethod:@"POST"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
NSLog(@"RESPONSE!!! /me/videos");
NSLog(@"result %@",result);
NSLog(@"error %@",error);
dispatch_async(dispatch_get_main_queue(), ^{
if (!error) {
[[[UIAlertView alloc] initWithTitle:@"Success" message:@"Your clip was posted!" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil] show];
} else {
[[[UIAlertView alloc] initWithTitle:@"Error!" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil] show];
}
});
}];
});
});
}
然后XMPP服务器(本例中为Openfire)必须提供发送XML:
<message
from='userB@dev.openfire'
to='chatRoom@se.dev.openfire'>
<x xmlns='http://jabber.org/protocol/muc#user'>
<invite to='userA@dev.openfire'>
<reason>
Hey UserA, this is the place for all good witches!
</reason>
</invite>
</x>
</message>
PS:另一种方式是直接邀请(不是在XEP-0045中由房间调解),请参阅http://xmpp.org/extensions/xep-0249.html