跳到主要内容

IMLib 4.X 升级到 5.X

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

修改集成方式

5.0.0 相较于旧版本,从静态库修改为动态库

5.1.1 动态库改为 XCFramework 形式。 Cocoapod 版本最低为 1.10.0 ,否则可能会无法加载 SDK 或者报 ld: framework not found RandomNames.xcframework

手动集成

  1. 将原先 IMLib SDK 依赖的系统库全部去掉,如果 App 或者其他 SDK 有依赖的系统库除外

    (height=200)

  2. General -> Frameworks,Libraries,and Embedded Binaries 中将 RongXX.framework 的 Embed 由 Do Not Embed 改为 Embed & Sign

  3. 引入的 IMLib 的特定头文件如 <RongIMLib/RCUserInfo.h> 修改,请参考常见问题 3。

  4. 打包上架时遇到报错 IPA processing failed,请参考常见问题 4。

pod 集成

方式一、全量库导入:

pod 'RongCloudIM/IMLib', '5.0.0'            # ChatRoom,Discussion、PublicService、CustomerService、Location、IMLibCore 的合集

方式二、根据需求对 SDK 选择性导入:

pod 'RongCloudIM/IMLibCore', '5.0.0'        # 基础通讯库,必须

pod 'RongCloudIM/ChatRoom', '5.0.0' # 聊天室,可选
pod 'RongCloudIM/Discussion', '5.0.0' # 讨论组,可选
pod 'RongCloudIM/PublicService', '5.0.0' # 公众号,可选
pod 'RongCloudIM/CustomerService', '5.0.0' # 客服,可选
pod 'RongCloudIM/Location', '5.0.0' # 实时位置共享,可选

RongIMLib 拆分

为减小 IMLib 本身的尺寸,加载速度,性能等指标,对 RongIMLib 进行了拆分,目前对外提供的 IMLib SDK 有两种:

一种是 RongIMLib,包含了所有功能,接口使用方式不用修改

另外一种是 拆分后的 RongIMLibCore(基本通信能力库)、RongCustomerService(客服)、RongPublicService(公众号)、RongDiscussion(讨论组)、RongChatRoom(聊天室) 和 RongLocation(实时位置共享),可以根据需求进行选择

// 单例类使用方式需要由原先的 [RCIMClient sharedRCIMClient] 修改为如下:
RongIMLibCore:[RCCoreClient sharedCoreClient]
RongCustomerService:[RCCustomerServiceClient sharedCustomerServiceClient]
RongPublicService:[RCPublicServiceClient sharedPublicServiceClient]
RongDiscussion:[RCDiscussionClient sharedDiscussionClient]
RongChatRoom:[RCChatRoomClient sharedChatRoomClient]
RongLocation:无

常见问题

1. 打包上架时报错:IPA processing failed

注意

建议一:升级到 5.1.1 及其以后版本

5.1.1 开始动态库以 XCFramework 形式存在,在打包时候 Xcode 会自动选择使用真机架构,不需要再脚本或者手动进行动态库模拟器架构的移除

如果 APP 依赖其他的动态库,可能还需要按照下面的步骤处理其他的 SDK

注意

建议二:在打包上架时添加删除模拟器架构的脚本

  1. 清空项目编译缓存:

    选择 Product -> Clean Build Folder,等待清空编译缓存

  2. 剔除打包不支持的 x86_64 和 i386 架构:

    1. 选择 TARGETS -> Build Phases。

    2. 单击加号,选择 New Run Script Phase。

    3. 添加如下代码:

      # 打包上架时需要添加此脚本

      echo "------ extract architectures start ----------------"
      APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

      find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
      do
      FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
      FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"

      EXTRACTED_ARCHS=()

      echo "----- FRAMEWORK_EXECUTABLE_NAME = $FRAMEWORK_EXECUTABLE_NAME ARCHS = $ARCHS -----"

      for ARCH in $ARCHS
      do
      lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
      EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
      done

      lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
      rm "${EXTRACTED_ARCHS[@]}"

      rm "$FRAMEWORK_EXECUTABLE_PATH"
      mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
      done

注意

建议三:在打包上架时手动删除模拟器架构

  1. 备份 SDK

  2. 进入到需要删除模拟器架构的 IMLib.framework 目录中

  3. 移除支持 x86_64,i386 的二进制文件

    // 此处以 IMLib 举例

    // 剔除模拟器架构
    lipo RongIMLib.framework/RongIMLib -remove x86_64 -remove i386 -output RongIMLib

    // 替换 framwork 内部二进制文件
    mv RongIMLib RongIMLib.framework/RongIMLib

    // 查看剥离后的二进制文件支持的 CPU 架构,如果显示 armv7 arm64,就可以重新打包了
    lipo -info RongIMLib.framework/RongIMLib

2. 如 <RongIMLib/RCUserInfo.h> 等这种特定头文件的导入报错

有两种处理方案:

第一、<RongIMLib/RCUserInfo.h> 改成 <RongIMLib/RongIMLib.h>

第二、<RongIMLib/RCUserInfo.h> 改成 <RongIMLibCore/RCUserInfo.h>