这篇教程的主要目的是解释怎么样在你的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];

 
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)这个我也不知道什么原因,

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

最后上一张成功的图片

												

iOS 封装SDK以及封装时bundle文件的处理的更多相关文章

  1. 转:IOS:查找SDK路径和Framework头文件

    通过Terminal进入Xcode.app所在目录,可以找到相应的SDK路径,相关 的Framework的头文件也在改目录下. 示例如下: Frameworks /Applications/xcode ...

  2. 转载 -- iOS中SDK的简单封装与使用

    一.功能总述 在博客开始的第一部分,我们先来看一下我们最终要实现的效果.下图中所表述的就是我们今天博客中要做的事情,下方的App One和App Two都植入了我们将要封装的LoginSDK, 两个A ...

  3. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

  4. MyWebViewDemo【封装Webview常用配置和选择文件、打开相机、录音、打开本地相册的用法】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装webview的常用配置和选择文件.打开相机.录音.打开本地相册的用法.[如果想要使用简单的预览功能,可以参考<MyBri ...

  5. iOS 静态库的封装

    参考网址:http://www.jianshu.com/p/b754709135fb http://www.jianshu.com/p/443a5b8f3894   注意:封装静态库时要注意的地方: ...

  6. 基于iOS 10、realm封装的下载器

    代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...

  7. 【iOS系列】-xib封装使用

    [iOS系列]-xib封装使用 Xib文件可以用来描述某一块局部的UI界面 Xib文件的加载 修改xib文件的大小size(Freeform) 第一: NSArray *objs = [[NSBund ...

  8. FFmpeg4.0笔记:本地媒体文件解码、帧格式转换、重采样、编码、封装、转封装、avio、硬解码等例子

    Github https://github.com/gongluck/FFmpeg4.0-study/blob/master/official%20example/my_example.cpp #in ...

  9. AndroidStudio封装SDK的那些事

    来自自己简书博客:原文地址:https://www.jianshu.com/p/4d092c915ef1 首先SDK是提供给别人调用的工具.所以常见的SDK都是以jar包,so库,aar包等方式导入A ...

随机推荐

  1. spring-mvc里的 <mvc:resources> 及静态资源访问

    在进行Spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL.配置如下: <servlet> <servlet-name>Sp ...

  2. Python之在函数中使用列表作为默认参数

      本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数.   我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使 ...

  3. Android项目刮刮奖详解(四)

    Android项目刮刮奖详解(三) 前言 上一期我们已经是完成了刮刮卡的基本功能,本期就是给我们的项目增加个功能以及美化一番 目标 增加功能 用户刮卡刮到一定程度的时候,清除遮盖层 在遮盖层放张图片, ...

  4. 1.docker常用命令

    1.启动交互式容器 $ docker run -i -t IMAGE /bin/bash -i --interactive=true|false 默认是false -t --tty=true|fals ...

  5. (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中

    利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目  Dao   (jar)   Service (jar)   Controller (web) ...

  6. RESTful api风格介绍

    RESTful 接口是目前来说比较流行的一种接口,平常在开发中会非常常见. 有过和后端人员对接接口的小伙伴都应该知道,我们所做的大多数操作都是对数据库的四格操作 “增删改查” 对应到我们的接口操作分别 ...

  7. es6 Moduel 默认名与非默认名

    export default default 本质是将后面变量(值)赋给 default,然后以default名称输出. import 在获取default变量时,写在大括号的外面 ,可自定义名称. ...

  8. ionic3 Loading组件的用法

    import { LoadingController } from 'ionic-angular'; @Component({ selector: 'page-contact', templateUr ...

  9. Android 启动APP时黑屏白屏的解决方案

    在开发中,我们在启动app的时候,屏幕会出现一段时间的白屏或者黑屏,不同设备时间长短不同.很影响用户体验. 首先分析一下,产生这个现象的原因,当我们在启动一个应用时,系统会去检查是否已经存在这样一个进 ...

  10. Linux 文件权限管理

    1.文件权限的概述 在Linux系统下,使用权限来保护资源的安全将是一种不错的选择.系统中每个文件的权限都有可读(r).可写(w)和可执行(x)这三种权限,它们分别对应权限数值4.2 和1.系统为每个 ...