8. 发送文本消息
因为Android 中直接在Message 根目录扩展多个节点比较麻烦,所以我们这边只扩展了一个节点,然后在这个节点内部添加多个子节点来传递内容。
发送消息时,如果对方离线时,body又为空,则对方上线时,并不会收到这条消息(推测Openfire服务器并未存储body为空的离线消息,一定得保证body不为空)。
<message type="chat" to="1001@duimy/iOS" id="E1B3BC0C-1F32-40BC-9AF3-162F30D5AE0D">
<body>1</body>
<messagebody>
<textbody>温馨呢就几乎</textbody>
</messagebody>
</message>
1
2
3
4
5
6
body 节点,我们用来传递消息类型,messagebody 节点是消息的内容。
iOS 中的代码段:
XMPPMessage *xmppMessage = [XMPPMessage messageWithType:type to:toJID.bareJID];
[xmppMessage addAttributeWithName:@"id" stringValue:[HLCoreManager manager].stream.generateUUID];
NSString *msgType = [NSString stringWithFormat:@"%ld", self.body.type];
[xmppMessage addBody:msgType]; // body 中存的是消息的类型
// 插入其他节点
XMPPElement *msgBody = [XMPPElement elementWithName:@"messagebody"];
[msgBody addChild:[XMPPElement elementWithName:@"textbody" stringValue:body.text]];
[xmppMessage addChild:msgBody];
[[HLCoreManager manager] sendElement:xmppMessage completion:^(XMPPElement *element, NSError *error) {
//4.对HLMessage 补充参数,比如服务器时间、发送状态等。
if (error) {
aMessage.status = HLMessageStatusFailed;
} else {
aMessage.status = HLMessageStatusSuccessed;
}
//5.更新Message数据库
//6.更新会话的最后一条消息
if ([NSThread isMainThread]) {
aCompletionBlock(aMessage, error);
} else {
dispatch_async(dispatch_get_main_queue(), ^{
aCompletionBlock(aMessage, error);
});
}
}];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Android 里代码段:
Message message = new Message(dmMessage.getTo());
// 2.将消息通过Smack 发送出去
if (dmMessage.getChatType() == DMConversation.Chat) {
message.setType(Message.Type.chat);
} else {
message.setType(Message.Type.groupchat);
}
message.addBody(null, String.valueOf(dmMessage.getType()));
// 为Message 添加子节点
message.addExtension(dmMessage.getBody());
//发送消息
dmCore.getConnection().sendStanza(message);
1
2
3
4
5
6
7
8
9
10
11
12
其中,扩展节点对象是继承自ExtensionElement,需要重写如下方法:
@Override
public CharSequence toXML() {
XmlStringBuilder buf = new XmlStringBuilder();
buf.openElement(getElementName());
buf.element(textBoadyTag, textbody);
buf.closeElement(getElementName());
return buf;
}
1
2
3
4
5
6
7
8
9
10
11
12
8.1 收到的XML
接收到的XML分两种情况,当接受者在线时:
<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="E1B3BC0C-1F32-40BC-9AF3-162F30D5AE0D" from="1002@duimy/iOS">
<body>1</body>
<messagebody>
<textbody>温馨呢就几乎</textbody>
</messagebody>
</message>
1
2
3
4
5
6
接受者不在线,当其上线时,接受到的XML:
<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="9590CEFC-6BA3-4506-837C-EA2AA3CACF2E" from="1002@duimy/iOS">
<body>1</body>
<messagebody>
<textbody>温馨呢就几乎</textbody>
</messagebody>
<delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-06-26T02:47:14.140Z"></delay>
</message>
1
2
3
4
5
6
7
9.发送定位消息的XML
发送消息时,如果对方离线时,body又为空,则对方上线时,并不会收到这条消息(推测Openfire服务器并未存储body为空的离线消息,一定得保证body不为空)。
<message type="chat" to="1001@duimy/iOS" id="AC3B22D1-6DEC-42D2-A0E1-25B6777C5F3C">
<body>4</body>
<messagebody>
<latitude>22.554248</latitude>
<longitude>113.949618</longitude>
<address>北京市东城区中华路甲10号</address>
</messagebody>
</message>
1
2
3
4
5
6
7
8
接受者在线时,接收到的XML
<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="24275F68-D3DA-42A4-91F8-AB04DE0BF8B3" from="1002@duimy/iOS">
<body>4</body>
<messagebody>
<latitude>22.554248</latitude>
<longitude>113.949618</longitude>
<address>北京市东城区中华路甲10号</address>
</messagebody>
</message>
1
2
3
4
5
6
7
8
接收者离线,当其上线时,收到的XML
<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="AC3B22D1-6DEC-42D2-A0E1-25B6777C5F3C" from="1002@duimy/iOS">
<body>4</body>
<messagebody>
<latitude>22.554248</latitude>
<longitude>113.949618</longitude>
<address>北京市东城区中华路甲10号</address>
</messagebody>
<delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-06-26T03:14:04.540Z"></delay>
</message>
1
2
3
4
5
6
7
8
9
10.发送图片消息
发送图片消息分为两步,第一步,请求服务器端上传接口,把图片上传到服务器,服务器返回一个图片路径。
第二步,将服务器端远程路径封装到Message 的XML里,发送出去。
在这里,第一步的就不介绍了,主要展示一下第二步发送的XML:
<message type="chat" to="1002@duimy/iOS" id="CD0F9279-8088-4592-BA36-D31F2C165C04">
<body>2</body>
<messagebody>
<remotepath>http://192.168.1.166:8080/upload/pic/04cd8912-2af5-49f6-8a5c-6d95fa6ff326.png</remotepath>
<width>750</width>
<height>499</height>
<fileLength>707397</fileLength>
</messagebody>
</message>
1
2
3
4
5
6
7
8
9
收到的图片消息XML:
<message xmlns="jabber:client" type="chat" to="1002@duimy/iOS" id="CD0F9279-8088-4592-BA36-D31F2C165C04" from="1001@duimy/iOS">
<body>2</body>
<messagebody>
<remotepath>http://192.168.1.166:8080/upload/pic/04cd8912-2af5-49f6-8a5c-6d95fa6ff326.png</remotepath>
<width>750</width>
<height>499</height>
<fileLength>707397</fileLength>
</messagebody>
</message>
1
2
3
4
5
6
7
8
9
收到的离线图片消息XML:
<message xmlns="jabber:client" type="chat" to="1002@duimy/iOS" id="CD0F9279-8088-4592-BA36-D31F2C165C04" from="1001@duimy/iOS">
<body>2</body>
<messagebody>
<remotepath>http://192.168.1.166:8080/upload/pic/04cd8912-2af5-49f6-8a5c-6d95fa6ff326.png</remotepath>
<width>750</width>
<height>499</height>
<fileLength>707397</fileLength>
</messagebody>
<delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-07-06T06:15:52.757Z"></delay>
</message>
1
2
3
4
5
6
7
8
9
10
11.发送语音类型的消息
发送语音类型的消息与发送图片类型的消息一样,都是先将语音附件上传至服务器,再封装消息内容发送出去。
发送的XML:
<message type="chat" to="1001@duimy/iOS" id="ADB92A65-A38E-4699-90A8-0A1B120921D2">
<body>5</body>
<messagebody>
<remotepath>http://192.168.1.166:8080/upload/sound/5c2dfdab-6818-4425-b46e-4c4a350fa528.wav</remotepath>
<duration>1</duration>
<fileLength>87812</fileLength>
</messagebody>
</message>
1
2
3
4
5
6
7
8
接受到的语音类消息XML:
<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="BE2A5D79-883C-444B-8C4E-3842753577FD" from="1002@duimy/iOS">
<body>5</body>
<messagebody>
<remotepath>http://192.168.1.166:8080/upload/sound/5c2dfdab-6818-4425-b46e-4c4a350fa528.wav</remotepath>
<duration>1</duration>
<fileLength>87812</fileLength>
</messagebody>
</message>
1
2
3
4
5
6
7
8
接受到的离线语音类消息XML:
<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="BE2A5D79-883C-444B-8C4E-3842753577FD" from="1002@duimy/iOS">
<body>5</body>
<messagebody>
<remotepath>http://192.168.1.166:8080/upload/sound/5c2dfdab-6818-4425-b46e-4c4a350fa528.wav</remotepath>
<duration>1</duration>
<fileLength>87812</fileLength>
</messagebody>
<delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-07-06T06:15:52.757Z"></delay>
</message>
1
2
3
4
5
6
7
8
9
————————————————
-------------------------------------------------------
相关文章
原创互联网未来世界企业政府通讯APP办公节约成本类似马云思维-哇谷IM
公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?
IM云系统即时通讯公有云、私有云、企业云、海外云-哇谷IM团队
im即时通讯社交软件APP红包技术分析(五):微信红包、聊呗红包、诚信红包、高并发技术
im即时通讯-微信红包、支付宝红包、聊呗红包、诚信红包、谈功能逻辑、容灾、运维、架构等。Q红包
更多文章
.
企业即时通讯服务 | 商用红包功能构架 | 哇谷IM首页 | JM沟通IM下载 | IM功能与价格 | 即时通讯动态 | 热门动态 | 关于哇谷 |联系我们