一、umbrella framework

将几个已经封装好的 framework 封装成一个,封装的这种 framework 就是 umbrella framework。

Apple 的官方文档中明确提到了不建议自己去创建 umbrellaframework。首先先引入 Apple 的 Guidelins for Creating Frameworks 的一段:

Don’t Create Umbrella Frameworks

While it is possible to create umbrella frameworks using Xcode, doing so is unnecessary for most developers and is not recommended. Apple uses umbrella frameworks to mask some of the interdependencies between libraries in the operating system. In nearly all cases, you should be able to include your code in a single, standard framework bundle. Alternatively, if your code was sufficiently modular, you could create multiple frameworks, but in that case, the dependencies between modules would be minimal or nonexistent and should not warrant the creation of an umbrella for them

分三个部分逐步创建并使用 UmbrellaFramework:

  1. SubFramework:创建一个基础 framework
  2. UmbrellaFramework:framework 里封装 framework
  3. UmbrellaFrameworkDemo:使用 demo

二、创建一个基础的 framework

UmbrellaFramework(一)创建基础framework

  1. 创建一个 framework 工程:Subframework;

  2. 添加 SubSayHello 类,添加 sayHello 方法;

    1. @interface SubSayHello : NSObject
    2. - (void)sayHello;
    3. @end
    4. @implementation SubSayHello
    5. - (void)sayHello
    6. {
    7. NSLog(@"say Hello");
    8. }
    9. @end
  3. 在 SubFramework.h 头文件中导入 SubSayHello.h

    1. #import <Subframework/SubSayHello.h>
  4. 将 SubSayHello.h 添加到 Target -> Build Phases -> Headers -> Public,可手动拖拽;

  5. Build Settings -> Mach-O Type 选择 Static Library 静态库

  6. 生成通用 framework

    • 方式一:分别在模拟器和真机下编译工程,生成两个 framework,用命令行合并成一个通用的。

      1. $ lipo -create [真机 Framework 二进制文件路径] [模拟器 Framework 二进制文件路径] -output [结果路径]

      $ lipo -create /Users/cykj/Library/Developer/Xcode/DerivedData/Subframework-hkwchwbjmtuhoseinwkzbtcjxpbj/Build/Products/Debug-iphoneos/Subframework.framework/Subframework /Users/cykj/Library/Developer/Xcode/DerivedData/Subframework-hkwchwbjmtuhoseinwkzbtcjxpbj/Build/Products/Debug-iphonesimulator/Subframework.framework/Subframework -output /Users/cykj/Desktop/Subframework

      注意:如果执行命令报错,可以将结果地址改为 /Users/cykj/Desktop/Subframework.xx,生成后再将后缀名去掉。

    • 方式二:脚本生成

      • 为 SubFramework 工程添加 Target -> Aggregate

      • 在新添加的 Target 中添加脚本

      • 脚本内容

        1. # Sets the target folders and the final framework product.
        2. FRAMEWORK_NAME=LibraryName
        3. FRAMEWORK_VERSION=1.0
        4. FRAMEWORK_CONFIG=Release
        5. # Install dir will be the final output to the framework.
        6. # The following line create it in the root folder of the current project.
        7. INSTALL_PATH=${PROJECT_DIR}/Products/
        8. INSTALL_DIR=${INSTALL_PATH}/${FRAMEWORK_NAME}.framework
        9. # Working dir will be deleted after the framework creation.
        10. WORK_DIR=build
        11. DEVICE_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphoneos/${FRAMEWORK_NAME}.framework
        12. SIMULATOR_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphonesimulator/${FRAMEWORK_NAME}.framework
        13. xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphoneos
        14. echo "Build simulator"
        15. xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphonesimulator
        16. # Creates install directory if it not exits.
        17. if [ ! -d "${INSTALL_DIR}" ]
        18. then
        19. mkdir -p "${INSTALL_DIR}"
        20. fi
        21. # Creates headers directory if it not exits.
        22. if [ ! -d "${INSTALL_DIR}/Headers" ]
        23. then
        24. mkdir -p "${INSTALL_DIR}/Headers"
        25. fi
        26. # Remove all files in the headers diectory.
        27. for file in `ls "${INSTALL_DIR}/Headers"`
        28. do
        29. rm "${INSTALL_DIR}/Headers/${file}"
        30. done
        31. # Remove binary library file.
        32. rm -f ${INSTALL_DIR}/${FRAMEWORK_NAME}
        33. # Copies the headers files to the final product folder.
        34. if [ -d "${DEVICE_DIR}/Headers" ]
        35. then
        36. for file in `ls "${DEVICE_DIR}/Headers"`
        37. do
        38. cp "${DEVICE_DIR}/Headers/${file}" "${INSTALL_DIR}/Headers/${file}"
        39. done
        40. fi
        41. # copy nibs to bundle,then copy bundle to final folder
        42. BUNDLE_DIR=${DEVICE_DIR}/${FRAMEWORK_NAME}.bundle
        43. if [ -d "${BUNDLE_DIR}" ];then
        44. if ls ${DEVICE_DIR}/*.nib >/dev/null 2>&1;then
        45. rm -rf ${BUNDLE_DIR}/*.nib
        46. cp -rf ${DEVICE_DIR}/*.nib ${BUNDLE_DIR}
        47. fi
        48. rm -rf "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
        49. cp -R "${BUNDLE_DIR}" "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
        50. fi
        51. echo "Merge with simulator"
        52. # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
        53. lipo -create "${DEVICE_DIR}/${FRAMEWORK_NAME}" "${SIMULATOR_DIR}/${FRAMEWORK_NAME}" -output "${INSTALL_DIR}/${FRAMEWORK_NAME}"
        54. open "${INSTALL_PATH}"
        55. # rm -r "${WORK_DIR}"
  7. 查看 framework 支持的架构

    1. $ lipo -info [framework 二进制文件路径]

三、framework 里封装 framework

UmbrellaFramework(二)framework里封装framework

  1. 创建 Cocoa Touch Framework 工程 UmbrellaFramework

  2. 导入 SubFramework

  3. 选择 Target -> Build Phases -> 点击左上角+号 -> New Copy Files Phase 添加 Copy Files,将 SubFramework 添加到 Copy Files,选择 Destination 为 Frameworks。

  4. 添加 UmbrellaSayHello 类,添加 sayHello 方法,并在 sayHello 方法中调用 SubFramework 的 sayHello 方法。

    1. @interface UmbrellaSayHello : NSObject
    2. - (void)sayHello;
    3. @end
    4. #import <Subframework/SubSayHello.h>
    5. @implementation UmbrellaSayHello
    6. - (void)sayHello
    7. {
    8. NSLog(@"%s", __func__);
    9. SubSayHello * ssh = [[SubSayHello alloc] init];
    10. [ssh test];
    11. }
    12. @end
  5. UmbrellaFramework.h 头文件中导入将 UmbrellaSayHello.h

    1. #import <UmbrellaFramework/UmbrellaSayHello.h>
  6. 将 UmbrellaSayHello.h 添加到 UmbrellaFramework 的公共 headers 中

  7. Architectures 添加 armv7s

  8. 连接选项 Mach-O Type 不用改,选择默认选项 Dynamic Library,这意味着外层的 UmbrellaFramework 是一个动态库。

  9. 生成真机和模拟器都能用的 framework。见第二章。

四、使用 UmbrellaFramework

UmbrellaFramework(三)使用demo

  1. 创建工程 UmbrellaFrameworkDemo

  2. 嵌入UmbrellaFramework,选择工程 -> General -> Embedded binaries,添加UmbrellaFramework。UmbrellaFramework 将会同时添加到 Linked Frameworks and Libraries.

  3. 工程中使用

    1. #import <UmbrellaFramework/UmbrellaFramework.h>
    2. - (void)viewDidLoad
    3. {
    4. [super viewDidLoad];
    5. UmbrellaSayHello * ush = [[UmbrellaSayHello alloc] init];
    6. [ush sayHello];
    7. }

iOS UmbrellaFramework的更多相关文章

  1. iOS UmbrellaHeader

    Lexical or Preprocessor Issue - Umbrella header for module 'xxx' does not include header 'xxx.h' fra ...

  2. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  4. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  5. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  6. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  7. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  8. 告别被拒,如何提升iOS审核通过率(上篇)

    iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬.那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率 ...

  9. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

随机推荐

  1. C++编码规范(转)

    转载链接:https://www.jianshu.com/p/b262d76902e4 一.命名规范 1.通则 1).所有命名都应使用标准的英文单词或缩写,不得使用拼音或拼音缩写,除非该名字描述的是中 ...

  2. Rxjs入门实践-各种排序算法排序过程的可视化展示

    Rxjs入门实践-各种排序算法排序过程的可视化展示 这几天学习下<算法>的排序章节,具体见对排序的总结,想着做点东西,能将各种排序算法的排序过程使用Rxjs通过可视化的方式展示出来,正好练 ...

  3. 前端javascript知识(三)

    函数记忆,判断是不是质数. 方法一: function isPrime1(n){ if(n<=3){return true} else{ for(var i=2;i<Math.sqrt(n ...

  4. 搭建Flutter开发环境需要注意的几个小Tips

    目录 下载SDK 安装 Android Stdio + SDK + tool SDK + 创建模拟器 + 插件(flutter和dart) Xcode + cocoapods VSCode + Flu ...

  5. Web架构之Nginx基础配置

    目录 1.Nginx 虚拟主机 1.1.基于域名的虚拟主机 1.2.基于端口的虚拟主机 1.3.基于IP的虚拟主机 2.Nginx include 3.Nginx 日志配置 3.1.访问日志 3.2. ...

  6. SSL/TLS 协议运行机制概述(一)

    SSL/TLS 协议运行机制概述(一) SSL/TLS 发展史 1994年,NetScape 设计了SSL协议(Secure Sockets Layer) 1.0,未正式发布 1995年,NetSca ...

  7. Go语言转义字符

    \a 匹配响铃符 (相当于 \x07) 注意:正则表达式中不能使用 \b 匹配退格符,因为 \b 被用来匹配单词边界, 可以使用 \x08 表示退格符. \f 匹配换页符 (相当于 \x0C) \t ...

  8. Linux系统是什么?亲身自学经历分享

    我是数字媒体专业学生,第一次接触LINUX的时候,是大一C语言课程里看到的,书上讲了C语言的发展历史.说到C语言的起源,就离不开UNIX系统.在20世纪60年代,贝尔实验室的研究员Ken Thomps ...

  9. Object.keys()方法

    一.定义和用法 返回对象的可枚举属性和方法的名称.二.参数 obj:要返回器枚举自身属性的对象.三.返回值 返回一个所有元素为字符串的数组,其元素来自于从给定的obj里可直接枚举的属性.这些属性的顺序 ...

  10. python从数据库取数据后写入excel 使用pandas.ExcelWriter设置单元格格式

    用python从数据库中取到数据后,写入excel中做成自动报表,ExcelWrite默认的格式一般来说都比较丑,但workbook提供可以设置自定义格式,简单记录个demo,供初次使用者参考. 一. ...