Mac Framework & iOS Framework
在苹果的体系里,最早用上Framework的是Mac OS,其文档中关于Framework 描述了Umbrella Framework和多版本的概念
Framework多版本
根据Framework文档的版本章节还提及了Framework有多版本兼容的能力,这个曾经也听人提及过,但是经过实际操作发现结论
在iOS中目前不存在Current目录的软链接,不存在Mac中多版本兼容的能力
Git对比工程配置
通过Git来对比 MacFramework.xcodeproj 和 iOSFramework.xcodeproj 的内部project文件发现工程配置主要会存三点不同
- Target不同,因为Mac和iOS的差别
- SDK的不同
- Run Search Paths 不同,Mac 的多了一个 /../ 上级目录的路径
查看日志对比命令
通过查看编译命令,可以发现存在以下不同
阶段 | Mac | iOS |
---|---|---|
Process info.plist | 无 | 有 |
Copy module.modulemap | 无 | 有 |
Sign | 是对Framework Version进行签名 | 是对Framework本身进行签名 |
所以说 推测是Xcode对于不同平台的Framework进行编译时采用的命令不同而导致的
Umbrella Framework
根据苹果官方指导,着重提及了一点 Don’t Create Umbrella Frameworks 而且这个文档主要是针对Mac OS来讲的,iOS中并没有这个概念
根据StackOverflow制作Umbrella Framework的问答,得到了以下的 均为错误的回答
- Embedding a framework within a framework (iOS 8+): 存在SubFramework头文件问题
- How to create an umbrella framework in iOS SDK?: Xcode5时代的答案,已经失效
- How to add a framework inside another framework (Umbrella Framework): 讨论没有有效的结果
- Umbrella framework: 同上述1、3同样是Embed Framewrok的方法,并不是Umbrella Framework
就是提醒大家,没有特殊需求不要创建 Umbrella FrameWork ,但是无奈公司就有这个特殊需求,经过分析 所谓 Umbrella Framework 完成的需求需要符合以下几点
- 你的Target是提供一个Framework给别人,注意是 !一个!
- 你的Target依赖了多个Framework
- 你的Target和所依赖的Framework都是由你本人编写,保证不会和任何外部依赖冲突
由于需要提供 一个 Framework给外部,防止外部需要加载多个Framework的问题,所以根据需求
我们制作出了上文Link和符号表关系中提到的Unique Framework 会在后文继续讲解,而其前提是对Framework进行静态编译