iOS 封装SDK以及封装时bundle文件的处理
这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件。
环境:xcode 9.0
创建一个静态库工程
打开Xcode,点击File\New\Project,
选择iOS\Framework and Library\Cocoa Touch Static Library新建一个静态库工程.

将工程命名为SDKTest,然后将工程保存到一个空目录下。

当创建静态库工程时,Xcode会自动添加.h和.m。
你不需要实现文件,因此右键单击SDKTest.m选择delete,将它删除即可。
然后工程就已经可以用了了,是时候为你的库添加一些功能了。
由于本篇教程的关键在于教你怎么样创建一个SDKTest.a,
而不是怎么样构建一个UI控件,这里你可以使用你自己封装好的控件。
将你的控件从Finder中拖到Xcode的SDKTest目录下。
这里我使用别人封装过我进行二次封装的日历。
这里有一点要注意了,控件拖进工程这里一定要勾选以下三个选项:
Copy items if needed
create gruoups
Add to targets


对你的控件的头文件需要做的另一件事是将其添加到库的主头文件SDKTest.h中。
在这个主头文件的帮助下,开发者使用你的库仅仅需要导入一个头文件,
如下面的代码一样,而不是自己去选择自己需要的一块导入。
接下来就生成静态库
静态库分为手机和模拟器两种(手机端的只有手机能调用,模拟器的只有模拟器能调用)。
首先,构建模拟器的静态库,如图(点击三角按钮就可以了,其实是编译,图片中我写成了运行)!

然后show in Finder把.a文件拖到桌面即可,
真机的.a文件一样的道理,可以改一个名字方便合成一个.a文件。


之后打开终端执行下面的命令,这里就不复制了,
手敲一下记忆一下,运行时候桌面会生成一个合成的.a文件。


之后拿到这个.a文件 还有和他相关的所有.h文件,存放在一个新的文件夹里(随便起名,如下

现在呢,你就可以拿着这个文件夹去测试了。将它拖到你要应用了工程中

这样之后你就可以引用SDKTest.h文件进行使用刚才的控件了,其实很简单的。
我在这里遇到了一个问题;在我使用的时候报这个错误,
这个可以这样解决:把对应的 Use Safe Area Layout Guide 去掉勾选即可


感谢这个篇文章:http://blog.csdn.net/objectivepla/article/details/51211541
但是这只是对没有引用图片和xib的控件而言的,
如果你要打包的SDK包含xib怎么办呢,这类的资源文件是需要另外处理的。
这里就需要知道bundle
bundle 是一个目录,其中包含了程序会使用到的资源.
这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle,
cocoa提供了类NSBundle.
简单的 bundle 文件的创建,只需要在本地创建一个文件夹,给文件夹添加后缀@".bundle"图片可以放进去。
但是xib文件我们需要把xib文件手动转换成nib文件
举个例子 指令如下:
ibtool --errors --warnings --output-format human-readable-text --compile /Users/Chenfy/Desktop/cc.zip/CCViewController.nib /Users/Chenfy/Desktop/cc.zip/CCViewController.xib
这样你就可以得到nib文件了。
当然有复杂一点的 bundle 文件的创建 就是使用Xcode

添加需要的资源文件
加入你需要编译在bundle中的资源文件。至少选择Base SDK 是iOS的,默认选择是mac的
其他的设置可以参考百度

获取.budle文件同样和获取.a文件一样,编译一下 然后show in Finder
可以修改文件的名字和SDK的一样
将要使用的bundle集成到项目中后,就可以使用了。
需要注意的就是,bundle是静态的,不进行编译的资源文件。
所以,要使用bundle中的资源,就需要找到相应的资源路径
注意:
有xib 的.a文件打包前记得修改xib的应用方式为nib,对应的图片也是
对于.budle文件的引用
bundle资源包的使用:
把生成的bundle文件拖到要使用工程中;
// 设置文件路径
NSString *bundlePath = [[NSBundlemainBundle]pathForResource:@"SourcesBundle"ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundlebundleWithPath:bundlePath];
// 加载 nib文件
UINib *nib = [UINibnibWithNibName:@"Demo"bundle:resourceBundle];
NSArray *viewObjs = [nibinstantiateWithOwner:niloptions:nil];
// 获取 xib文件
UIView *view = viewObjs.lastObject;
view.frame = CGRectMake(20,50,self.view.bounds.size.width -40,self.view.bounds.size.width -40);
[self.view addSubview:view];
NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "MyBundle"ofType :@ "bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"vc_name"bundle:resourceBundle];
UIImage *image = [UIImage imageNamed:@"MyBundle.bundle/img_collect_success"];
[imgView setImage:image];
加载bundle中的xib生成的cell
加载nib的时候使用以下代码,最主要的是表明是从那个bundle中获取nib
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"WofuSDKBundle"ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
UINib *nib=[UINib nibWithNibName:@"Wofucreditcell"bundle:resourceBundle];
[tab registerNib:nib forCellReuseIdentifier:identifier];
加载bundle详情见这篇文章http://blog.csdn.net/u011146511/article/details/70147693
我在这里遇到了一个问题 我在cell 的复用的时候总是报错
结果 发现复用的时候如果发现没有可复用的cell时也要从.budle中取,基础知识不牢固啊,
这一点希望读者注意,.a文件打包前需要资源文件的一定要 处理程序,处理资源文件,这也是xib的一个弊端吧!


另外我打印了一下加载budle 是否成功,但是结果是(not yet loaded)这个我也不知道什么原因,
反正最终结果是加载成功了,有知道的读者可以@我,谢谢!

最后上一张成功的图片

iOS 封装SDK以及封装时bundle文件的处理的更多相关文章
- 转:IOS:查找SDK路径和Framework头文件
通过Terminal进入Xcode.app所在目录,可以找到相应的SDK路径,相关 的Framework的头文件也在改目录下. 示例如下: Frameworks /Applications/xcode ...
- 转载 -- iOS中SDK的简单封装与使用
一.功能总述 在博客开始的第一部分,我们先来看一下我们最终要实现的效果.下图中所表述的就是我们今天博客中要做的事情,下方的App One和App Two都植入了我们将要封装的LoginSDK, 两个A ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- MyWebViewDemo【封装Webview常用配置和选择文件、打开相机、录音、打开本地相册的用法】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装webview的常用配置和选择文件.打开相机.录音.打开本地相册的用法.[如果想要使用简单的预览功能,可以参考<MyBri ...
- iOS 静态库的封装
参考网址:http://www.jianshu.com/p/b754709135fb http://www.jianshu.com/p/443a5b8f3894 注意:封装静态库时要注意的地方: ...
- 基于iOS 10、realm封装的下载器
代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...
- 【iOS系列】-xib封装使用
[iOS系列]-xib封装使用 Xib文件可以用来描述某一块局部的UI界面 Xib文件的加载 修改xib文件的大小size(Freeform) 第一: NSArray *objs = [[NSBund ...
- FFmpeg4.0笔记:本地媒体文件解码、帧格式转换、重采样、编码、封装、转封装、avio、硬解码等例子
Github https://github.com/gongluck/FFmpeg4.0-study/blob/master/official%20example/my_example.cpp #in ...
- AndroidStudio封装SDK的那些事
来自自己简书博客:原文地址:https://www.jianshu.com/p/4d092c915ef1 首先SDK是提供给别人调用的工具.所以常见的SDK都是以jar包,so库,aar包等方式导入A ...
随机推荐
- windows7安装MySQL-python遇到的坑
最近在windows环境上搭建flask使用环境,遇到过很多坑,这次就记录下安装flask-mysqldb所遇到的坑. 正常逻辑是使用pip install flask-mysqldb进行安装.但是会 ...
- Aooms_微服务基础开发平台实战_002_工程构建
一.关于框架更名的一点说明 最近在做年终总结.明年规划.还有几个项目需要了结.出解决方案,事情还比较多,死了不少脑细胞,距离上一篇文章发出已经过了3天,是不是有些人会认为我放弃了又不搞了,NONO,一 ...
- golang判断文件是否存在
判断一个文件是否存在是一个相当常见的需求,在golang中也有多种方案实现这一功能. 现在我们介绍其中两种最常用也是最简单的实现,第一种将是跨平台通用的,而第二种则在POSIX平台上通用. 跨平台实现 ...
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现按钮组功能
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的“Smobil ...
- 【转】java缩放图片、java裁剪图片代码工具类
一首先看下效果 二工具类 三测试类 在系统的上传图片功能中,我们无法控制用户上传图片的大小,用户可能会上传大到几十M小到1k的的图片,一方面图片太大占据了太多的空间,另一方面,我们没办法在页面上显示统 ...
- mysql服务器主从数据库同步配置
首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务. 主机A: 192.168.1.100 从机B: 192.168.1.101 可以有多台从机. 1. ...
- 【设计原则和编程技巧】单一职责原则 (Single Responsibility Principle, SRP)
单一职责原则 (Single Responsibility Principle, SRP) 单一职责原则在设计模式中常被定义为“一个类应该只有一个发生变化的原因”,若我们有两个动机去改写一个方法,那这 ...
- 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY
摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...
- 深入理解 JavaScript 执行上下文和执行栈
前言 如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制.执行上下文和执行栈是 JavaScript ...
- join的简单总结
BAT面试题:现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多 ...