来到了新公司,要开发的第一个项目据说可能要封成framework,可是我从来没自己做过framework呀!顿时开始发愤图强,赶紧恶补了起来。但是还是遇到了一些乱七八糟的情况,所以写个随笔记下来。

有哪里不对的,大家可以温柔的指出哈~

零、准备工作

1.新建工程,选择iOS->Framework&Library->Cocoa Touch Framework,命名为FramewrokTest.

2.新建FrameworkManager和TestViewController(Also create XIB file),并添加进来一张图片,我的是yumy.JPG.

3.开始写代码

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>@interface FrameworkManager : NSObject+(NSString*)presentTestVCFromCurrentVC:(UIViewController *)VC;@end

#import "FrameworkManager.h"
#import "TestViewController.h"@implementation FrameworkManager+(NSString *)presentTestVCFromCurrentVC:(UIViewController *)VC{TestViewController *testVC = [[TestViewController alloc] initWithNibName:@"FrameworkBundle.bundle/TestViewController" bundle:nil];[VC presentViewController:testVC animated:YES completion:nil];return @"调用成功!";
}@end

#import "TestViewController.h"@interface TestViewController ()@property (weak, nonatomic) IBOutlet UIImageView *imgView;@end@implementation TestViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view from its nib.self.imgView.image = [UIImage imageNamed:@"FrameworkBundle.bundle/yumy.JPG" inBundle:nil compatibleWithTraitCollection:nil];self.imgView.highlightedImage = [UIImage imageNamed:@"FrameworkBundle.bundle/haha.JPG" inBundle:nil compatibleWithTraitCollection:nil]; } - (IBAction)changeImg:(id)sender { self.imgView.highlighted = !self.imgView.highlighted; } - (IBAction)back:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end

一、创建bundle

1.创建bundle,选中PROJECT之后,点击加号选择macOS->Framework&Library->Bundle,命名为FrameworkBundle

之后将FrameworkBundle->Build Settings->Build Options->Enable Bitcode设置为NO.

因为bundle默认是macOS的所以要改成iOS的,需要将FrameworkBundle->Build Settings->Architectures->Base SDK改为Latest iOS

分别将FrameworkBundle->Build Settings->Deployment下的iOS Deployment Target和macOS Deployment Target,选择为你最低支持的版本

将FrameworkBundle->Build Settings->User-Defined->COMBINE_HIDPI_IMAGES设置为NO(此属性在Base SDK 选择了iOS SDK之后才会出现)

2.选中刚刚创建的FrameworkBundle->Build Phases->Copy,将所有的图片和xib添加到copy bundle resources中,如下图。

3.选择FrameworkBundle和Generic iOS Device,之后Command+B编译Bundle。(注意:伺候只要是xib有改变或是新加了图片等等都需要重新编译 Bundle)

编译之前,可以看到Products下的FrameworkBundle.bundle还是红色的,编译后就变成了黑色,变成黑色后选中FrameworkBundle.bundle选择show in finder,之后就可以把bundle加到主工程中啦!(具体的下面会说)

二、使用脚本自动合并framework

1.事前准备都做完了,现在开始配置了!

 1)Targets->FrameworkTest->General->Deployment Info->Deployment Target设置成你支持的最低版本

 2)给FrameworkTest->Build Settings->Architectures->Architectures添加上armv7s,下图是添加完的样子。

 3)按下图设置红框中的字段

 4)在FrameworkTest->Build Phases->Headers中,将想要让静态库使用者看到的头文件放到public中。(FrameworkTest.h默认必须在Public中)

2.选中FrameworkTest点击加号选择Cross-platform->Other->Aggregate,命名为FrameworkAggregate。

3.选中FrameworkAggregate->Build Phases,点击加号,添加New Run Script Phases。

之后将下面的脚本添加到Run Script中

#指定 FrameWork 与 bundle的target名称FrameWork_NAME="FrameworkTest"
Bundle_NAME="FrameworkBundle"#打包结果存储地址
Products_DIR=${SRCROOT}/Products/#定义framework与bundle存储路径
FRAMEWORK_INSTALL_DIR=${SRCROOT}/Products/${FrameWork_NAME}.framework
Bundle_INSTALL_DIR=${SRCROOT}/Products/${Bundle_NAME}.bundle#将要生成包的路径
WRK_DIR=buildFRAMEWORK_DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FrameWork_NAME}.framework
FRAMEWORK_SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FrameWork_NAME}.frameworkBundle_SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${Bundle_NAME}.bundle#清理下工程
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FrameWork_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FrameWork_NAME}" -sdk iphonesimulator clean buildxcodebuild -configuration "Release" -target "${Bundle_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${Bundle_NAME}" -sdk iphonesimulator clean build#清除下存储路径下的旧包
if [ -d "${FRAMEWORK_INSTALL_DIR}" ]
then
rm -rf "${FRAMEWORK_INSTALL_DIR}"
fi
mkdir -p "${FRAMEWORK_INSTALL_DIR}"if [ -d "${Bundle_INSTALL_DIR}" ]
then
rm -rf "${Bundle_INSTALL_DIR}"
fi
mkdir -p "${Bundle_INSTALL_DIR}"#随便拷贝一个.framework
cp -R "${FRAMEWORK_DEVICE_DIR}/" "${FRAMEWORK_INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

#合并.framework中的二进制文件,讲通用二进制文件替换
lipo -create "${FRAMEWORK_DEVICE_DIR}/${FrameWork_NAME}" "${FRAMEWORK_SIMULATOR_DIR}/${FrameWork_NAME}" -output "${FRAMEWORK_INSTALL_DIR}/${FrameWork_NAME}"#拷贝bundle
cp -R "${Bundle_SIMULATOR_DIR}" "${Products_DIR}/"rm -r "${WRK_DIR}"
open "${Products_DIR}"

4.最后选择FrameworkAggregate和Generic iOS Device,之后Command+B编译,编译成功会弹出窗口

三、framework(带有bundle)的使用

1.新建工程MainProject,选择Single View App就行之后将之前编译成功的FrameworkBundle.bundle和FrameworkTest.framework加到MainProject中。

2.配置工程

1)将Bitcode设置为NO

2)在MainProject->Build Phases->Copy Bundle Resources中点击加号添加FrameworkTest.framework。

其他的配置该怎么配怎么配

3.现在来调用一下framework中的方法,实现在Main.storyboard中放一个按钮,点击这个按钮调用FrameworkManager中提供的方法跳转到TestViewController。

ViewController中的调用如下

#import "ViewController.h"
#import <FrameworkTest/FrameworkTest.h>@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
}- (IBAction)presentVC:(id)sender {
//    [SDK2Manager presentCurrentVC:self];
    [FrameworkManager presentTestVCFromCurrentVC:self];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

好啦~完事啦~运行一下看看结果吧

四、在已有项目中创建framework

1.创建一个新项目FrameworkInMainProject,选Single View App就行,之后设置最低支持版本

2.选中project之后点击下方加号,添加framework,bundle,aggregate,依次命名为ProjectFramework,ProjectBundle,ProjectAggregate

下图为添加完的样子

3.之后在FrameworkInMainProject->Build Phases->Target Dependencies中添加ProjectBundle,ProjectFramework

4.以上三小点都做完了,就可以参照文章前面讲的:

零、准备工作

一、创建bundle

二、使用脚本自动合并framework

三、framework(带有bundle)的使用

这四部分配置framework,bundle和aggregate了。想要看到效果,就正常运行项目即可(之前把framework和bundle先build一下)。aggregate是当你需要导出framework,bundle时才需要build,平时不需要。

ProjectFramework文件夹如下图

转载于:https://www.cnblogs.com/justWWJBlog/p/9040565.html

iOS xcode9中framework静态库的创建以及xib和图片的使用记录相关推荐

  1. 深入iOS系统底层之静态库介绍

    少长咸集,群贤毕至.--<王羲之・兰亭集序> 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令, ...

  2. oc 协议 回调 静态成员_深入iOS系统底层之静态库

    少长咸集,群贤毕至.--<王羲之・兰亭集序> 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令, ...

  3. iOS:Xcode7下创建 .a静态库 和 .framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

  4. Xcode 创建.a和framework静态库(转)

    最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的 ...

  5. iOS架构-cocoapods打包静态库(依赖私有库、开源库、私有库又包含静态库)(14)

    前言: iOS工程架构少不了cocoapods 对第三方库的管理,它有着很好的操作性和集中管理的特性.之前的写了不少Xcode 建静态库工程打包.a 和 .framework 的文章,但是我们要先建静 ...

  6. iOS之深入解析静态库和动态库

    一.库 ① 什么是库? 库就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式. 从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行. ② 库的分类 根据程序代码的开源情况 ...

  7. iOS开发拓展篇—静态库

    一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 比如SDWebImage. ...

  8. 在你的 iOS App中 使用 OpenSSL 库 转发

    在你的 iOS App中 使用 OpenSSL 库 转发 英文原文链接:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled- ...

  9. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

最新文章

  1. envi5.2中文版
  2. @value 静态变量_Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件...
  3. css浮动(float)及清除浮动的几种实用方法
  4. easyui控件事件监听委托给jquery事件监听,keyup取最新值问题
  5. SQLServer中Case when的一个意外问题
  6. mysql数据库密码修改
  7. bio nio aio区别_什么是BIO、NIO和AIO?
  8. c++ vector 使用注意事项
  9. 【笔试/面试】—— 数组中第二大的数
  10. ASP.NET中缓存(cache)的控制方法
  11. [Icehouse][cinder] volume状态为 error_deleting无法删除 的解决方案
  12. java 驼峰自动映射_总结springboot开启mybatis驼峰命名自动映射的三种方式
  13. gma 教程 | 气候气象 | 基于 彭曼-蒙提斯法(Penman-Monteith)计算日作物参考蒸散量(ET0)
  14. 计算机键盘重复设置,电脑键盘错乱怎么恢复 一键快速重新设置电脑快捷键方法...
  15. android 如何进入安全模式,手机怎么进入安全模式
  16. python控制相机,在OpenCV / Python中设置相机参数
  17. 在linux虚拟机上显示摄像头视频(V4L2编程)
  18. 单片机 脉搏心率检测 MSP430G2553 Pulse Sensor 红外对射
  19. 计算机技术发展迅速的原因,飞速发展的计算机技术,你知道它的历史源流吗?...
  20. 求生之路无限子弹服务器,求生之路2怎么调无限子弹(在单机中)

热门文章

  1. X86服务器虚拟化的三种技术--(1)
  2. ValueError: The view XXXView didn't return an HttpResponse object. It returned None
  3. ly-tab第三方组件使用记录
  4. PTC Mathcad Prime7.0,简单易用的用户界面
  5. 《论语》原文及其全文翻译 学而篇12
  6. 笔记连载 | Day5 Xilinx ZYNQ7000系列 PS、PL、PS-PL基本开发流程之PL端篇
  7. Linux:目录,文件
  8. FPGA系统性学习笔记连载_Day19【综合实验】之【数字钟】【Intel Cycle IV FPGA平台验证】
  9. linux查看gcc/cmake/当前版本
  10. 新code为aadb010476_【AACA建筑师评估】职业评估说明