Skip to content
tiger edited this page Feb 11, 2018 · 26 revisions

如何使用动态库?

1. 下载framework

直播SDK静态库位于framework/live/目录下 直播SDK动态库位于framework/live_dy/目录下

名称 库名称 库size ipa size iOS要求
直播SDK静态库 KSYMediaPlayer.framework 57M 2.9M 7.0及以上
直播SDK动态库 KSYMediaPlayer.framework 40M 3.5M 8.0及以上

2. 优缺点

  • 静态库体积更小,直播SDK对ipa的影响只有2.9M
  • 静态库iOS版本要求更低,只需要iOS 7.0。动态库要求的最低系统版本为iOS 8.0。
  • 动态库能解决ffmpeg冲突问题。
  • 静态库有依赖库,而动态库没有。静态库依赖以下第三方库:
    • libz.tbd
    • libstdc++.6.tbd

3. 使用说明

  1. 动态的framework位于framework/live_dy文件夹中,编译前需要修改Build Settings->Framework Search Paths为正确的路径
  2. 运行前Build Phases->Embed Frameworks选项中需要添加相应的framework,

playerdy.png

如果未进行以上配置,运行时将会出现如下错误

dyld: Library not loaded: @rpath/...
  Referenced from: ...
  Reason: image not found

4. 注意事项

为了能够顺利提交app至app store, 需要移除动态库中的x86_64和i386平台,具体操作如下:

进入KSYMediaPlayer.framework目录,执行命令:

  • lipo KSYMediaPlayer -remove x86_64 -output KSYMediaPlayer
  • lipo KSYMediaPlayer -remove i386 -output KSYMediaPlayer

执行完成后可使用lipo -info KSYMediaPlayer命令确认当前的动态库已经移除上面两个平台

如果不执行上述操作,那么在提交app store的时候,可能会出现ITMS-90087, ITMS-90209, ITMS-90125错误。

4.1 模拟器版本说明

从v1.8.1版本开始,我们已经在动态库中为您移除了i386和x86_64两个平台

如果需要以上两个平台的动态库,请您移步https://github.com/ksvc/KSYLive_iOS

下载工程后,进入releaseFramework文件夹,执行脚本

./release-libKSYLive.sh KSYMediaPlayer lite[或vod] dy

运行完成后,即可在../framework/dynamic文件夹中看到KSYMediaPlayer.framework,其中包含了arm64、armv7、armi386、armx86_64四个平台。

release-libKSYLive.sh脚本的使用方式可参考这里

5. iOS 7.0 版本上使用

如果app的Deployment Target是7.0,需要使用动态库时需要把Deployment Target升级到8.0。如果仍然需要维持APP的最低iOS版本7.0,需要做一些额外工作:

  1. 使用Weakly Linked
  2. 使用objc_getClass来找到对应的Class后进行调用

该方案只能发行越狱版本,提交APPStore后将导致iOS 7.x 版本运行crash。

6. Archive时Bitcode报错

v2.9.4及之前的版本,使用动态库打包时,会报bitcode的错误,具体信息如下:

bitcodeError.jpg

相应的解决方案如下:

  1. 进入releaseFramework/libKSYLive目录
  2. 打开libKSYLive.xcodeproj工程
  3. 删除所有target的Build Settings中有关bitcode的配置,如下图所示:

bitcodeConfig.png

  1. 重新配置bitcode,工程的Build Settings中增加自定义配置BITCODE_GENERATION_MODE,Debug时为marker,Release时为bitcode,具体示意图如下:

bitcodeNewCfg.jpg

  1. 配置完成后,回到releaseFramework目录,执行release-libKSYLive.sh脚本,即可在../framework/dynamic下面看到新生成的framework,需要注意的是,脚本生成的framework是含有i386和x86_64两个平台的,需要手动去掉,参考第4点

7. 调试支持平台:arm64、armv7、armi386、armx86_64。发布appStore的支持平台为 armv7, arm64

按照下面步骤

脚本代码

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

Clone this wiki locally