前言
制作SDK封装Framework带资源文件封装
一、新建主项目
主项目的ProjectName是HelloFramework( SDK的主项目 )
二、创建Framework
在主项目里创建Framework,暂时命名MyFramework
Project - > Editor - > Add Larget - > Cocoa Touch Framework
三、配置Framework信息
1、Architectures 配置支持的指令集
Project - > Target - > MyFramework - > Build Settings
Architectures配置支持的指令集,增加arm64e、armv7s
如下:
备注:系统已经默认配置了 arm64、armv7
指令集 | 支持设备设备 |
armv6 | iPhone、iPhone 3G、iPod 1G、iPod 2G |
armv7 | iPhone 3GS、iPhone 4、iPod 3G、iPod 4G、iPod 5G、iPad、iPad 2、iPad 3、iPad Mini |
armv7s | iPhone 5、iPhone 5C、iPad 4 |
arm64 | iPhone 5s、iPhone 6、iPhone 6P、 iPhone 6s、 iPhone 6sP、 iPhone 7、iPhone 7P、iPad Air、Retina iPad Mini |
arm64e | iPhone XR、iPhone XS Max |
2、Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
Build Active Architecture Only 修改为 NO
3、Mach-O Type 选择是Static Library(静态库)还是Dynamic Library(动态库默认)
Mach-O Type 设置为 Static Library(静态库)
备注:使用动态库要注意需要在 Linked Frameworks and Libraries 和 Embedded Binaries 都加入对应的动态库。
如下:
4、设置Headers Phase
步骤:Target - > MyFramework - > Build Phases - > Headers
Public:需要暴露出来的 h 文件
Private:不想公开的 h 文件
Project:显示你MyFramework里面的所有你创建的 h 文件
5、设置最低兼容版本
如下:
6、新建一个FrameworkManager文件
在FrameworkManager类里实现了一个方法
//.h文件声明 #import <Foundation/Foundation.h> @interface MyFrameworkManager : NSObject + (UIViewController*)creatFrameworkFileViewController; @end
//.m文件实现 #import "MyFrameworkManager.h" #import "FrameworkFileViewController.h" @implementation MyFrameworkManager + (UIViewController*)creatFrameworkFileViewController{ FrameworkFileViewController *vc = [[FrameworkFileViewController alloc] initWithNibName:GetNibName(@"FrameworkFileViewController") bundle:[NSBundle mainBundle]]; NSLog(@"subviews:%@",vc.view.subviews); return vc; } @end
7、引入头文件
默认生成的.h文件中,我的是MyFramework.h,把所有需要暴露的.h文件都用#import 引入,记住一定要将所有需要暴露的.h文件都引入,也就是上面Headers-Public中加的所有.h文件,不然编译后生成的.framework在引用的时候会有警告。 如下:
8、回到主项目,引用MyFrameworkManager
/// 引入头文件 #import <MyFramework/MyFramework.h> // 主项目当中 UIViewController *vc = [MyFrameworkManager creatFrameworkFileViewController];
9、生成Framework包
打包Framework:分为真机和模拟器,这两个生成的framework是不一样的。(如果说你需要生成一个既可以真机使用又可以模拟器使用的,那就分别生成,最后在合并在一起)。按照下图将编译的 Device 选择为真机 ,然后按下 Command + B 开始编译,编译成功后右键 Products 文件夹下的 .framework 文件,点击 Show in Finder。
四、xib文件和图片的存放和引用
友情提示:资源文件都放在Bundle文件当中,如果放在Framework文件当中,后面打包上传的时候会出现Found an unexpected Mach-O header code: 0x72613c21
创建bundle,放置资源文件(nib文件,图片)
1、新建一个bundle文件,这里暂时命名为KJFramework.bundle
如下:
2、显示包内容,将图片等资源放入bundle文件当中
如下:
第一种编译成nib文件
1、将xib文件编译成nib文件
打开终端:cd 需要转换的xib目录
输入编译:ibtool --errors --warnings --output-format human-readable-text --compile ibtool --errors --warnings --output-format human-readable-text --compile FrameworkFileViewController.nib FrameworkFileViewController.xib
编译完成会生成如下文件:
第二种生成nib文件
1、编译文件,Command + B 生成Framework文件
2、Show in Finder Framework文件,从中找到一个FrameworkFileViewController.nib文件
备注:一旦xib文件发生变化,就需要重新编译nib文件,然后替换
3、读取bundle资源包中的图片
把Bundle文件导入到我们的framework中,我们用到图片的时候,就取Bundle中的图片来用。
//FrameworkFileViewController.m文件实现 #import "FrameworkFileViewController.h" @interface FrameworkFileViewController () @property (unsafe_unretained, nonatomic) IBOutlet UIImageView *imageView; @end @implementation FrameworkFileViewController - (void)viewDidLoad { [super viewDidLoad]; self.imageView.image = [UIImage imageNamed:GetBundleImage(@"tiaotiaosu")]; } - (IBAction)changeImage:(UIButton *)sender { if (_imageView.highlighted) { self.imageView.image = [UIImage imageNamed:GetBundleImage(@"jienigui")]; }else{ self.imageView.highlightedImage = [UIImage imageNamed:GetBundleImage(@"kabisou")]; } self.imageView.highlighted = !self.imageView.highlighted; } - (IBAction)dismiss:(UIButton *)sender { [self dismissViewControllerAnimated:YES completion:nil]; } @end