iOS 封装 Framework、 制作 SDK 、集成项目...

本文包含 :

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

创建
命名Framework

2.Framwork库文件工程创建完成以后,会自动生成一个.h文件作为头文件使用。

我这里这个叫 testNewFramwork.h
当我们写好的源文件很多的时候,为了使用方便,往往我们会自己创建一个.h文件。当源文件中已经有了.h文件的时候,我们就不需要Framwork库文件自动生成.h文件。删除即可。
删除 系统自动生成的 testNewFramwork.h 文件。


删除 自动生成的 头文件

注意: 删除 系统自动生成的 testNewFramwork.h 文件 会有一个警告
原因是项目需要一个和工程名同名的头文件。


警告

添加一个同名文件即可


解决警告

3.引入 需要封装到 Framwork 工程文件

引入内 img 图片 并显示
引入内 xib 文件 并显示

因为 Framwork 工程是没有自动导入 系统的 UIKit.framwork ,我们Framwork里面是用到了UI控件的,所以需要手动导入 系统UI库。否则 封装完毕,调用该库的时候,里面的 UI控件是不可见的。

导入UIKit.framwork

最后 工程目录 如下:


工程目录

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.

你可能感兴趣的:(iOS 封装 Framework、 制作 SDK 、集成项目...)