跳到主要内容

IMKit 4.X 升级到 5.X

本文描述 IMKit SDK 从 4.X 到 5.X 版本的升级步骤。

变更说明

注意

IMKit SDK 5.x 版本正式开源,此开源版本基于 MVVM 架构重构完成,因此和 2.x、4.x 版本不兼容,无法平滑升级。

详细变更说明如下:

1. 依赖包更改

Google 2018 IO 大会推出了扩展库 AndroidX,AndroidX 是对 android.support.xxx 包的整理后产物,Google 官方早已明确声明不再维护 support 包。因此融云 IMKit SDK 5.X 及以后版本更改为通过 AndroidX 实现,不再支持 support 包!

注意

如果您应用依赖于 support 包,可参考 AndroidX 迁移文档 将依赖转换为 AndroidX 后,再集成 IMKit SDK 5.X版本。

2. 类路径调整

IMKit SDK 5.X 版本重构了 SDK 的架构,通过 MVVM 框架实现,导致很多类路径发生了更改,下表列出了 5.X 之前版本对外公开类的路径变更:

2.x 、4.x 版本路径5.x 版本路径
io.rong.imkit.fragment.ConversationListFragmentio.rong.imkit.conversationlist.ConversationListFragment
io.rong.imkit.fragment.ConversationFragmentio.rong.imkit.conversation.ConversationFragment
io.rong.imkit.RongExtension无法直接替换。请按照 IMKit 5.x 的文档说明重新集成插件。
io.rong.imkit.userInfoCache.RongUserInfoManagerio.rong.imkit.userinfo.RongUserInfoManager
io.rong.imkit.mention.RongMentionManagerio.rong.imkit.feature.mention.RongMentionManager
io.rong.imkit.manager.IUnReadMessageObserverio.rong.imkit.manager.UnReadMessageManager.IUnReadMessageObserver
io.rong.imkit.RongConfigurationManagerio.rong.imkit.utils.language.RongConfigurationManager

关于路径调整的说明

  1. 参照上表,在 AndroidStudio 中 command+shift+R 全局搜索旧的类路径,替换为新路径。
  2. io.rong.imkit.RongExtension 无法用替换的方式升级。请按照 IMKit 5.x 的文档说明重新集成插件。
  3. 如果深度定制化了 IMKit SDK,部分类路径的调整可能不在上述列表中,升级以后 AndroidStudio 会有红色报错。删除报错类里红色未识别的导入路径,鼠标停留到报错的地方,根据 AndroidStudio 的提示导入新路径即可。如果有多个地方使用了该路径,可以参考第一步里的方法,全局搜索并替换。

3. 集成方式变更

页面跳转时由原先的隐式调用方式更改为显示调用, 因此集成步骤有所简化和更改。您需要先移除旧版本 AndroidManifest.xml 文件中关于 IMKit SDK 的配置,参考官网文档重新集成。

4. RongIM 接口变化

  • 连接接口返回值变动。

    connect() 方法返回值由 RongIM 更改为 void.

  • 接口名称更改

    2.x、4.x 接口5.x 接口
    removeOnReceiveMessageListener
    removeConnectionStatusListener
    setSendMessageListenersetMessageInterceptor
    sendImageMessagesendMediaMessage
    setMaxVoiceDurationgsetMaxVoiceDuration
    startConversationList
    startPublicServiceProfile
  • 接口迁移。用户信息相关接口由 RongIM 迁移到了单独类 UserDataProvider 中。

    2.x、4.x 接口5.x 接口
    RongIM.UserInfoProviderUserDataProvider.UserInfoProvider
    RongIM.GroupInfoProviderUserDataProvider.GroupInfoProvider
    RongIM.GroupUserInfoProviderUserDataProvider.GroupUserInfoProvider
  • RongIM 移除了以下和 UI 无关的接口,可改为调用 IMLib 核心类 RongIMClient 里的同名方法

    移除接口
    saveTextMessageDraft
    setMessageExtra
    setMessageReceivedStatus
    setServerInfo
    setStatisticDomain
    supportResumeBrokenTransfer
    searchPublicService
    searchPublicServiceByType
    subscribePublicService
    unsubscribePublicService
    downloadMedia
  • 删除了以下接口,不再支持。

    接口名称
    refreshDiscussionCache
    createDiscussion
    createDiscussionChat
    getDiscussion
    quitDiscussion
    addMemberToDiscussion
    recordNotificationEvent
    isNotificationQuiteHoursConfigured
    getEncryptedSessionStatus
    getAllEncryptedConversations
    quitEncryptedSession
    isRegisted
    getHistoryMessages() 废弃方法
    disconnect() 废弃方法
  • 删除了旧版本里的废弃接口

5. 消息展示模板变更

列表页由 ListView 更改为效率更高的 RecycleView,因此自定义消息的展示模板需要对应调整。

  • 将自定义消息的展示模板更改为继承 BaseMessageItemProvider<>, 并实现基类方法。
  • 移除展示模板里原先的注解,原注解属性可在新模板构建类里通过调用基类成员 mConfig 的各个方法进行配置
import android.content.Context;
import android.text.Spannable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

import io.rong.imkit.R;
import io.rong.imkit.model.UiMessage;
import io.rong.imkit.widget.adapter.IViewProviderListener;
import io.rong.imkit.widget.adapter.ViewHolder;
import io.rong.imlib.model.MessageContent;

public class CustomMessageItemProvider extends BaseMessageItemProvider<CustomMessage> {

public CustomMessageItemProvider(){
mConfig.showSummaryWithName = false; // 配置模板基本属性。
}
/**
* 创建 ViewHolder
* @param parent 父 ViewGroup
* @param viewType 视图类型
* @return ViewHolder
*/
@Override
protected ViewHolder onCreateMessageContentViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_message_item, parent, false);
return new ViewHolder(parent.getContext(), rootView);
}

/**
* 设置消息视图里各 view 的值
* @param holder ViewHolder
* @param parentHolder 父布局的 ViewHolder
* @param customMessage 此展示模板对应的消息
* @param uiMessage {@link UiMessage}
* @param position 消息位置
* @param list 列表
* @param listener ViewModel 的点击事件监听器。如果某个子 view 的点击事件需要 ViewModel 处理,可通过此监听器回调。
*/
@Override
protected void bindMessageContentViewHolder(ViewHolder holder, ViewHolder parentHolder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {

}

/**
* @param holder ViewHolder
* @param customMessage 自定义消息
* @param uiMessage {@link UiMessage}
* @param position 位置
* @param list 列表数据
* @param listener ViewModel 的点击事件监听器。如果某个子 view 的点击事件需要 ViewModel 处理,可通过此监听器回调。
* @return 点击事件是否被消费
*/
@Override
protected boolean onItemClick(ViewHolder holder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
return false;
}

/**
* 根据消息内容,判断是否为本模板需要展示的消息类型
*
* @param messageContent 消息内容
* @return 本模板是否处理。
*/
@Override
protected boolean isMessageViewType(MessageContent messageContent) {
return messageContent instanceof CustomMessage ;
}

/**
* 在会话列表页某条会话最后一条消息为该类型消息时,会话里需要展示的内容。
* 比如: 图片消息在会话里需要展示为"图片",那返回对应的字符串资源即可。
* @param context 上下文
* @param customMessage 自定义消息
* @return 会话里需要展示的字符串资源
*/
@Override
public Spannable getSummarySpannable(Context context, CustomMessage customMessage) {
return null;
}
}

6. 扩展区域自定义方式变更

输入区域配置方式变更,提供了 DefaultExtensionConfig 类,该类提供了 SDK 默认插件列表和表情列表。可以通过复写此类调整插件的位置或进行增减。

7. 本地通知变更

​当应用退到后台后,同一个人发来多条消息时,本地通知由之前的折叠显示方式更改为分条显示。

8. 内部实现变更

  • 资源名称变更。IMKit SDK 5.x 版本重新统一了资源名称的命名,如果您自定义了部分资源文件,可参考官网自定义文档,重新替换对应名称的资源。
  • 移除了 EventBus 。IMKit 5.x 版本不再依赖于 EventBus 进行事件分发,更改为通过观察者模式实现。如果您应用里使用了旧版本 SDK 里的 EventBus, 升级后需要您从应用层自己引入依赖。
  • 移除 RongContext 类。如果您应用里有调用 RongContext 作为上下文使用的地方,请更改为调用您自己的应用上下文。
  • 由于更改为 MVVM 框架,原 fragment 里很多业务相关接口被移除,您可参考官网 5.x 版本文档重新进行页面自定义。

4.X 版本升级指导

1. 依赖 Androidx

IMKit 5.x 版本不再支持 support 包,开发者需要参考 AndroidX 迁移文档 将应用的依赖转换为 Androidx.

2. 连接接口变更

连接接口的返回值由 RongIM 更改为 void 类型即可。

3. 适配会话列表 ConversationListFragment

  • 删除 ConversationListFragment 集成时对 setUri() 的调用,原 setUri() 的参数改为下面方法配置:

      RongConfigCenter.conversationListConfig().setDataProcessor(new DataProcessor<Conversation>() {
    @Override
    public Conversation.ConversationType[] supportedTypes() {
    return supportedTypes; //此处返回会话列表支持的会话类型
    }

    @Override
    public List<Conversation> filtered(List<Conversation> data) {
    return data;
    }

    @Override
    public boolean isGathered(Conversation.ConversationType type) {
    if (type.equals(Conversation.ConversationType.SYSTEM)) {
    return true; //需要聚合显示的会话,返回 true.
    } else {
    return false;
    }
    }
    });

    SDK 默认支持所有会话类型,都非聚合显示。如果您没有自定义需求,可以不进行上述设置,直接去掉 setUri() 的调用即可。

  • 将会话列表 activity 注册到 SDK。

    RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationListActivity, CustomConversationListActivity.class);
  • 更改会话列表页面启动方式,去掉老版本如下代码:

    RongIM.getInstance().startConversationList(Context , supportedConversation);

    改为调用如下方法:

    RouteUtils.routeToConversationListActivity(context,title);

4. 适配会话页面 ConversationFragment

  • 将会话 activity 注册到 SDK

    RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, CustomConversationListActivity.class);

5. 设置用户信息

用户信息相关接口所属类由 RongIM 迁移到 UserDataProvider 类中, 删除原用户信息接口指定的父类 ’RongIM.‘,AndroidStudio 会引导 import 新的路径,根据提示操作即可。

6. 适配新的自定义方式

由于架构的变更,原 fragment 里很多业务相关接口被移除,开发者需要根据原自定义需求参考 5.x 文档自定义部分重新适配。