iOS xcode9 framework静态库的创建以及xib和图片的使用记录
来到了新公司,要开发的第一个项目据说可能要封成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=build FRAMEWORK_DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FrameWork_NAME}.framework
FRAMEWORK_SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FrameWork_NAME}.framework Bundle_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 build xcodebuild -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文件夹如下图

iOS xcode9 framework静态库的创建以及xib和图片的使用记录的更多相关文章
- iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- iOS:Xcode7下创建 .a静态库 和 .framework静态库
Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...
- iOS - 静态库的创建与使用
在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...
- Xcode 创建.a和framework静态库(转载)
库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...
- 经验分享:Xcode 创建.a和framework静态库【转】
作者:Haley_Wong 最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态 ...
- iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework
编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将 ...
- Xcode 创建.a和framework静态库
库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...
- 经验分享:Xcode 创建.a和framework静态库
最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的 ...
随机推荐
- (NO.00001)iOS游戏SpeedBoy Lite成形记(十)
上篇最后遇到是神马问题呢? 原来由于现在seq动作的时间变得不确定了,jump的持续时间不能对应发生变化,导致可能选手在比赛后边就没有跳跃动作了!这虽不影响整个代码逻辑,却多少有些让玩家不爽. 一种解 ...
- 跨平台移动APP开发进阶(四)AngularJS简介
AngularJS 是一个为动态WEB应用设计的结构框架.它能让你使用HTML作为模板语言,通过扩展HTML的语法,让你能更清楚.简洁地构建你的应用组件. 它的创新点在于,利用 数据绑定 和 依赖注入 ...
- wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果
上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个 两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...
- ORM对象关系映射之GreenDAO建立多表关联
利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...
- STL常用查找算法介绍
adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. #include <io ...
- Unity3D学习笔记(五)C#与JavaScript组件访问的比较
由于之前用JavaScript用的比较多,因此总是想用以前的方法来访问组件,却屡遭失败,经过查阅资料发现,二者存在较大的不同. 下面以调用3D Text组件HurtValue为例,来比较二者的不同 J ...
- LeetCode之“数学”:Rectangle Area
题目链接 题目要求: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle i ...
- myBatis源码学习之SqlSessionFactory
上一篇博客 SqlSessionFactoryBuilder 中介绍了它的作用就是获得DefaultSqlSessionFactory SqlSessionFactory是一个接口,其具体实现类是De ...
- 图片像素对比OpenCV实现,实现人工分割跟算法分割图像结果的对比
图片对比,计算不同像素个数,已经比率.实现人工分割跟算法分割图像结果的对比,但是只能用灰度图像作为输入 // imageMaskComparison.cpp : 定义控制台应用程序的入口点. // / ...
- Linux 系统应用编程——进程基础
一.Linux下多任务机制的介绍 Linux有一特性是多任务,多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务. 多任务操作系统使用某种调度(shedule)策 ...