iOS 封装SDK以及封装时bundle文件的处理

这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件。

环境:xcode 9.0

创建一个静态库工程

打开Xcode,点击File\New\Project,

选择iOS\Framework and Library\Cocoa Touch Static Library新建一个静态库工程.

iOS 封装SDK以及封装时bundle文件的处理

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

iOS 封装SDK以及封装时bundle文件的处理

当创建静态库工程时,Xcode会自动添加.h和.m。

你不需要实现文件,因此右键单击SDKTest.m选择delete,将它删除即可。

然后工程就已经可以用了了,是时候为你的库添加一些功能了。

由于本篇教程的关键在于教你怎么样创建一个SDKTest.a,

而不是怎么样构建一个UI控件,这里你可以使用你自己封装好的控件。

将你的控件从Finder中拖到Xcode的SDKTest目录下。

这里我使用别人封装过我进行二次封装的日历。

这里有一点要注意了,控件拖进工程这里一定要勾选以下三个选项:

Copy items if needed

create gruoups

Add to targets

iOS 封装SDK以及封装时bundle文件的处理

iOS 封装SDK以及封装时bundle文件的处理

对你的控件的头文件需要做的另一件事是将其添加到库的主头文件SDKTest.h中。

在这个主头文件的帮助下,开发者使用你的库仅仅需要导入一个头文件,

如下面的代码一样,而不是自己去选择自己需要的一块导入。

接下来就生成静态库

静态库分为手机和模拟器两种(手机端的只有手机能调用,模拟器的只有模拟器能调用)。

首先,构建模拟器的静态库,如图(点击三角按钮就可以了,其实是编译,图片中我写成了运行)!

iOS 封装SDK以及封装时bundle文件的处理

然后show in Finder把.a文件拖到桌面即可,

真机的.a文件一样的道理,可以改一个名字方便合成一个.a文件。

iOS 封装SDK以及封装时bundle文件的处理

iOS 封装SDK以及封装时bundle文件的处理

之后打开终端执行下面的命令,这里就不复制了,

手敲一下记忆一下,运行时候桌面会生成一个合成的.a文件。

iOS 封装SDK以及封装时bundle文件的处理

iOS 封装SDK以及封装时bundle文件的处理

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

iOS 封装SDK以及封装时bundle文件的处理

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

iOS 封装SDK以及封装时bundle文件的处理

这样之后你就可以引用SDKTest.h文件进行使用刚才的控件了,其实很简单的。

我在这里遇到了一个问题;在我使用的时候报这个错误,

这个可以这样解决:把对应的 Use Safe Area Layout Guide 去掉勾选即可

iOS 封装SDK以及封装时bundle文件的处理

iOS 封装SDK以及封装时bundle文件的处理

感谢这个篇文章: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

iOS 封装SDK以及封装时bundle文件的处理

添加需要的资源文件

加入你需要编译在bundle中的资源文件。至少选择Base SDK 是iOS的,默认选择是mac的

其他的设置可以参考百度

iOS 封装SDK以及封装时bundle文件的处理

获取.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];

 
VC获得bundle中的资源

NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "MyBundle"ofType :@ "bundle"];

NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"vc_name"bundle:resourceBundle];

 
图片获得bundle中的资源
 UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 50,50)];

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的一个弊端吧!

iOS 封装SDK以及封装时bundle文件的处理

iOS 封装SDK以及封装时bundle文件的处理

另外我打印了一下加载budle 是否成功,但是结果是(not yet loaded)这个我也不知道什么原因,

反正最终结果是加载成功了,有知道的读者可以@我,谢谢!

iOS 封装SDK以及封装时bundle文件的处理

最后上一张成功的图片

iOS 封装SDK以及封装时bundle文件的处理

上一篇:.net的XML对象序列化VS WCF中xml序列化问题


下一篇:SQL复杂语句查询练习