- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Openfire 服务器上创建了一个组和两个用户。我能够使用 XMPPFramework 对两个用户进行身份验证,但无法在他们之间交换消息。我可以看到两个用户都加入了 Openfire 服务器上的群组。
使用以下服务器详细信息:
#define kHostName @"Some Server URL"
#define kServerName @"Some Server Name"
#define kRoomAddress @"testchatroom@conference.Some Server Name"
使用以下代码进行流设置和创建房间:
- (void)setupStream {
NSString *jabberID = [UserDefaults stringForKey:kUserID];
NSString *myPassword = [UserDefaults stringForKey:kUserPassword];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
self.xmppStream = [[XMPPStream alloc] init];
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
self.xmppStream.hostName = kHostName;
self.xmppStream.hostPort = OptionPort;
NSString *userName = [NSString stringWithFormat:@"%@@%@", jabberID, kServerName];
self.xmppStream.myJID = [XMPPJID jidWithString:userName];
password = myPassword;
NSError *error = nil;
if (OptionOldSchoolSSL)
[self.xmppStream oldSchoolSecureConnectWithTimeout:timeOut error:&error];
else
[self.xmppStream connectWithTimeout:timeOut error:&error];
}
#pragma mark -
#pragma mark XMPP delegates
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
isOpen = YES;
Class authClass = nil;
if ([OptionAuthenticationMethod isEqual:XMPPAuthenticationMethodPlain])
authClass = [XMPPPlainAuthentication class];
else if ([OptionAuthenticationMethod isEqual:XMPPAuthenticationMethodDigestMD5])
authClass = [XMPPDigestMD5Authentication class];
else {
NSLog(@"Unrecognized auhthentication method '%@', falling back on Plain",
OptionAuthenticationMethod);
authClass = [XMPPPlainAuthentication class];
}
id<XMPPSASLAuthentication> auth = [[authClass alloc] initWithStream:sender
password:password];
NSError *error = nil;
if (![sender authenticate:auth error:&error])
NSLog(@"Error authenticating: %@", error);
else
NSLog(@"Authenticated !!");
}
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
[self createRoom];
}
- (void)createRoom {
self.roomStorage = [[XMPPRoomMemoryStorage alloc] init];
XMPPJID *roomJID = [XMPPJID jidWithString:kRoomAddress];
self.xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:self.roomStorage
jid:roomJID
dispatchQueue:dispatch_get_main_queue()];
[self.xmppRoom activate:self.xmppStream];
[self.xmppRoom addDelegate:self
delegateQueue:dispatch_get_main_queue()];
[self.xmppRoom joinRoomUsingNickname:self.xmppStream.myJID.user
history:nil
password:nil];
}
#pragma mark XMPPRoom delegates
- (void)xmppRoomDidCreate:(XMPPRoom *)sender {
NSLog(@"%s", __PRETTY_FUNCTION__);
}
- (void)xmppRoomDidJoin:(XMPPRoom *)sender {
NSLog(@"%s", __PRETTY_FUNCTION__);
NSString *jabberID = [UserDefaults stringForKey:kUserID];
NSString *userName = [NSString stringWithFormat:@"%@@%@", jabberID, kServerName];
XMPPJID *jid = [XMPPJID jidWithString:userName];
[sender inviteUser:jid withMessage:nil];
}
- (void)xmppRoom:(XMPPRoom *)sender didFetchConfigurationForm:(NSXMLElement *)configForm
{
NSXMLElement *newConfig = [configForm copy];
NSArray *fields = [newConfig elementsForName:@"field"];
for (NSXMLElement *field in fields)
{
NSString *var = [field attributeStringValueForName:@"var"];
// Make Room Persistent
if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) {
[field removeChildAtIndex:0];
[field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
}
}
[sender configureRoomUsingOptions:newConfig];
}
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
NSString *msg = [[message elementForName:@"body"] stringValue];
NSString *from = [[message attributeForName:@"from"] stringValue];
if (msg != nil && from != nil) {
[m setObject:msg forKey:@"msg"];
[m setObject:from forKey:@"sender"];
[_messageDelegate newMessageReceived:m];
}
}
使用以下代码发送消息:
if ([messageStr length] > 0) {
NSString *jabberID = [UserDefaults stringForKey:kUserID];
NSString *userName = [NSString stringWithFormat:@"%@@%@", jabberID, kServerName];
XMPPMessage * message = [[XMPPMessage alloc] init];
[message addAttributeWithName:@"body" stringValue:messageStr];
[message addAttributeWithName:@"sender" stringValue:userName];
[DELEGATE.xmppClient.xmppRoom sendMessage:message];
self.txtMessageField.text = @"";
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:[messageStr substituteEmoticons] forKey:@"msg"];
[m setObject:@"you" forKey:@"sender"];
[m setObject:[NSString getCurrentTime] forKey:@"time"];
[self.messages addObject:m];
[self.messagesTableView reloadData];
}
最佳答案
构建 XMPPMessage 的方式不正确。 xmpp 消息的主体是元素而不是属性。
试试这个:
XMPPMessage *xmppMessage = [[XMPPMessage alloc] initWithType:@"groupchat" to:[XMPPJID jidWithString:@"user@server.com"]];
[xmppMessage addBody:@"Hi there"];
如果你想添加额外的参数:
XMPPElement *extraElement = [XMPPElement elementWithName:@"sender" stringValue:@"you"];
[xmppMessage addChild:extraElement];
然后发送:
[xmppRoom sendMessage:message];
我建议您实现didFailToSendMessage 委托(delegate),并在发送消息后检查您是否收到错误:
- (void)xmppStream:(XMPPStream *)sender didFailToSendMessage:(XMPPMessage *)message error:(NSError *)error {}
关于ios - 无法在多用户聊天中发送或接收消息 - XMPPFramework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156933/
我正在使用 XMPPFramework在我的 iOS 应用程序中发送和接收客户端和服务器之间的命令消息。服务器会立即响应不同的命令消息。 有时候连接很慢,客户端发来的消息会长时间没有响应。所以我想知道
我正在为 iPhone 开发一款应用程序,其中功能之一是使用 XMPPFramework 的即时消息系统。现在,我正在使用 Google Talk 进行测试。委托(delegate)与管理用户界面的类
我正在 iPhone 上使用 xmppframework。我想知道如何检查我的特定域的所有可用用户? 谢谢 最佳答案 - (void)xmppStream:(XMPPStream *)sender d
问题:我正在使用XMPPFramework和Openfire服务器创建iOS聊天应用程序。但是,我无法连接到服务器。但是,我可以使用GTalk或Facebook帐户登录。此外,我可以使用另一个Jabb
我认为标题足够说明问题,但故事如下: 我是 XMPPFramework 的新手对于 iOS,我想将我的客户端设置为自动接受它收到的任何订阅请求。这样其他客户端可以在请求时看到该客户端的存在状态。 根据
需要帮助以获取有关好友的存在信息的信息。 我正在调用“fetchRoster”函数,但是我正在获取名册列表而不是存在信息。 我也尝试显式调用存在信息。但是在我的 iOS 应用程序中没有调用 didRe
我将openfire用作xmpp服务器,并希望通过Turnsocket传输文件。 openfire(本地)配置: xmpp.auth.anonymous true xmp
我有一个用于一对一聊天的应用程序。现在我需要实现群聊。我知道 XMPPFramework 是可能的,并且有一个名为 XMPPRoom 的类,我们可以使用它来创建房间或加入房间。但是我无法在我的项目中实
有什么方法可以让我查询例如 muc 房间的列表,但指定某些约束。 我已在每个房间的配置表单中的描述字段下附加了每个房间的位置。我想找出获得用户位置 500m 范围内所有房间的最佳方法是什么。 在后端,
如何使用 XMPPFramework 在 iPhone 中实现 GroupChat。我尝试了休闲代码,但未创建房间。我如何知道房间是否已创建。XMPPRoomDelegate 未被调用。当 Strea
我在 Openfire 服务器上创建了一个组和两个用户。我能够使用 XMPPFramework 对两个用户进行身份验证,但无法在他们之间交换消息。我可以看到两个用户都加入了 Openfire 服务器上
为了更改我的登录状态,我使用了以下代码: XMPPPresence *presence = [XMPPPresence presenceWithType:@"away"]; [[sel
这个问题在这里已经有了答案: XMPPFramework - How to create a MUC room and invite users? (3 个答案) 关闭 8 年前。 我需要使用 XM
我的 xmpp 流连接成功,在回调中我尝试发送用户的存在。但是,我不断收到此错误:Error Domain=XMPPStreamErrorDomain Code=1“操作无法完成。(XMPPStrea
我从 Google Talk 帐户接收消息,它们显示在 Ios 模拟器的表格 View 中,但是当我发送消息时,它不会显示在 Google Talk 客户端(在另一台计算机上)中。这是代码: -(IB
我正在尝试将用户状态设置为离开(或目前的任何状态)。我正在使用以下代码,但它似乎没有做任何事情。 XMPPPresence *presence = [XMPPPresence presence]; N
我是 iOS 的新手。我正在使用 XMPPFramework 构建应用程序。但是最近几天我遇到了一个问题。找不到任何解决方案。问题是当我想向任何特定的 id 发送消息时,消息没有被发送。发送消息的 A
如何在 iOS 中使用 XMPPFramework 获取在线和离线好友列表? 我想向用户发送好友请求。那么我该如何实现呢?有人可以为我分享一些示例代码吗? 谢谢。 最佳答案 通过使用这些方法,您将收到
我正在使用 https://github.com/robbiehanson/XMPPFramework对于我的 iOS 聊天应用程序。 我需要帮助来删除注册用户帐户。 请帮帮我。 最佳答案 如 the
我已经使用 XMPP 协议(protocol)进行了一对一聊天。现在,我想在我的应用程序中发送图像和视频。我研究了文件传输,但没有找到解决方案。我还使用了下面的代码进行 Socket 连接。 请告诉我
我是一名优秀的程序员,十分优秀!