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
手动集成
-
将原先 IMLib SDK 依赖的系统库全部去掉,如果 App 或者其他 SDK 有依赖的系统库除外
-
General -> Frameworks,Libraries,and Embedded Binaries 中将 RongXX.framework 的 Embed 由 Do Not Embed 改为 Embed & Sign
-
引入的 IMLib 的特定头文件如
<RongIMLib/RCUserInfo.h>
修改,请参考常见问题 3。 -
打包上架时遇到报错
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
注意
建议二:在打包上架时添加删除模拟器架构的脚本
-
清空项目编译缓存:
选择 Product -> Clean Build Folder,等待清空编译缓存
-
剔除打包不支持的 x86_64 和 i386 架构:
-
选择 TARGETS -> Build Phases。
-
单击加号,选择 New Run Script Phase。
-
添加如下代码:
# 打包上架时需要添加此脚本
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
-
注意
建议三:在打包上架时手动删除模拟器架构
-
备份 SDK
-
进入到需要删除模拟器架构的 IMLib.framework 目录中
-
移除支持 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>