-
Notifications
You must be signed in to change notification settings - Fork 271
dylib
当前库中未包含动态库,需要自行编译输出
- clone KSYLive_iOS.git
- 进入releaseFramework目录
- 执行release-libKSYLive.sh脚本
- framework/dynamic目录下查找libksygpulive.framework
示例调用脚本如下
git clone https://github.com/ksvc/KSYLive_iOS.git KSYLive_iOS --depth 1
cd KSYLive_iOS/releaseFramework
./release-libKSYLive.sh libksygpulive lite dy
ls ../framework/dynamic
将出现libksygpulive.framework
使用动态库时,需要将libksygpulive.framework和GPUImage.framework添加至Embed Frameworks选项中, 具体配置如下图所示 如果未进行以上配置,运行时将会出现如下错误
dyld: Library not loaded: @rpath/...
Referenced from: ...
Reason: image not found
直播SDK位于framework目录下,ipa size是支持bitcode时的demo size,包含GPUImage和Bugly等第三方库。
名称 | 库名称 | 库size | ipa size | iOS要求 |
---|---|---|---|---|
直播SDK静态库 | libksygpulive.framework | 95M | 5.7M | 7.0及以上 |
直播SDK动态库 | libksygpulive.framework | 67M | 6.9M | 8.0及以上 |
为什么framework这么大?
因为framework包括了armv7/arm64/i386/x86_64 四个体系结构。
- 静态库体积更小,直播SDK对ipa的影响只有5.7M(含GPUImage和Bugly)
- 静态库iOS版本要求更低,只需要iOS 7.0。
- 动态库能解决ffmpeg冲突问题。
- 静态库对第三方库有更多的依赖库。静态库依赖以下第三方库:
- GPUImage.framework
- libstdc++.6.tbd
为了能够顺利提交app至app store, 需要移除动态库中的x86_64和i386平台,具体操作如下:
进入framework/dynamic/libksygpulive.framework目录,执行命令:
- lipo libksygpulive -remove x86_64 -output libksygpulive
- lipo libksygpulive -remove i386 -output libksygpulive
执行完成后可使用lipo -info libksygpulive 命令确认当前的动态库已经移除上面两个平台。
如果不执行上述操作,那么在提交app store的时候,可能会出现ITMS-90087, ITMS-90209, ITMS-90125错误。
该脚本位于releaseFramework文件夹下面, 使用它可以自行编译出需要的framework文件; 执行该脚本后,会在项目下生成framework文件夹(与releaseFramework平级);不同的编译类型,生成的framework会位于不同的子文件夹(static/dynamic)中
./release-libKSYLive.sh name format [dy]
参数说明:
name:framework名称
KSYMediaPlayer - 只支持播放的framework
libksygpulive - 集成播放和推流的framework
format:
lite - 适用于KSYMediaPlayer和libksygpulive,支持主流的音视频格式,不支持265推流
265 - 只适用于libksygpulive,支持主流的音视频格式,支持265推流
vod - 只适用于KSYMediaPlayer,支持绝大多数常见的音视频格式
dy:
可选项,如果不存在该参数,则编译静态的framework;如果存在该参数,则编译动态的framework
./release-libKSYLive.sh libksygpulive 265 dy
则在项目的framework/dynamic文件夹下生成libksygpulive.framework,它含有推流和播放功能,且支持265推流。
如果app的Deployment Target是7.0,需要使用动态库时需要把Deployment Target升级到8.0。如果仍然需要维持APP的最低iOS版本7.0,需要做一些额外工作:
- 使用Weakly Linked
- 使用objc_getClass来找到对应的Class后进行调用
该方案只能发行越狱版本,提交APPStore后将导致iOS 7.x 版本运行crash。
v2.9.4及之前的版本,使用动态库打包时,会报bitcode的错误,具体信息如下:
相应的解决方案如下:
- 进入releaseFramework/libKSYLive目录
- 打开libKSYLive.xcodeproj工程
- 删除所有target的Build Settings中有关bitcode的配置,如下图所示:
- 重新配置bitcode,工程的Build Settings中增加自定义配置
BITCODE_GENERATION_MODE
,Debug时为marker,Release时为bitcode,具体示意图如下:
- 配置完成后,回到releaseFramework目录,执行release-libKSYLive.sh脚本,即可在../framework/dynamic下面看到新生成的framework,需要注意的是,脚本生成的framework是含有i386和x86_64两个平台的,需要手动去掉,参考3.2。
按照下面步骤
脚本代码
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name 'KSYMediaPlayer.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done