头文件系统
根据设计方案
- Alpha内的文件需要随同Unique向外公开
- Beta为内部使用,不需要对外公开
那么首选处理Alpha和Beta的头文件
Alpha头文件-Public
由于Alpha的头文件需要同Unique一样对外Public (不推荐,如果需要Public,为何不将代码直接放入Unique)
但是有些特殊情况需要兼顾,于是需要做出如下处理
操作 | 作用 |
---|---|
拖动Alpha的需要Public的头文件,进入Unique Project,不勾选Copy If Need | 使得Unique Project与Alpha Project的头文件在磁盘上是同一个文件 |
将Alpha头文件在UniqueProject工程中也对外公开 | 让用户使用UniqueFramework也可以通过尖括号加载 |
将Alpha的头文件路径加入 Unique 的 Header Search Path | 让Unique Framework可以引用到 Alpha中任何头文件 |
将Alpha的头文件,加入Unique 的 Umbrella Framework | 让用户可以正常使用Alpha的公开类 |
Alpha的Public的头文件进入Unique Project
Alpha的头文件路径加入 Unique 的 Header Search Path
对比Alpha和Unique的头文件的不同
Beta头文件-Private(多数情况)
Beta的头文件因为不对外做任何暴露,所以不需要任何操作,仅需按照Framework的方式在Unique的 .m 中通过尖括号加载
但是注意仅可以在 .m文件中使用,不可以在.h 对外暴露
Mach-O的合并
根据文章静态编译StaticFramework的介绍,如果想让可执行文件合并,仅需将 Alpha 和 Beta 的Mach-O类型改为Static
选择性 Link 过程
但是值得注意的是在Link的过程中,存在对 .o 文件的选择性 如果在Unique中没有使用过的符号,不会被Load进入Mach-O
Alpha的使用 | 是否会被Load |
---|---|
Unique Umbrella Header中加载Alpha头文件 | No Load |
Unique 普通.h中加载Alpha头文件,声明变量,但不实例化 | No Load |
Unique 普通.m中加载Alpha头文件,声明变量,但不实例化 | No Load |
Unique 普通.m中加载Alpha头文件,声明变量,进行实例化 | Load |
所以结论是 如果想暴露Alpha的符号给外部使用,必须在Unique里进行实例化,才会融合入Unique Mach-O
修改Load方式
除了小心翼翼的实例化之外,还可以通过修改 Other Linker Flags来避免漏掉 OC的符号
1 | -ObjC: 在Link 的过程中,加载所有的OC符号 |
资源文件处理
而资源文件的处理则可以分为两种方式
| 资源处理方法 | 解释 | 备注 |
| :————- | :————- |
| Disk路径引入式 | 如同Alpha的头文件一样,加入到Unique Framework的Compile过程 | 更推荐这种构建Unique Framework |
| 伪装成Bundle | 将Sub Framework Embed进Unique,并在编译完成后伪装成Bundle | 在App引入Static Framework时更省心 |
Disk路径引入
直接将 Sub Framework的 Media.xcassets 文件夹加入Unique Project 不勾选Copy If Need
然后检查 Unique Framework的 Build Phase————Copy Bundle Resource 是否包含了地盘路径的xcassets文件
伪装成Bundle
根据Mach-O文件的类型我们可以得知,Bundle 和 Framework 都是动态库,Bundle只是不能被Link而已
和Unique Framework不同,App的 Embed 过程会将 Framework拷贝进入 Target.app/Frameworks 文件夹
在Framework采用了Static Mach-O后,我们采用脚本伪装成一个Bundle,并且可以删除掉无用的静态Mach-O文件 可以参考后续文章