Retrieve old messages
Even though real-time in-app messaging has the obvious benefit of receiving data nearly instantly, it's impossible to keep track of all incoming messages. There are times you might be more interested in messages that have been sent in the past.
PubNub allows you to retain and retrieve historical messages. All you need to know is the channel name the message was sent to and the message's timetoken. Beforehand, however, you must enable Message Persistence in the Admin Portal and configure the amount of time your messages are stored for.
You can retrieve historical messages from one or multiple channels. You can also control the time range and influence the return order. A single request may retrieve up to 100 messages for a single channel or 25 messages for multiple channels (up to 500). If you're not interested in the message content, you may also retrieve the number of messages you missed.
Most use cases require retrieving messages missed since a device or user was last online. To do that, you only provide the end
parameter with a timetoken of the last received message. The following code returns the last 100 messages on the chats_guilds.mages_guild
channel.
User ID / UUID
User ID is also referred to as UUID
/uuid
in some APIs and server responses but holds the value of the userId
parameter you set during initialization.
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
- Dart
- Kotlin
pubnub.fetchMessages(
{
channels: ["chats_guilds.mages_guild"],
end: '15343325004275466',
count: 100
},
function(status, response) {
console.log(status, response);
}
);
pubnub.fetchMessageHistory(
for: ["chats_guilds.mages_guild"],
end: "15343325004275466"
) { result in
switch result {
case let .success(response):
print("Successful History Fetch Response: \(response)")
case let .failure(error):
print("Failed History Fetch Response: \(error.localizedDescription)")
}
}
self.pubnub.history()
.channels(@[@"chats_guilds.mages_guild"])
.end(15343325004275466).limit(100)
.performWithCompletion(^(PNHistoryResult *result, PNErrorStatus *status) {
// handle returned messages in result
});
pubNub.fetchMessages()
.channels(Arrays.asList("chats_guilds.mages_guild"))
.async(result -> {
result.onSuccess(res -> {
final Map<String, List<PNFetchMessageItem>> channelToMessageItemsMap = res.getChannels();
final Set<String> channels = channelToMessageItemsMap.keySet();
for (final String channel : channels) {
List<PNFetchMessageItem> pnFetchMessageItems = channelToMessageItemsMap.get(channel);
for (final PNFetchMessageItem fetchMessageItem : pnFetchMessageItems) {
System.out.println(fetchMessageItem.getMessage());
System.out.println(fetchMessageItem.getMeta());
System.out.println(fetchMessageItem.getTimetoken());
}
}
}).onFailure(exception -> {
show all 18 linespubnub.FetchHistory()
.Channels(new string[] { "chats_guilds.mages_guild" })
.MaximumPerChannel(100)
.End(15343325004275466)
.Execute(new PNFetchHistoryResultExt((result, status) => {
// handle returned messages in result
}));
envelope = pubnub.fetch_messages()\
.channels(["chats_guilds.mages_guild"])\
.count(100)\
.end(15343325004275466)\
.sync()
var result = await pubnub.batch.fetchMessages({'chats_guilds.mages_guild'}, count: 100);
pubnub.fetchMessages(
channels = listOf("chats_guilds.mages_guilds"),
page = PNBoundedPage(limit = 100)
).async { result, status ->
if (!status.error) {
result!!.channels.forEach { (channel, messages) ->
println("Channel: $channel")
messages.forEach { messageItem: PNFetchMessageItem ->
println(messageItem.message) // actual message payload
println(messageItem.timetoken) // included by default
messageItem.actions?.forEach { actionType, map ->
println("Action type: $actionType")
map.forEach { (actionValue, publishers) ->
println("Action value: $actionValue")
publishers.forEach { publisher ->
show all 27 linesIf the messages have any emojis, reactions, or delivery acknowledgments attached, you may retrieve them as well. By default, historical messages are not returned with their custom type, but you can choose to return it.
Having read how to work with historical messages, let's focus back on the present. As your channels get more traction and users start to subscribe, it's worthwhile to understand how to check who's currently online.