IM 即时通讯
Android
新手接入指南
产品介绍
简介
主要功能
产品优势
海外数据中心
接口及业务限制
功能介绍
帐号集成与登录
群组功能
聊天室功能
聊天室标签功能
圈组功能
多端登录与互踢策略
质量数据监控台
更新日志
IM UIKit 更新日志
NIM SDK 开发版更新日志
NIM SDK 稳定版更新日志
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
实现单聊消息收发(不含 UI)
实现圈组消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能列表
快速集成 IM UIKit
组件导入
初始化
界面跳转
自定义用户信息
全局配置
IM UIKit API 概览
会话列表相关
集成会话列表界面
会话列表事件监听
自定义会话列表界面 UI
会话列表 API 概览
会话消息相关
集成会话界面
会话界面事件监听
实现自定义消息发送(含 UI)
自定义会话界面 UI
会话消息 API 概览
通讯录相关
集成通讯录界面
自定义通讯录界面 UI
通讯录界面事件监听
通讯录 API 概览
不含 UI 集成
使用说明
集成与初始化
登录管理
消息相关
消息概述
消息收发
自定义消息收发
消息配置选项
多媒体资源存储场景
广播消息收发
消息已读回执
消息撤回
消息重发与转发
消息更新
消息过滤
语音消息处理
插入本地消息
历史消息
最近会话
服务端会话服务
用户资料
用户关系
在线状态订阅
系统通知
离线推送与消息提醒
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
聊天室
圈组功能
登录管理
服务器相关
服务器概述
服务器管理
服务器成员管理
服务器未读数管理
频道相关
频道概述
频道管理
频道黑白名单
频道未读数管理
实时互动频道
频道分组
频道分组黑白名单
搜索服务器和频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
用户定制权限
频道分组身份组
自定义权限
成员权限查询与判定
身份组相关查询
圈组订阅机制
消息相关
图解圈组消息流转
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
会话消息回复(Thread)
圈组快捷评论
消息正在输入
获取频道最后一条消息
查询历史消息
圈组消息缓存
圈组消息搜索
系统通知
圈组离线推送
圈组内容审核
圈组相关抄送
圈组第三方回调
反垃圾
聊天扩展
其他
最佳实践
IM 应用隐私合规
聊天室重要消息投递
API 参考
Android API 参考
Android 端状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
开通聊天室功能
常见问题
FAQ
错题集
Android 端推送问题排查
服务协议

错题集

更新时间: 2022/11/14 15:26:44

本文汇总了云信 IM 即时通讯的开发者在各个场景实践过程中的易错问题以及对应的解题思路,帮助您避开别人踩过的坑,为您的开发提效加速。

为什么应用上架到 Google 商店,出现安全提示,导致无法上架?

问题描述

客户需要将应用上架到 Google 商店时,被检测到有一处使用了不安全的加密模式的问题,导致无法上架。

问题原因

Google 不支持 AES/ECB/PKCS5Padding 的加密模式。

解决方案

在 NIM SDK 8.11.5 之后的版本去除了该加密模式,可以进行升级处理。

遍历发送同一张图片/文件,为什么会发送失败?

问题描述

遍历发送同一张图片/文件,有时会出现返回 699 ,出现报错。

问题原因

图片/文件上传的过程中,系统会根据文件地址缓存该次上传的 token,由于上传是多线程进行的,所以如果是同一个文件同时多次上传,会导致再次上传时获取上次缓存的 token,从而导致查询上传偏移量时出现问题。

解决方案

我们不支持同时上传同一张图片/文件,如果有这种需求,建议参考以下方案:

  • 批量发文件消息时,检测是否包含重复的文件地址,如果有重复的文件,消息需要依次发送。

  • 如果同时上传的文件是固定的,建议提前生成一个永久固定的 url 地址,发该文件时直接使用 url 地址发送。

手动调用登录接口失败,为什么报错信息显示已登录?

问题描述

自动登录过程中调用手动登录接口失败,并返回错误码 509 ,显示登录状态是 LOGINED。

问题原因

SDK不支持同时登录两个账号,并且登录状态是单例维护的,如果同时存在两个登录过程会导致登录状态发送混乱。

解决方案

自动登录期间不要使用手动登录接口进行登录。

出现这类问题一般是对自动登录的理解有误造成的。一个账号手动登录成功后,再次启动应用时可以使用自动登录接口。即使自动登录失败,NIM SDK 内部也存在重连逻辑,最终保证登录成功,所以在自动登录期间不需要使用手动登录接口。

// 在初始化SDK的时候,将本地所存的account与token传入loginInfo(),用以自动登录
NIMClient.init(this, loginInfo(), options());

为什么客户端消息发送方无法获取第三方回调的扩展字段?

问题描述

用户在服务端对 IM 消息,进行了拦截,并设置了三方回调的扩展字段,但是客户端的消息发送方获取不到该扩展字段。

问题原因

只有服务端responseCode返回 200 时,客户端才能读取callbackExt的内容。

解决方案

  • 将服务端的responseCode设置为 200,其他信息以 json 的形式放在callbackExt中。
  • 客户端需要在消息状态变化回调中获取callbackExt字段的内容。

为什么消息对象的反垃圾结果在命中后为空?

问题描述

命中反垃圾后,在消息状态变更的监听中获取到的message对象的反垃圾结果为null

问题原因

V5 以上版本的安全通才会有反垃圾这个字段。

解决方案

  • 联系商务确认当前使用的安全通版本是否为 V5 以上版本,如果不是,让商务在后台进行修改。
  • 客户端从 8.7.0 版本开始支持反垃圾结果查询。

启动 App 后,为什么会出现卡顿,查看日志会出现频繁打印的情况?

问题描述

App 启动时,应用会出现使用不流畅的情况,查看 logcat 日志 IM 相关日志频繁打印。

问题原因

有可能是因为频繁调用阻塞查询本地数据的接口,这类接口会查询本地数据库,如果在 UI 线程中循环调用会出现性能问题,从而导致 UI 卡顿。可以通过在 logcat 日志中过滤TransExec: execute Transaction关键字,确认是否有 IM 接口频繁调用的情况,尤其需要注意xxxBlock();这类同步方法。

解决方案

  1. 确认是否为业务层实现有问题,通过调整业务层逻辑,避免接口频繁调用。
  2. 查看 API 确认是否有批量查询的方法,避免循环调用。例如TeamService.queryTeamBlock可以改为TeamService.queryTeamListBlock
  3. 改为异步调用方法,或者放在子线程中调用,防止 UI 卡顿。

Android 12 发送 Glide 的缓存图片,为什么会失败?

问题描述

Android 12 发送 Glide 的缓存图片失败,sendMessage 接口返回 500,出现以下报错信息:

java.io.FileNotFoundException: xxxx :open failed: EACCES (Permission denied)

问题原因

Android 11 以上对写文件的操作有限制,只能在应用的私有目录下进行写文件操作。

解决方案

在 NIM SDK 初始化时,给SDKOptions.sdkStorageRootPath配置私有目录,如"/sdcard/Android/data/包名/files"。

启动 push 进程后,为什么会出现登录失败,没有回调以及调用其他方法失效问题?

问题描述

在 NIM SDK 的 push 进程中初始化其他 SDK 后,出现登录不成功,没有回调以及调用其他方法失效等问题。

问题原因

NIM SDK 会启动一个子进程,子进程启动时会重新触发 Application#onCreate,如果不加进程判断会导致其他的三方库也会额外初始化一次。此时其他三方库可能会出现崩溃,进而导致 NIM SDK 侧出现登录不成功或调用接口失效等问题。

上述子进程是 IM 的专属进程,无需初始化其他的三方库,从而造成不必要的内存浪费和意外情况。

解决方案

在应用的 Application#onCreate 中添加进程判断,避免 IM 进程启动时初始化其他三方库。

网络异常时手动登录失败,为什么网络恢复后没有正常登录成功?

问题描述 因为网络异常的原因连接断开,又尝试手动登录失败的情况下,网络恢复后没有正常登录成功。

问题原因

长连接断开后会触发 UNLOGIN 回调,若此时主动调用 AuthService/login 接口,大概率会失败(因为当时网络本身就有问题)。

当客户侧网络恢复后不会正常登录,是由于上次调用 AuthService/login 接口手动登录失败,导致 SDK 不会走重连逻辑,不会进行自动重连。

解决方案

AuthService/login 登录成功后,若触发了 UNLOGIN 回调,不需要尝试重新手动登录,SDK 内部有重连逻辑,会自动重连。

切换账号登录,为什么会导致丢失漫游消息?

问题描述 登录后未登出,切换其他账号登录后,漫游时间戳异常,导致漫游消息丢失。

问题原因

账号未登出,直接登录不同账号导致。

前台进程维护第一个账号;后台进程维护第二个账号。因此后台进程找前台进程取同步时间戳时,前台进程会取第一个账号下 SP 中的时间戳,所以导致异常。

解决方案

建议用户先调用 logout 登出账号,并保证本次登出(logout)和下一次登录(login)操作之间间隔至少 3s。

配置客户端反垃圾后,为什么目标信息未被拦截还能收到?

问题描述

用户在配置好客户端反垃圾后,目标信息未被拦截,接收方仍能接收到。

问题原因

客户端反垃圾只提供 API 检测能力,不直接拦截消息。

解决方案

客户端通过反垃圾的 API,传入需要检测的消息文本,根据返回的检测结果,在应用层自行判断消息是否需要发送,以此来实现客户端反垃圾逻辑。

此文档是否对你有帮助?
有帮助
我要吐槽
  • 为什么应用上架到 Google 商店,出现安全提示,导致无法上架?
  • 遍历发送同一张图片/文件,为什么会发送失败?
  • 手动调用登录接口失败,为什么报错信息显示已登录?
  • 为什么客户端消息发送方无法获取第三方回调的扩展字段?
  • 为什么消息对象的反垃圾结果在命中后为空?
  • 启动 App 后,为什么会出现卡顿,查看日志会出现频繁打印的情况?
  • Android 12 发送 Glide 的缓存图片,为什么会失败?
  • 启动 push 进程后,为什么会出现登录失败,没有回调以及调用其他方法失效问题?
  • 网络异常时手动登录失败,为什么网络恢复后没有正常登录成功?
  • 切换账号登录,为什么会导致丢失漫游消息?
  • 配置客户端反垃圾后,为什么目标信息未被拦截还能收到?