在线状态订阅与推送令牌

订阅关注用户的在线状态变化(上线/离线/被踢/注销),以及登记、查询、注销设备推送令牌。令牌只是台账,厂商通道投递能力请见推送专题。

平台调用风格

异步风格:Future<RcResult<T>>;错误码在 res.code,不使用异常表达业务失败。

接口一览​

操作语义传输返回
subscribePresence订阅用户在线状态(IDL rev20;客户端 REST `POST /api/apps/{appkey}/users/{userId}/presence/subscriptions`,userId 取自当前登录用户)。被订阅用户上线/离线/被踢/注销时通过长连接收到 `presence_changed`。订阅自己 1001;目标用户不存在/属于其它 app 1004;订阅总数上限 500(超限 1001);幂等(重复订阅不重复入列)。成功返回变更后的完整订阅列表 `{subscribed:[...]}`。好友关系本身已默认订阅对方在线状态,无需额外调用。REST(客户端){subscribed:string[]}
unsubscribePresence取消订阅用户在线状态(IDL rev20;客户端 REST `POST .../presence/subscriptions` 的 `unsubscribe` 分支)。取消未订阅的用户幂等成功(不报错);订阅自己 1001;目标用户不存在 1004。成功返回变更后的完整订阅列表 `{subscribed:[...]}`。仅停止接收该用户的实时在线状态帧,好友关系不受影响。REST(客户端){subscribed:string[]}
getPresenceSubscriptions查询当前用户的在线状态订阅列表(IDL rev20;客户端 REST `GET /api/apps/{appkey}/users/{userId}/presence/subscriptions`)→ `{userId,subscribed:[...]}`。只读、幂等、不产生事件。REST(客户端){userId:string, subscribed:string[]}
registerPushToken注册设备推送 token(IDL rev21 C23 收口;客户端 REST `POST /api/apps/{appkey}/push/tokens`,服务端 rev20 已实现,本 op 补 SDK 语义面)→ PushToken。幂等键 `(userId, platform, token)`:重复注册返回既有 tokenId 并重新置 active=true;`token` 8..=512 字符、`platform` ∈ ios|android|web|huawei|xiaomi|oppo|vivo|fcm、未知平台/长度非法 1001、每用户 20 个活跃 token 上限(超限 1001)、注销/封禁用户 1016;同一 (platform, token) 被其它用户注册时旧记录置 active=false(设备换绑)。REST(客户端)PushToken
unregisterPushToken注销本人设备推送 token(IDL rev21 C23;客户端 REST `DELETE /api/apps/{appkey}/push/tokens/{tokenId}`):软删除 active=false 并保留历史供审计 → `{tokenId,userId,platform,deleted,active:false,alreadyInactive}`。非本人或不存在 1001(不泄露他人 token);重复注销幂等成功(alreadyInactive=true)。REST(客户端){tokenId:string, userId:string, platform:string, deleted:bool, active:bool, alreadyInactive:bool}
getPushTokens查询本人设备推送 token(IDL rev21 C23;客户端 REST `GET /api/apps/{appkey}/push/tokens`)→ `{userId,tokens:[PushToken],total,activeTotal,platforms}`;含 active=false 历史,按 createdAt 倒序。只读、幂等、不产生事件。REST(客户端){userId:string, tokens:PushToken[], total:uint32, activeTotal:uint32, platforms:string[]}

本页 6 个操作,其中 6 个在本平台绑定中声明了方法签名。

跨端方法名​

操作AndroidWebElectronmacOSFlutterNative (C ABI)iOS
subscribePresencesubscribePresencesubscribePresencesubscribePresencesubscribePresencesubscribePresence—func
unsubscribePresenceunsubscribePresenceunsubscribePresenceunsubscribePresenceunsubscribePresenceunsubscribePresence—func
getPresenceSubscriptionsgetPresenceSubscriptionsgetPresenceSubscriptionsgetPresenceSubscriptionsgetPresenceSubscriptionsgetPresenceSubscriptions—func
registerPushTokenregisterPushTokenregisterPushTokenregisterPushTokenregisterPushTokenregisterPushToken—func
unregisterPushTokenunregisterPushTokenunregisterPushTokenunregisterPushTokenunregisterPushTokenunregisterPushToken—func
getPushTokensgetPushTokensgetPushTokensgetPushTokensgetPushTokensgetPushTokens—func

方法名在 GA 平台之间保持一致(规则 A);Native C ABI 只覆盖部分操作,其余操作以 — 标注。

subscribePresence​

订阅用户在线状态(IDL rev20;客户端 REST `POST /api/apps/{appkey}/users/{userId}/presence/subscriptions`,userId 取自当前登录用户)。被订阅用户上线/离线/被踢/注销时通过长连接收到 `presence_changed`。订阅自己 1001;目标用户不存在/属于其它 app 1004;订阅总数上限 500(超限 1001);幂等(重复订阅不重复入列)。成功返回变更后的完整订阅列表 `{subscribed:[...]}`。好友关系本身已默认订阅对方在线状态,无需额外调用。

subscribePresence(List<String> userIds)
REST(客户端)幂等since 1.4.0
参数
参数类型说明
userIdsstring[]必填;用户 ID 列表(批量接口通常有上限)
返回

{subscribed:string[]} 成功返回的数据;失败时按错误码处理

示例
Dart
final res = await engine.subscribePresence(['user2']);
if (res.code != 0) throw Exception(res.msg);
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1003FORBIDDEN客户端 / 参数 / 权限403否无权限
1004USER_NOT_FOUND客户端 / 参数 / 权限404否用户不存在

unsubscribePresence​

取消订阅用户在线状态(IDL rev20;客户端 REST `POST .../presence/subscriptions` 的 `unsubscribe` 分支)。取消未订阅的用户幂等成功(不报错);订阅自己 1001;目标用户不存在 1004。成功返回变更后的完整订阅列表 `{subscribed:[...]}`。仅停止接收该用户的实时在线状态帧,好友关系不受影响。

unsubscribePresence(List<String> userIds)
REST(客户端)幂等since 1.4.0
参数
参数类型说明
userIdsstring[]必填;用户 ID 列表(批量接口通常有上限)
返回

{subscribed:string[]} 成功返回的数据;失败时按错误码处理

示例
Dart
final res = await engine.unsubscribePresence(['user2']);
if (res.code != 0) throw Exception(res.msg);
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1003FORBIDDEN客户端 / 参数 / 权限403否无权限
1004USER_NOT_FOUND客户端 / 参数 / 权限404否用户不存在

getPresenceSubscriptions​

查询当前用户的在线状态订阅列表(IDL rev20;客户端 REST `GET /api/apps/{appkey}/users/{userId}/presence/subscriptions`)→ `{userId,subscribed:[...]}`。只读、幂等、不产生事件。

getPresenceSubscriptions()
REST(客户端)幂等since 1.4.0
返回

{userId:string, subscribed:string[]} 成功返回的数据;失败时按错误码处理

示例
Dart
final res = await engine.getPresenceSubscriptions();
if (res.code != 0) throw Exception(res.msg);
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1003FORBIDDEN客户端 / 参数 / 权限403否无权限

registerPushToken​

注册设备推送 token(IDL rev21 C23 收口;客户端 REST `POST /api/apps/{appkey}/push/tokens`,服务端 rev20 已实现,本 op 补 SDK 语义面)→ PushToken。幂等键 `(userId, platform, token)`:重复注册返回既有 tokenId 并重新置 active=true;`token` 8..=512 字符、`platform` ∈ ios|android|web|huawei|xiaomi|oppo|vivo|fcm、未知平台/长度非法 1001、每用户 20 个活跃 token 上限(超限 1001)、注销/封禁用户 1016;同一 (platform, token) 被其它用户注册时旧记录置 active=false(设备换绑)。

registerPushToken(RegisterPushTokenOptions options)
REST(客户端)幂等since 1.5.0
参数
参数类型说明
options{platform:string, token:string, deviceId?:string, appVersion?:string}必填;选项对象(字段见类型列):{ platform:string, token:string, deviceId?:string, appVersion?:string }
返回

PushToken 成功返回的数据;失败时按错误码处理

示例
Dart
final res = await engine.registerPushToken(RegisterPushTokenOptions(platform: 'android', token: 'TOKEN'));
if (res.code != 0) throw Exception(res.msg);
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1002INVALID_TOKEN客户端 / 参数 / 权限401否Token 无效或已过期
1016USER_BANNED客户端 / 参数 / 权限403否账号已被封禁

unregisterPushToken​

注销本人设备推送 token(IDL rev21 C23;客户端 REST `DELETE /api/apps/{appkey}/push/tokens/{tokenId}`):软删除 active=false 并保留历史供审计 → `{tokenId,userId,platform,deleted,active:false,alreadyInactive}`。非本人或不存在 1001(不泄露他人 token);重复注销幂等成功(alreadyInactive=true)。

unregisterPushToken(String tokenId)
REST(客户端)幂等since 1.5.0
参数
参数类型说明
tokenIdstring必填;字段含义见类型定义
返回

{tokenId:string, userId:string, platform:string, deleted:bool, active:bool, alreadyInactive:bool} 成功返回的数据;失败时按错误码处理

示例
Dart
final res = await engine.unregisterPushToken('pt_1001');
if (res.code != 0) throw Exception(res.msg);
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1002INVALID_TOKEN客户端 / 参数 / 权限401否Token 无效或已过期

getPushTokens​

查询本人设备推送 token(IDL rev21 C23;客户端 REST `GET /api/apps/{appkey}/push/tokens`)→ `{userId,tokens:[PushToken],total,activeTotal,platforms}`;含 active=false 历史,按 createdAt 倒序。只读、幂等、不产生事件。

getPushTokens()
REST(客户端)幂等since 1.5.0
返回

{userId:string, tokens:PushToken[], total:uint32, activeTotal:uint32, platforms:string[]} 成功返回的数据;失败时按错误码处理

示例
Dart
final res = await engine.getPushTokens();
if (res.code != 0) throw Exception(res.msg);
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1002INVALID_TOKEN客户端 / 参数 / 权限401否Token 无效或已过期

相关文档​