本文包含 :
Framework 介绍;
封装一个Framework 步骤;
封装 Framework 时 ,项目 配置 说明;
Framework 内部 引用 图片资源 ;
Framework 内部 引用 Xib;
Framework 外部 引用 Framework 中 的图片资源;
Framework 外部 引用 Framework 中 的Xib资源;
Framework 里面包含 UI控件,如一个小App ,小插件;
Framework 介绍:
iOS/Mac 开发 Framework 是一种库,
什么是库?
共享代码便是库,实现代码的复用,一般分为静态库和动态库。
静态库和动态库的区别?
静态库:链接时完整的拷贝到可执行文件,多次使用多次拷贝,造成冗余,使包变的更大。
动态库:链接时不复制,程序运行时由系统加在到内存中,供系统调用,系统加在一次,多次使用,共用节省内存。
iOS/Mac 中的静态库?
后缀为: .a和.framework 文件
iOS/Mac 中的动态库?
后缀为: .dylib和.framework 文件
iOS/Mac Framework 为什么即是动态又是静态?
系统的架构是动态的,我们自己创建的是静态的。
.a和.framework的区别是什么?
.a是单纯的二进制文件,.framework是二进制文件+资源文件。
其中.a不能直接使用,需要.h文件配合,而.framework则可以直接使用
.framework = .a + .h + sorrceFile(资源文件)
为什么要使用静态库?
共享代码,方便使用。
实现iOS 程序的模块化,固定的业务模块话,减少开发的重复劳动。
和别人分享代码,但又不想让别人知道代码的具体实现。
开发第三方SDK 的需要。
有时候集成其他项目的时候 也可以使用。
封装一个Framework 步骤:
1.新建工程选择iOS —> Cocoa Touch Framework
2.Framwork库文件工程创建完成以后,会自动生成一个.h文件作为头文件使用。
我这里这个叫 testNewFramwork.h
当我们写好的源文件很多的时候,为了使用方便,往往我们会自己创建一个.h文件。当源文件中已经有了.h文件的时候,我们就不需要Framwork库文件自动生成.h文件。删除即可。
删除 系统自动生成的 testNewFramwork.h 文件。
注意: 删除 系统自动生成的 testNewFramwork.h 文件 会有一个警告
原因是项目需要一个和工程名同名的头文件。
添加一个同名文件即可
3.引入 需要封装到 Framwork 工程文件
因为 Framwork 工程是没有自动导入 系统的 UIKit.framwork ,我们Framwork里面是用到了UI控件的,所以需要手动导入 系统UI库。否则 封装完毕,调用该库的时候,里面的 UI控件是不可见的。
最后 工程目录 如下:
4.配置 Framwork
(1).Build Active Architecture Only 设置为NO的意思是当前打包的.framework支持所有的设备.否则打包时只能用当前版本的模拟器或真机运行.
(2).Build Setting 搜索linking 设置Dead Code Stripping 为NO是编译选项优化,包瘦身,(可不改) Mach-O Type 选中StaticLibrary (静态库) Xcode默认是动态库.
(3). 设置framework最低支持的版本.
(4). 将需要呈现给来的头文件,直接从Project拖到Public中. 不想呈现出来的.h文件不建议拖到Private中. 放在project中即可
5.编译 Framwork
进行编译之前应该设置为release模式
6.真机版本和模拟器版本framework 合并
XCode12之前:
编译模拟器静态库支持i386 x86_64两架构
编译真机静态库支持armv7 arm64两架构
使用lipo -create -output命令可以将两个库合并成一个支持模拟器和真机i386 x86_64 armv7 arm64四种架构的胖子库。
XCode12编译的模拟器静态库也支持了arm64,导致出现真机库和模拟器库不能合并的问题。
have the same architectures (arm64) and can't be in the same fat output file
模拟器编译时候:
设置Build Setting --> Excluded Architectures --> Release --> 添加上 arm64
来到工程目录树,Products下的文件都是红色的,现在我们选中.framework文件,分别真机和模拟器运行一遍(成功运行)
然后Show in Finder 找到对应的 .framework文件(上级目录可以看出是真机还是模拟器文件夹)
真机和模拟器运行成功的文件是在这俩个文件夹内的。
内部分为Debug版本和Release版本,同时两者有分为真机版本和模拟器版本framework(iphoneos后缀代表真机版本,iphonesimulator后缀代表模拟器)
(1).查看架构信息
打开终端使用命令行 lipo -info 查看framework架构信息
终端 命令行 lipo -info 空格 framework 地址
真机版本
模拟器版本
(2).合并真机模拟器版本
因为以上获取的framework只能在对应的版本上运行(即真机只能在设备上运行模拟器版本只能在模拟器上面运行使用)所以需要合并为通用版本
命令行语句:sudo lipo -create 空格 (此处请填写真机testNewFramework文件路径) 空格 (此处填写模拟器testNewFramework文件路径) 空格 -output 空格 自定义合成文件存储路径(合成文件的名字testNewFramework)
查看合成的testNewFramework架构信息
替换
小知识点 :
为啥要合并 ,架构信息 是什么意思 ?
首先了解一下什么是ARM,ARM是微处理器,而armv6, armv7, armv7s是ARM CPU的不同指令集,
armv6设备:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch
armv7设备:iPhone 3GS,iPhone 4,iPhone 4S,iPad ,iPad 2,iPod Touch 3G,iPod Touch 4
armv7s设备:iPhone 5,iPad4
arm64设备:iPhone 5S,iPad Air,iphone6,iphone6plus,iPhone6s,iPhone6s Plus等
至此 封装 Framework 完成。
Framework接入主程序
1.拖入主程序
2.引入Framework,否则取不到Framework的图片等资源
TARGETS —> Build Phases
主程序 创建个导航控制器 然后点击ViewController 跳转到 Framework 中的 View1Controller 视图控制器
外部--主程序 --调用Framework中的资源
至此 使用 Framework 完成。
END.