SDK的制作详解
一个简单的SDK制作是很容易的,复杂的sdk其实就和复杂化的应用一样,都是从简单开始的,这里介绍一下sdk的简单制作
步骤:
1.创建sdk,公开文件
2.编译、获取sdk文件
3.导入工程,配置文件
4.解决错误,完成
1.创建sdk,公开文件

然后起个需要的名字

创建出这样的sdk,自动生成的文件和普通工程的viewController一样都是可以删的,不喜欢的可以尽管删
介绍使用sdk里面的类和带xib的控制器
先说类,用这个自动生成的,在类里面添加一个打印的方法

.h文件
#import <Foundation/Foundation.h> @interface SDK : NSObject -(void)sdkLog; @end
.m文件
#import "SDK.h" @implementation SDK -(void)sdkLog
{
NSLog(@"sdkAction");
} @end
就是这样普通,然后说下控制器
先创建一个控制器,名为:
SDKViewController 记得勾选添加xib,等下要说明一下暴露文件的

然后在xib上随便添加点什么东西,等下跳转

自己能确定跳转来的是我们sdk里的这个控制器就行了
接下来的比较重要,我们做一个sdk静态库就是为了保护和不让人看见里面的实现内容,但如果是需要被人调用的部分,还是需要暴露出来的,那怎么做呢?

按图操作就能把文件暴露出来,暴露需要被调用的头文件,注意,如果暴露的头文件里包括控制器,而且控制器是有xib文件的,那么xib一定也得暴露出来,否则等下在其他工程里调用的时候,找不到xib的
到这里sdk制作就告一段落,sdk包分三种:真机sdk包,虚拟机sdk包,两种包的合并,合并的就不说了,有兴趣的百度下,一般真正在使用时是不用合并包的,用微博,qq什么sdk的时候就知道,都是把两种包分开的,因为合并的包比较大这样会导致打包后的ipa包变大,引起用户的不满,浪费用户流量。
2.编译、获取sdk文件
接下去-> 编译,选择真机或者Geneic iOS Device编译出来的就是真机sdk,选择虚拟机编译出来的就是虚拟机sdk
真机sdk:

选择真机或者Geneic iOS Device编译,原本红色的libSDK.a就变成灰色,表示文件存在

选中libSDK.a点击右键选择show in finder就能看到内容了,

注意这里文件夹的名字,Debug-iphoneos文件夹是真机sdk文件夹,等下看看虚拟机sdk文件夹的名字
这里include文件夹里面的文件就是暴露的文件,在把libsdk.a加进工程时也要把里面的文件一起加进去的,真机和虚拟机sdk使用是一样的,先看虚拟机的问题
虚拟机sdk:
这里先clear一下,把刚才编程的真机sdk包清理掉才能看到xcode7虚拟机带来的问题,清理完后libSDK.a就是红色的了,不存在
然后选择虚拟机编译,如果你用的是xcode7,你会发现怎么编译,libSDK.a都是红色的,这个是xcode7的bug,之前有人说xcode7没法编译虚拟机的sdk,这是错的,不用着急,照样可以生成,如果编译提示success其实虚拟机sdk还是成功生成的,只是在xcode上看不到,这时不用clear,把真机sdk包也一起编译了,生成了真机的sdk,这里点击libsdk.a文件show in finder,这里就看到的是上面那种情况
注意
之前提过文件夹的名字,现在看到的文件夹还是真机sdk的文件夹,就是你再点虚拟机的编译多一次进来,也会发现是真机的文件夹,这时候按 command+⬆️,返回上层文件夹

现在就看到两个文件夹了,左边的是真机sdk文件夹,右边的是虚拟机sdk文件夹,点击虚拟机文件夹进去就能看到和真机sdk一样的内容,xcode7可以通过这种方式来找虚拟机sdk文件夹的
3.导入工程,配置文件
用虚拟机示范下
创建一个新工程,例如命名test

把include里面的文件夹还有.a文件拉到工程里面如果没勾选要记得勾选add to targets

然后配置一下,选择在配置里搜索search,如果里面的library search paths为空,那么双击空处箭头的地方给它添加一个库的寻找路径,给.a文件路径如 $(PROJECT_DIR)/text/libSDK.a
或者自己加可以找到.a文件的其他路径也可以
不然会找不到.a文件


再搜索other linker,给other linker flags加上 -Objc 和 -all_load,-all_load视情况加,可不加下面有说明

Other Linker Flags:其他链接标签
设为"-ObjC"
当导入的静态库使用了类别,需要设为-ObjC,就算没有使用也给配上,预防以后使用其他的sdk里面有
补充:Other Linker Flags设置的值介绍
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载
这样就配置完了
最后是校验是否能使用sdk了
可以在appdelegate里面这样写
AppDelegate.m文件里先导入工程使用的控制器
#import "ViewController.h"
在下面这个方法里添加导航控制器,因为要跳转到sdk里面的控制器需要
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *rootViewController = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:rootViewController];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
然后在viewController.m里面
或者你如果想看得更明显一点自己加button,加跳转事件才去跳转到sdk里,这里我就偷懒一下了
#import "ViewController.h"
#import "SDK.h"
#import "SDKViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; SDK *sdk = [[SDK alloc]init];
[sdk sdkLog]; SDKViewController *sdkCtl = [[SDKViewController alloc]init];
[self.navigationController pushViewController:sdkCtl animated:YES];
} @end
完成编译运行
4.解决错误,完成
写完编译工程,如果出现类似这样的情况

那是因为虚拟机sdk的编译包也有不同的像i386,x86_64,arm,arm64等,这是我们所需要包的Charts.framework不对,这里不细说了,想了解的可以百度i386,x86_64,arm,arm64的区别,这里最简单直接的解决办法是在编译sdk时选择什么虚拟机,那运行时也用什么虚拟机,但如果sdk编译时用5s、6、6 plus、6s、6s plus编译,那么这些的sdk在这些虚拟机上都能通用,这样也不用考虑那么多了。
framework制作静态库可以和.a是一样的
想制作全部通用的虚拟机sdk包可以参考http://blog.csdn.net/lizhongfu2013/article/details/12648633
最后运行打印出了
sdkAction
界面上显示了sdk里控制器里的界面,恭喜你完成了。
看上面似乎很多内容,其实做多几次了解之后就知道是很简单的,frameword制作静态库时也是这样,动态库就不一样了,也不推荐工程里用自己做的动态库,app store会审核不通过的,然后是debug和release模式,制作真正的sdk时应该在product->scheme->edit scheme的Build Configuration里面把Debug切换为release然后再编译使用,和工程里面是一样的道理,如果都完成了应该换。
SDK的制作详解的更多相关文章
- wpf 客户端【JDAgent桌面助手】开发详解(二)桌面宠物制作详解
目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]开发详解(一)主窗口 ...
- Android中9patch图片格式(xx.9.png)介绍与制作详解
一:9patch图片介绍: android的.9.png是android系统中一种特殊的图片格式,专门用来用来处理图片大小变化后(如拉伸)的失真,不正常,如我们看到的qq聊天中的文字气泡,不管你输入的 ...
- VS2017编译SFML SDK配制环境详解
SFML和Visual Studio 介绍 如果您在Visual Studio IDE(Visual C ++编译器)中使用SFML,本教程是第一个应该阅读的教程.它将解释如何配置您的SFML项目. ...
- 云计算---openstack镜像制作详解
一:本地部署KVM 1.安装KVM 1.1安装须知 查看CPU是否支持kvm完全虚拟机. [root@LINUX ~]# grep "flags" /proc/cpuinfofla ...
- ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解
感谢一路走来默默陪伴和支持的你~~~ -------------------欢迎来访,拒绝转载------------------- 在之前的利用Python分析GP服务运行结果的输出路径 & ...
- Windows To Go 制作详解
拥有 Mac 的同学大概都会碰到一个头疼的问题,那就是使用 Windows 的使用需求.macOS 虽好,不过总是会有一些讨厌的软件没有 Mac 版本,这时就不得不在 Mac 上跑 Windows 了 ...
- Console Add Item –Java使用eBay API SDK刊登商品 详解
准备工作: 1. 运行Eclipse (或其他Java IDE) 2.创建一个ConsoleAddItem工程(项目) 选JDK 1.5.1.6.1.8等版本,已测试1.6.1.8版本. 3.下载JA ...
- 个推安卓推送SDK集成步骤详解
以下是一位开发者在集成个推安卓推送SDK时候的亲身经历: 作者:吃饱了想睡. 概述 公司准备采用个推作为第三方推送平台,我作为客户端的头号小鸟,掐指一算已经毕业 0.1 年了,Leader 准备把这个 ...
- vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
文章很长,建议收藏起来,慢慢读! 备注:持续更新中..... 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 + 涨薪必备 疯 ...
随机推荐
- DOM-Text类型、Comment类型、CDATASection类型、DocumentType类型、DocumentFragment类型、Attr类型
Text类型 文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容.Text节点具有以下特征: nodeType的值为3 nodeName的值为"text" nodeVa ...
- Java 8新特性-2 接口定义增强
为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的 ...
- 通过监控线程状态来保证socket服务器的稳定运行
云平台中使用的socket服务器是我们自己定义一套通信协议,并通过C#实现的一个socket服务. 该服务目前是和web服务一起运行在IIS容器中,通过启动一个永不退出的新线程来监听端口. 在开发的初 ...
- Electron Angular 开发小记
一介绍 electron分为主进程和渲染进程,主进程负责和原生交互,控制窗口等. 渲染进程就是普通网页.主进程和渲染进程可以通过ipcMain(主进程使用)及ipcRenderer(渲染进程用)通信 ...
- jquery动画,基础以及我发现的新大陆
$.animate()在jquery官方介绍有2中方式,其实我发现的新大陆也是第二种方式的扩展! 一.$.animate( properties [, duration ] [, easing ] [ ...
- 本周博客--WinForm线程初步 2014-10-31 09:15 54人阅读 评论(0) 收藏
嗯,WinForm作为一个比较程序的微软的技术已经为我们服务了很久很久,在技术不断更新的今天WinForm虽显老态龙钟但是在客户端快速开发中,它的地位还是无可取代的 今天就来分享一下WinForm中的 ...
- ASP.NET MVC5中View-Controller间数据的传递
使用ASP.NET MVC做开发时,经常需要在页面(View)和控制器(Controller)之间传递数据,那么都有哪些数据传递的方式呢? 本文对于View向Controller中传值共列举了以下几种 ...
- Mac OS平台下应用程序安装包制作工具Packages的使用介绍
一.介绍 Windows下面开发好的应用程序要进行分发时有很多打包工具可供选择,如Inno Setup, InstallShield, NSIS, Advanced Installer, Qt Ins ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- ReactNative——打包发布
1.生成一个签名密钥 ‘ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -k ...