本文介绍客户端登录互动消息服务相关内容。
客户端SDK
您可以通过以下两种方式使用互动消息服务客户端SDK。
方式一:独立SDK
互动消息提供独立客户端SDK,支持包括Android、iOS、H5和微信小程序。
方式二:集成AUI
如果您已经集成了视频直播AUI,可以使用AUI提供的接口,调用互动消息服务。
SDK初始化
以Android端SDK初始化为例。
在App入口(如Application/Activity的onCreate中)进行初始化配置。
ImSdkConfig config = new ImSdkConfig();
config.deviceId = "deviceId"; //[选填]
config.appId = "appId"; //[必填]
config.appSign = "appSign"; //[必填]
int ret = AliVCIMEngine.instance().init(context, config);
您可在应用列表查看自动生成的AppId、AppKey、AppSign、创建时间等信息。
SDK登录
以Android登录为例。
ImLoginReq req = new ImLoginReq();
req.user.userId = userId;
//透传业务额外信息
Map<String, Object> data = new HashMap<>();
data.put("level", "high");
req.user.userExtension = App.getGson().toJson(data).toString();
req.userAuth = new ImAuth(nonce, timestamp, role, app_token);
AliVCIMEngine.instance().login(req, new ImSdkCallback());
app_token
参数的生成方式:
app_token = sha256(appId + appKey + userId + nonce + timestamp + role)
请确保传给客户端登录的参数,与生成token所使用的参数一致。
timestamp
是鉴权过期的时间戳从1970到过期时间的秒数。建议设置为当前时间+1天,表示该token一天内有效。如果过期,使用该token进行再次登录、重连都会失败。AppKey
是保证您的授权体系,不被攻击者利用的关键,请妥善保存,避免泄露。
监听连接状态
以Android SDK为例。
AliVCIMEngine.instance().addSdkListener(new ImSdkListener() {
@Override
public void onConnecting() {
}
@Override
public void onConnectSuccess() {
}
@Override
public void onConnectFailed(com.aliyun.im.common.Error error) {
}
@Override
public void onDisconnect(int code) {
}
// 登录token失效(如token过期)会通过该接口获取新的token,务必实现该接口
@Override
public void onTokenExpired(ImTokenCallback callback) {
// 第一步,实现新token的生成,若需要网络请求等耗时操作,请务必抛到异步线程实现;
// 第二步,若token生成失败,则通过 callback.onError() 回调错误信息;
// 若token生成成功,则通过 callback.onSuccess() 回调token信息;
}
@Override
public void onReconnectSuccess(ArrayList<ImGroupInfo> groupStatus) {
}
});
登录失败返回403时,检查登录Token,及各参数是否正确。
登录成功后,在Token将过期时,SDK会回调
onTokenExpired
。客户端应重新获取新的Token,并通过callback设置给SDK,以便SDK在遇到网络等问题时触发自动重连,确保Token有效。
最佳实践
业务服务器给客户端的返回包括以下内容。
{ "auth": { "nonce": "产生token所用的nonce", "timestamp": 131231234, //<传产生token所传递的timestamp值,数值类型> "role": "产生token所传递的role", "user_id": "产生token所用的userid" }, "app_id": "{您的应用AppID}", "app_sign": "{您的应用AppSign}", "app_token": "{生成的token}" }
SDK使用步骤1传回参数初始化.
SDK使用步骤1传回参数登录。
SDK检查登录回调。
登录成功,则继续后面的流程。
登录失败回调,打印排查。
在Token过期回调中(
onTokenExpired
),实现异步从您的业务服务器(图中的AppServer)更新timestamp,以获取新的Token以及其他对应参数,设置给SDK。
常见问题
登录与超时断连
登录是进行IM操作的首要步骤。客户端在执行任何与IM相关的交互操作之前,必须先完成登录过程。这包括但不限于加入群组、发送消息等操作。
当客户端主动登出或因网络超时等异常情况导致与服务器断开连接时,该用户的IM状态将自动更新为已登出。在此过程中,用户之前进行的所有操作,例如加入群组,都将失效。
默认的超时时长为90秒。一旦客户端成功登录,将与阿里云互动消息服务端维持心跳连接。若在连续90秒内,服务端未接收到任何心跳信号,则会判定该客户端已断开连接。
当消息群组内有客户端登录并参与时,该群组处于活跃状态。只有在群组处于活跃状态下,服务端才能向其发送消息或执行其他相关操作。
进入群组是Session的状态
当客户端加入一个群组时,这一操作是基于当前登录会话(Session)的状态进行的。如果用户关闭应用程序后重新登录,系统将为该用户创建一个新的会话。
登录失败,返回403
表明token校验没通过。检查token及对应的其他参数, 是否与服务端生成token使用的参数一致。将SDK登录用的参数做如下校验,查看返回的token是否与给定的token一致,检查timestamp是否过期等。
echo -n "{appId}{appKey}{userId}{nonce}{timestamp}{role}" | openssl dgst -sha256
// 注:用实际的内容填充时,记得去掉大括号。
角色Role
角色Role对应的权限可以查看客户端SDK对应操作。或署AppServer找身份权限系统说明,了解更多详情。
登录超时
检查网络环境是否有严格的出口限制。