推送令牌登记

deviceToken 由 APNs 生成,会随重装、恢复备份、系统更新而变化;每次拿到新 token 都应调用 IMLib 的推送令牌接口登记。IMLib 维护用户 × 平台 × token 的台账,服务端据此投递离线推送。

能力​

操作用途幂等 / 语义
registerPushToken登记设备推送 token按 `(userId, platform, token)` 幂等;重复登记返回既有 tokenId 并置 active
getPushTokens查询本人 token 台账只读;含历史失效记录,按 createdAt 倒序
unregisterPushToken注销 token软删除(active=false);重复注销幂等成功

登记时机​

  • 拿到 deviceToken 后立即登记(`didRegisterForRemoteNotificationsWithDeviceToken`)。
  • 登录成功、切换账号后重新登记:token 属于设备,但台账按用户隔离。
  • App 升级后如果 token 变化,重新登记;旧 token 由服务端按换绑规则置为失效。
  • 退出登录时注销当前设备的 token,避免下一个账号收到上一个账号的推送。

令牌生命周期​

阶段动作说明
首次安装APNs 下发 token → 登记同设备同用户重复登记幂等
换账号注销旧账号 token → 登记新账号 token避免串号推送
重装 / 恢复备份token 变化 → 重新登记旧 token 可能仍有效一段时间,服务端按换绑置失效
多设备每台设备各自登记每用户活跃 token 上限 20;超限返回 1001
卸载无法主动上报;服务端按 APNs 反馈清理标记失效后不再投递

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(设备换绑)。

项值
Swiftfunc registerPushToken(options: IMPRegisterPushTokenOptions) async -> RcResult<IMPPushToken>
Objective-C- (void)registerPushTokenWithOptions:(NSDictionary<NSString *, id> *)options completion:(void (^)(IMPOSResult *result))completion
传输REST(HTTP)
幂等是

参数​

参数类型必填说明
options{platform:string, token:string, deviceId?:string, appVersion?:string}是选项对象(字段见类型列):{ platform:string, token:string, deviceId?:string, appVersion?:string }

返回​

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

示例(Swift / Objective-C)​

let deviceToken = "TOKEN"
let tokenPush = await client.registerPushToken(options: IMPRegisterPushTokenOptions(platform: "ios", token: deviceToken))
print(tokenPush.code)
[client registerPushTokenWithOptions:@{ @"platform": @"ios", @"token": @"TOKEN", @"deviceId": @"dev_1001", @"appVersion": @"1.0.0" } completion:^(IMPOSResult *result) {
    if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1002INVALID_TOKEN客户端 / 参数 / 权限401否Token 无效或已过期
1016USER_BANNED客户端 / 参数 / 权限403否账号已被封禁

getPushTokens​

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

项值
Swiftfunc getPushTokens() async -> RcResult<IMPPushTokenListResult>
Objective-C- (void)getPushTokensWithCompletion:(void (^)(IMPOSResult *result))completion
传输REST(HTTP)
幂等是

参数​

参数类型必填说明

返回​

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

示例(Swift / Objective-C)​

let tokens = await client.getPushTokens()
print(tokens.code)
[client getPushTokensWithCompletion:^(IMPOSResult *result) {
    if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1002INVALID_TOKEN客户端 / 参数 / 权限401否Token 无效或已过期

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)。

项值
Swiftfunc unregisterPushToken(tokenId: String) async -> RcResult<IMPUnregisterPushTokenResult>
Objective-C- (void)unregisterPushTokenWithTokenId:(NSString *)tokenId completion:(void (^)(IMPOSResult *result))completion
传输REST(HTTP)
幂等是

参数​

参数类型必填说明
tokenIdstring是字段含义见类型定义

返回​

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

示例(Swift / Objective-C)​

let removed = await client.unregisterPushToken(tokenId: "pt_1001")
print(removed.code)
[client unregisterPushTokenWithTokenId:@"pt_1001" completion:^(IMPOSResult *result) {
    if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1002INVALID_TOKEN客户端 / 参数 / 权限401否Token 无效或已过期

端到端示例​

Objective-C 示例已隐藏(含未导出符号)

该示例引用了 SDK 头文件未导出的符号(多为 Swift 专用 helper)。请使用下表真实 ObjC 类,或参考对应组件页的 Objective-C 接入说明。

可用 ObjC 类用途
IMPOSClientIMLib 客户端(连接、消息、会话、群组等)
IMPOSChatViewControllerIMKit 会话页(真实 ObjC 类)
IMPOSConversationListViewControllerIMKit 会话列表页(真实 ObjC 类)
IMPOSGlobalChatViewControllerGlobal UIKit 会话页(真实 ObjC 类)
IMPOSGlobalChatListViewControllerGlobal UIKit 会话列表页(真实 ObjC 类)
let refresh = await client.registerPushToken(options: IMPRegisterPushTokenOptions(platform: "ios", token: "TOKEN2"))
print(refresh.code)
token 不是消息通道

推送只负责提醒;消息正文与历史必须由 IMLib 连接后补收。不要仅凭推送内容拼装会话状态。