加入收藏 | 设为首页 | 会员中心 | 我要投稿 玉林站长网 (https://www.0775zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

iOS 封装SDK以及封装时bundle文件的解决

发布时间:2021-12-07 14:04:49 所属栏目:教程 来源:互联网
导读:这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件。 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击FileNewProject, 选择iOSFramework and LibraryCocoa Touch Static Library新建一个静态库工程. 将工程命名为SDKTes

这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件。
 
环境:xcode 9.0
 
创建一个静态库工程
 打开Xcode,点击FileNewProject,
 
选择iOSFramework and LibraryCocoa 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];
 
 
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的一个弊端吧!
 
 
 
 
 
 
 
另外我打印了一下加载budle 是否成功,但是结果是(not yet loaded)这个我也不知道什么原因,
 
反正最终结果是加载成功了,有知道的读者可以@我,谢谢!
 
 
 
最后上一张成功的图片
 
 

(编辑:玉林站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读