静态库在程序编译时会被链接到目标代码中,链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝
.a + .h + sourceFile = .framework
1.File->New->Target->iOS->Framework & Library -> Framework -> XXXSDK,Team可以选择None,这样FrameWork不参与签名,任何人、组织都可以使用
3.设置为静态库TARGETS -> Build Setting -> Mach-O Type -> 选择Static Library,默认新创建的都为动态库,Link With Standard Libraries 设置为NO,包瘦身 Build Setting ->Dead Code Stripping 是对程序编译出的可执行二进制文件中没有被实际使用的代码进行Strip操作(可改可不改)
4.设置支持的架构 TARGETS -> Build Setting -> Build Active Architecture Only -> NO,YES:仅支持当前运行设备(模拟器或真机)下的架构,NO:支持所有的架构,这样可能会导致编辑过程比较慢,可以暂时设置为YES,上线是一定要设置为NO
6.TARGETS —> Build Phases —> Headers 将需要呈现出来的头文件,直接从Project拖到Public中. 不想呈现出来的.h文件不建议拖到Private中. 放在project中即可,项目中暂时用的swift,所以没关注这个
8.完成之后,选择真机或模拟器编辑,在项目的Products下,找到XXXSDK.framework,show in finder,会看到对应的文件,Release-iphoneos和Release-iphonesimulator文件夹,对应的分别是真机和模拟器下的SDK,通过lipo合并SDK为真机和模拟器下都能运行的SDK,具体分两种方式
2)将模拟器和真机下的SDK进行合并lipo -create 真机SDK路径 模拟器SDK路径 -output 合并后的文件路径: lipo -create /User/baicia/.../(真机)XXXSDK.framework/XXXSDK /User/baicia/.../(模拟器)XXXSDK.framework/XXXSDK -output /User/baicai/Desket/XXXSDK,回车获得合并后的XXXSDK文件
3)找到(真机)XXXSDK.framework,将其XXXSDK文件替换成新合并后的XXXSDK文件,然后将(模拟器)XXXSDK.framework/Modules/XXXSDK.swiftmodule文件下的内容全部拷贝到(真机)XXXSDK.framework下对应的XXXSDK.swiftmodule文件中,重新组成新的(真机)(XXXSDK.framework)
合并过程可能会出现类似如下错误:....../Products/Release-iphonesimulator/SwiftMQTT.framework/SwiftMQTT have the same architectures (arm64) and can't be in the same fat output file
- 编译模拟器静态库支持i386 x86_64两架构
- 编译真机静态库支持armv7 arm64两架构
- 如果手里有静态库工程,在静态库工程中Build Settings -> Excluded Architectures -> Release -> Any iOS Simulator SDK 添加arm64就可以了
- 如果手里只有.a或framework文件,使用lipo remove命令将模拟器库的arm64架构移除: lipo xxx.a -remove arm64 -output xxx.a
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 "${DEVICE_DIR}" ] || [ ! -d "${SIMULATOR_DIR}" ]
then
exit 0
fi
# 如果合并包已经存在,则替换
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#创建INSTALL_DIR路径,即 /Products/XXX.framework
mkdir -p "${INSTALL_DIR}"
#将目录DEVICE_DIR下所有内容复制到INSTALL_DIR路径下
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#将模拟器下的XXX.framework/Modules/XXX.swiftmodule/目录下的内容复制到Products/XXX.framework/Modules/XXX.swiftmodule
cp -R "${SIMULATOR_DIR}/Modules/${PROJECT_NAME}.swiftmodule/" "${INSTALL_DIR}/Modules/${PROJECT_NAME}.swiftmodule/"
# 使用lipo命令将其合并成一个通用framework
# 最后将生成的通用framework放置在工程根目录下新建的Products目录下
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打开目录
open "${SRCROOT}/Products"
fi
2.分别运行编辑器和真机,会自动弹出Products ->XXXSDK.framework,这个就是最终合并的真机和模拟器下都可以运行的静态库,注意检查Modules/XXX.swiftmodule/目录下支持的架构是否合规(包含arm、arm64、armv 7、i386、x86-64等文件)
静态库与主工程并存的注意点 (https://www.jianshu.com/p/e05363d700dd)
遇到错误Multiple commands produce '/Users/baicai/Library/Developer/Xcode/DerivedData/WGbaicaiProject-cfdbrczbjbbauxcnpicupdbicyze/Build/Products/Release-iphoneos/XXX.app/Info.plist':
解决:File -> Workspace Settings.... -> Shared Workspace Seetings: -> Build System -> Legacy Build System ->Done
3.打开 “主工程名.xcworkspace”,File -> New -> Project -> iOS->Framework & Library -> Framework,注意Team选择None(即不参与签名),Next,Add to: 和 Group: 都选择主工程(这个主工程是图标为蓝白色的xcworkspace)
7.动态库使用动态链接Embbed Frameworks(会自动在下面的Link Binary With Libraries也添加一次),并且在静态库使用静态链接Link Binary With Libraries。
方式一: 1.在静态库中创建文件(和静态库名称一致),后缀名改为.bundle 2.添加需要的图片资源,(这中方式不能使用@1x,@2x,@3x图片) 3.在静态库中使用图片的方式为: UIImage.init(named: "OpenInvoice.bundle/111", in: Bundle.init(for: self.classForCoder), compatibleWith: nil) 4.在主工程中,将静态库和存放图片的.bundle资源文件一块拖进工程中即可(在主工程中,.bundle文件下是可以看到每一张图片的,自己感觉不太好) 方式二:
2.在打包静态库后,静态库目录下会有Frameworks/第三方库,这些库需要在主工程中导入使用,并且在主工程中Target -> General -> Frameworks,Libraries,and Embedded Content中的Embed为 Embed & Sign,否则会报错
例如XXX.framework和Alamofire.framework
打开终端输入: file xxx/xxx/XXX.framework/XXX
//静态库
/Users/baicai/Desktop/XXX.framework/XXX:
Mach-O universal binary with 4 architectures: [arm_v7:current ar archive] [i386:current ar
archive] [x86_64:current ar archive] [arm64:current ar archive]
/Users/baicai/Desktop/XXX.framework/XXX
(for architecture armv7): current ar archive
/Users/baicai/Desktop/XXX.framework/XXX
(for architecture i386): current ar archive
/Users/baicai/Desktop/XXX.framework/XXX
(for architecture x86_64): current ar archive
/Users/baicai/Desktop/XXX.framework/XXX
(for architecture arm64): current ar archive
//动态库
/Users/baicai/Library/Developer/Xcode/DerivedData/Alamofire-belqpwecoaawcubpenaiytdogpll/Build/Products/
Debug-iphoneos/Alamofire.framework/Alamofire: Mach-O 64-bit dynamically linked shared library arm64