客户端对应版本 (3.3.4, 3.2.8) 都试过,一样的效果!
AVOSCloud 3.2.8 (was 3.3.4)
AVOSCloudCrashReporting 3.2.8 (was 3.3.4)
AVOSCloudIM 3.2.8 (was 3.3.4)

客户端1通过聊天室发出一个非暂态的消息 ‘ transient: false’

------ BEGIN LeanCloud IM Out Command ------
cmd: Direc
type: AVIMDirectCommand
content: : {
cmd: direct
peerId: "5785b1ef07961b70e4ce75a5"
directMessage {
msg: "{"lctype":-1,"lctext":"Ohio ","_lcattrs":{"dev":true,"username":"吴文钰"}}"
cid: "5785b1f2128fe1006034ff8f"
transient: false
}
}
------ END ---------------------------------

[VBOSE]>[-CMInputView intrinsicContentSize] CMInputViewintrinsicSize:265.50
[VBOSE]>[-CMMessageTableViewController tableView:cellForRowAtIndexPath:] tableView:10
2016-07-18 15:39:33.750 jike[68627:465943] [INFO] -[AVIMWebSocketWrapper webSocket:didReceiveMessage:] [Line 716]

------ BEGIN LeanCloud IM In Command ------
content: : {
cmd: ack
peerId: "5785b1ef07961b70e4ce75a5"
i: 6
ackMessage {
t: 1468827573693
uid: "6GU2kRiNSOGKq1qvEHN8Fw"
}
}
------ END --------------------------------

客户端2,收到此消息变成暂态消息了!
2016-07-18 15:39:33.713 jike[12900:5919323] [INFO] -[AVIMWebSocketWrapper webSocket:didReceiveMessage:] [Line 716]

------ BEGIN LeanCloud IM In Command ------
content: : {
cmd: direct
peerId: "5785b1ef07961b70e4ce757c"
directMessage {
msg: "{"lctype":-1,"lctext":"Ohio ","_lcattrs":{"dev":true,"username":"吴文钰"}}"
fromPeerId: "5785b1ef07961b70e4ce75a5"
timestamp: 1468827573693
cid: "5785b1f2128fe1006034ff8f"
id: "6GU2kRiNSOGKq1qvEHN8Fw"
transient: true
}
}
------ END --------------------------------

聊天室下次进来,查询历史消息,还能收到此消息。

对于消息来说,是否 transient 不影响消息的发送,只是 transient 的消息不会被存储,也不会有离线消息推送,获取历史消息时拿不到这条消息。

如果聊天室的消息都是暂态的,是不是通过历史都查询不到呢?

您好,您观察到的 tr 属性,是我们内部协议里的 tr,这个属性在收到消息时表示不用回复确认,这是因为暂态对话和暂态消息都是“至多到达一次”的 QoS,这并不影响您的消息本身的任何属性,也不影响业务。

关于各种不同对话的功能特点,您可以直接从这里了解:
https://leancloud.cn/docs/realtime_v2.html#%E5%AF%B9%E8%AF%9D%E7%B1%BB%E5%9E%8B%E6%AF%94%E8%BE%838

暂态对话是支持历史记录的查询的。

聊天室发出的消息没有设置暂态属性,接收方收到消息的transient 字段 为true?

是的,聊天室的所有消息到达客户端后都是 tr: true
如果您需要对消息做一些业务上的标记的话,建议通过消息内部的属性来标记

这个不就跟你们对暂态消息的定义自相矛盾吗?

你看到的 tr:true 是给 SDK 的内部属性,并不是我们对外的属性,也不能够代表这个消息就是暂态消息的。您可以认为它在不同的对话下有不同的含义。我之前给您的解释是在假设您对内部实现比较感兴趣的情况下的说明,并不代表我们功能上的承诺。协议里的内部字段也不能保证未来改变含义。

消息是否是暂态消息和且只和您发送消息时标记的 transient 属性有关。暂态对话内的暂态消息仍然是暂态消息,不会进入消息记录。