iOS学习笔记-封装含静态库的动态库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shengpeng3344/article/details/52597201

推荐相关教程:

教程1

教程2

官网

动态库创建

1.首先,动态库上架是可以的(本人亲试),大胆的去做吧;

这里写图片描述

拷入相关静态库SDK,注意不能直接饮用静态库中文件,需要我们创建.h.m文件中转一下(至少我是这样做的)

以环信SDK为例(由于项目中其他SDK与环信SDK冲突)

这里写图片描述

同样需要导入此SDK静态库所依赖的动态库

这里写图片描述

2.由于我是要将整个UI封装到SDK,在对应的UI文件中已经进行了一次SDK调用,故我再使用自定义.h.m文件调用UI文件也符合逻辑。

由于要在appdelegate中响应方法,我们设置一个helper

这里写图片描述

这里写图片描述

在.m文件中写相关的处理逻辑即可,之后在appdelegate中调用此动态库文件;

pch文件在这里同样适用,配置好就行

这里写图片描述

值得注意:动态库所有的资源文件 如 图片,xib ,bundle文件,需要全部拷贝出动态库工程,放在一起,作为一个额外的动态库资源文件存在,不能再动态库中一起编译;因为图片路径要设置为相对动态库路径,修改繁琐,xib文件会转换成nib文件,需要重写加载xib方法等原因;

这是最终弄好后样子

这里写图片描述

Resource放置的为资源文件,这样加载就没问题;

3.注意的是 你在动态库中公开的头文件(.h)所#import的相关文件必须也是公开否则会报错,显示找不到该文件;(.m文件中#import不会有问题)

这里写图片描述

在Build Phases中设置即可;

文件可直接从左侧拖入,会自动从区域内转换过去;

公开所有SDK头文件(因为关系比较复杂,所以全部设public可以避免问题),然后自己创建的helper等文件也设置为public(建议#import放在.m中,这样就可以不必要全部导入)。

4.SDK不支持bitcode的需要设置

这里写图片描述

5.完成所有操作后编译就好

这里写图片描述

如出现下列类似问题

这里写图片描述

设置Build Settting ->Other linker flag 为 -read_only_relocs suppress

这里写图片描述

当然,这只能强制忽略错误,错误还是在的

使用

导入动态库,在General - >Embedded Binaries 加入动态库

这里写图片描述

合并动态库

选择工程

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

拷入脚本

# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

编译即可

这里写图片描述

上架

上架时动态库需要编译真机版本,不能使用合并的版本(即通用版本),我想就是为啥我用一些SDK(使用动态库的 ),他们只支持真机。合并版本会报 x86_64 i386错误

静态库可以提供通用版本,编译之后即成为所需要版本;(一般静态库很大,编译后就很小了)

如何编译真机和模拟器版本?

真机
这里写图片描述

模拟器
这里写图片描述

编译后
这里写图片描述

即可找到

展开阅读全文

没有更多推荐了,返回首页