前言
公司要做聚合收银台,包含微信、支付宝、银联等第三方支付,里面还用到了一些三方的加密库,如果都打包在我们的sdk中,商户集成sdk可能会有冲突, 一般2种解决方式,方法一把sdk中的三方代码都放在sdk外面做外部引用,方法二修改SDK中类名称,若不能修改,让商户删除他们依赖的库,只保留sdk中的库文件。
修改类名请参考 Xcode批量修改类名、属性名(一键修改类名、属性名等)
一 、外部引用
在制作framework时,如果framework中使用了其他的第三方framework或者静态.a的库。为了防止和集成方的项目工程中使用了同一个第三方库。可以使用外部引用的方式,集成方必须同时导入所需要的第三方库以及我们制作的framework库,最终解决共用同一个第三方库引起的项目冲突问题。
制作步骤:
1.在xcode工程中选择BuildSettings,搜索Mach-O Type,选择Static Library 静态链接的打包形式,如下图(外部引用步骤1):
2.将指定的第三方framework库或者静态.a库文件拖入项目工程指定路径下(本文以支付宝sdk为例)。如下图:
注意:拖入时Add to targets选项中的勾选项取消
3.在xcode工程中选择BuildSettings,搜索Search Paths,如果第二步拖入的是动态framework,在Framework Search Paths下添加该framework所在的工程路径;如果是.a静态库,在Library Search Paths下添加该库的工程路径,如图:
"${PODS_ROOT}/AlipaySDK-iOS”
4.添加framework所需的系统依赖库
5.选择自己的framework库对应target,检查Build Phases --> Link Binary With Libraries 中是否动态链接所需要的系统依赖库以及第三方库。
6.以上步骤没问题然后编译打包,如图编译成功,在products文件夹下会生成一个自己的framework。
7.合成framework。以上编译后的framework 是支持真机或者模拟器的framework,我们对外提供framework时需要把这这2个包合并。我们用脚本自动合并。
a、 Build Phases --> New Run Script Phase
b、加入以下代码
if [ "${ACTION}" = "build” ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}”
fi
mkdir -p "${INSTALL_DIR}”
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/“
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}”
open "${SRCROOT}/Products”
fi
c、编译后会自动弹出打包好的framework ,直接拖拽到三方项目中使用即可。
8.sdk引用可以直接拖拽到工程里,或者看我另外一篇《用pod管理本地三方库 》
二、内部引用
在制作framework时,如果framework中使用了其他的第三方framework或者静态.a的库。并且集成方不考虑framework中包含的第三方库冲突问题,集成方可以直接导入我们制作的framework库。
制作步骤:
只需要在上面第二步时 :拖入时Add to targets选项中的勾选项选中即可,其余步骤与上面外部引用步骤一致。