HarmonyOS channels and metadata
Understand channel identity and connect user, group, and group-member metadata.
A channel answers “who should receive this message?” Always use channelId together with channelType. A personal channel ID is normally the other user's UID; a group channel ID is the group ID.
const personal = new WKChannel('bob', WKChannelType.personal)
const group = new WKChannel('team-1', WKChannelType.group)Constructing WKChannel does not create a user or group, and it does not bypass server authorization.
Supply user and group metadata
Install the metadata provider during application initialization:
WKIM.shared.config.provider.channelInfoCallback = async (
channelId: string,
channelType: number
): Promise<WKChannel | undefined> => {
const profile = await channelApi.get(channelId, channelType)
if (profile === undefined) return undefined
const channel = new WKChannel(channelId, channelType)
channel.channelName = profile.name
channel.channelRemark = profile.remark ?? ''
channel.avatar = profile.avatar ?? ''
return channel
}Read the local cache first, then request metadata when it is absent or stale:
const manager = WKIM.shared.channelManager()
const local = manager.getChannel('team-1', WKChannelType.group)
if (local === undefined) {
manager.fetchChannelInfo('team-1', WKChannelType.group)
}Observe refreshes:
const refreshListener = (channel: WKChannel) => {
updateTitleAndAvatar(channel)
}
manager.addRefreshListener(refreshListener)
// When the screen is disposed
manager.removeRefreshListener(refreshListener)Group members
channelMemberManager() owns member metadata. Its incremental provider receives the current maximum version:
WKIM.shared.config.provider.channelMemberCallback = async (
channelId: string,
channelType: number,
maxVersion: number
): Promise<WKChannelMember[]> => {
return memberApi.sync(channelId, channelType, maxVersion)
}
WKIM.shared.channelMemberManager().sync(
'team-1',
WKChannelType.group
)Read one member:
const member = WKIM.shared.channelMemberManager().getMember(
'team-1',
WKChannelType.group,
'alice'
)Do not return every member of a large group in one response. Use channelMemberWithPageCallback with getWithPageOrSearch for server-side pagination or search, and keep page sizes bounded.