Android

错题集

更新时间: 2024/03/14 16:36:29

本文汇总了云信 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 消息,进行了拦截,并设置了三方回调的扩展字段,但是客户端的消息发送方获取不到该扩展字段。

问题原因

回调服务请求客户的接口调用成功时(即 HTTP 请求的 code 码返回 200),客户端才能读取callbackExt的内容。

解决方案

  • HTTP 请求的 code 码返回 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 进程后,为什么会出现登录失败,没有回调以及调用其他方法失效问题?
  • 网络异常时手动登录失败,为什么网络恢复后没有正常登录成功?
  • 切换账号登录,为什么会导致丢失漫游消息?
  • 配置客户端反垃圾后,为什么目标信息未被拦截还能收到?