Watching a Channel

The call to channel.watch does a few different things in one API call:

  • It creates the channel if it doesn’t exist yet (if this user has the right permissions to create a channel)

  • It queries the channel state and returns members, watchers and messages

  • It watches the channel state and tells the server that you want to receive events when anything in this channel changes

To start watching a channel

The examples below show how to watch a channel. Note that you need to be connected as a user before you can watch a channel.

/// Channels are watched automatically when they're synchronized.

/// 1: Create a `ChannelId` that represents the channel you want to watch.
let channelId = ChannelId(type: .messaging, id: "general")

/// 2: Use the `ChatClient` to create a `ChatChannelController` with the `ChannelId`.
let channelController = chatClient.channelController(for: channelId)

/// 3: Call `ChatChannelController.synchronize` to watch the channel.
channelController.synchronize { error in
  if let error = error {
    /// 4: Handle possible errors
    print(error)
  }
}

Response Schema

NameTypeDescription
configobjectThe configuration for the channel type.
channelobjectThe Channel object.
onlineintegerNumber of online members.
watchersobjectUsers that are watching this channel. Represented as a mapping from the user id to the user object.
membersobjectChannel members. Represented as a mapping from the user id to the user object.
readobjectRead messages grouped by user id. Represented as a mapping from the user id to the message object.

Watching a channel only works if you have connected as a user to the chat API

Watchers vs Members

The concepts of watchers vs members can require a bit of clarification:

  • members : a permanent association between a user and a channel. If the user is online and not watching the channel they will receive a notification event, if they are offline they will receive a push notification.

  • watchers : the list of watchers is temporary. It’s anyone who is currently watching the channel.

Being able to send messages, and otherwise engage with a channel as a non-member requires certain permissions. For example, we have pre-configured permissions on our livestream channel type to allow non-members to interact, but in the messaging channel type, only members of the channel can interact.

Watching Multiple Channels

The default queryChannels API returns channels and starts watching them. There is no need to also use channel.watch on the channels returned from queryChannels

/// Channels are watched automatically when they're synchronized.
let channelListController = client.channelListController(
  query: .init(
    filter: .and(
      [.equal(.type, to: .messaging),
       .containMembers(userIds: [user_id])
      ]
    ),
  sort: [.init(key: .lastMessageAt, isAscending: true)]
  )
)

/// Call `synchronize` to watch the channel.
channelListController.synchronize { error in
  if let error = error {
    /// 4: Handle possible errors
    print(error)
  }
}

Stop Watching a Channel

To stop receiving channel events:

channelController.stopWatching { error in
  // …
}

Watcher Count

To get the watcher count of a channel:

/// Channels are watched automatically when they're synchronized.

/// 1: Create a `ChannelId` that represents the channel you want to watch.
let channelId = ChannelId(type: .messaging, id: "general")

/// 2: Use the `ChatClient` to create a `ChatChannelController` with the `ChannelId`.
client.channelController(for: .init(cid: channelId, watchersLimit: 25))

/// 3: Call `ChatChannelController.synchronize` to watch the channel.
channelController.synchronize { error in
  if let error = error {
    /// 4: Handle possible errors
    print(error)
  }
  // Access watcherCount
  channelController.channel?.watcherCount
}

Paginating Channel Watchers with channel.query

/// Channels are watched automatically when they're synchronized.

/// 1: Create a `ChannelId` that represents the channel you want to watch.
let channelId = ChannelId(type: .messaging, id: "general")

/// 2: Use the `ChatClient` to create a `ChatChannelController` with the `ChannelId`.
client.channelController(for: .init(cid: channelId, watchersLimit: 25))

/// 3: Call `ChatChannelController.synchronize` to watch the channel.
channelController.synchronize { error in
  if let error = error {
    /// 4: Handle possible errors
    print(error)
  }
  // Access watcherCount
  channelController.channel?.lastActiveWatchers
}

The maximum limit that can be used is 300, and the maximum offset that can be used is 10 000.

Listening to Changes in Watchers

A user already watching the channel can listen to users starting and stopping watching the channel with the realtime events:

let controller = client.watcherListController(query: .init(cid: .init(type: .messaging, id: "general")))

class MyChannelWatcherListDelegate: ChatChannelWatcherListControllerDelegate {
  func channelWatcherListController(_ controller: ChatChannelWatcherListController, didChangeWatchers changes: [ListChange<ChatUser>]) {
    // handle change
  }
}

controller.delegate = MyChannelWatcherListDelegate()

controller.synchronize()
© Getstream.io, Inc. All Rights Reserved.