-
新建一个iOS framework项目
-
设置项目版本号
-
到build setting中,将【Build Active Architecture Only】改为NO。默认是Yes,意思是只对当前平台进行编译
-
如果使用Xcode 12及以上版本编译出的【模拟器framework】,是包含arm64结构的,目的是适应M1芯片的mac模拟器。这会在合并真机与模拟器文件的时候造成冲突。所以需要在【Excluded Architectures】中的 【Release】 添加【Any iOS Simulator SDK】 ,并设置为 arm64。意思是编译framework时,对模拟器版本移除所有的arm64结构。可以通过【lipo -info】命令来查看包含的结构。注意【arm64】中间没有空格,如果不小心多打了个空格会不起作用。
4.1 【Mach-O Type】 修改为 【static Library】
-
【Bitcode】 默认为Yes,可以根据需要进行更改,或者使用默认即可。
-
在进行编译前,对所有的【edit scheme】选项设置为【release】。然后选择设备对【Any iOS device】编译一次,再对随意一个模拟器编译一次。
-
之后对项目中的【framework】文件【show in finder】
-
会出现两个文件夹,一个是真机版本的framework,一个是模拟器版本的framework
-
找到framework文件夹下【与framework名称相同但是没有后缀的文件】,以下简称【目标文件】
-
打开终端,使用命令 lipo -info [目标文件的路径]
-
例如 lipo -info /User/xx/xx/xx/目标文件
-
之后会显示该文件包含的内容,真机一般为 arm64 与 armv7。【如果没有armv7说明你选择的iOS版本比较高,并无大碍】
-
模拟器一般为 x86_64,i386。如果没有执行第4步还有可能显示arm64。如果显示arm64就需要删除该framework,重新执行第四步,然后重新编译一次。【如果没有i386说明你选择的iOS版本较高,并无大碍】
-
接下来是合并工作。
-
打开终端输入 lipo -create -output [参数1] [参数2] [参数3]
-
该命令是合并命令,需要三个参数。参数1与参数3相同,是真机目录中【目标文件的路径】,参数2为模拟器目录中【目标文件的路径】。参数顺序传错可能会导致合并失败的问题。
-
之后目标文件就合并完毕了,但是还没有结束。
-
还需要到模拟器的framework文件夹中,将Modules下的【目标文件.swiftmodule】文件夹中所有文件合并到真机的相同目录下。
-
注意不要替换或覆盖文件,是将i386.xx ,x86_64.xxx等等文件,以及Project文件夹下的所有文件,一并复制到真机目录相同的位置。
-
这时才算真正的合并完成,然后将真机的framework文件拿到项目中
-
就会发现真机可以用,但是编译模拟器时,会在导入模块的位置报类似这样错,
-
“ was created for incompatible target arm64-apple-ios10.0”
-
这时候在【使用该framework的项目】中再次执行第四步,屏蔽掉Debug和Release两个环境的【Any iOS Simulator SDK】的arm64,就可以用了。
-
因为涉及到合并modules文件夹,并且需要修改一些配置,所以网上的某些脚本文件可能有一些不能用了,有能力的可以自己写一个。
注意:在编写framework代码的时候,OC的代码需要暴露头文件,需要在Bulid Phasses中的>Headers栏目中,将要暴露的头文件拖入到public中。
但是swift不需要,swift只需要控制好open和public即可。
随便写写记录一下,就不把文章搞得那么详细了
网友评论