一个简单的SDK制做是很容易的,复杂的sdk其实就和复杂化的应用同样,都是从简单开始的,这里介绍一下sdk的简单制做编程
步骤:xcode
1.建立sdk,公开文件app
2.编译、获取sdk文件iphone
3.导入工程,配置文件ide
4.解决错误,完成ui
1.建立sdk,公开文件spa
而后起个须要的名字.net
建立出这样的sdk,自动生成的文件和普通工程的viewController同样都是能够删的,不喜欢的能够尽管删debug
介绍使用sdk里面的类和带xib的控制器3d
先说类,用这个自动生成的,在类里面添加一个打印的方法
.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里,这里我就偷懒一下了
1 #import "ViewController.h" 2 #import "SDK.h" 3 #import "SDKViewController.h" 4 5 @interface ViewController () 6 7 @end 8 9 @implementation ViewController 10 11 - (void)viewDidLoad { 12 [super viewDidLoad]; 13 14 15 SDK *sdk = [[SDK alloc]init]; 16 [sdk sdkLog]; 17 18 SDKViewController *sdkCtl = [[SDKViewController alloc]init]; 19 [self.navigationController pushViewController:sdkCtl animated:YES]; 20 } 21 22 @end
完成编译运行
4.解决错误,完成
写完编译工程,若是出现相似这样的状况
那是由于虚拟机sdk的编译包也有不一样的像i386,x86_64,arm,arm64等,这是咱们所须要包的Charts.framework不对,这里不细说了,想了解的能够百度i386,x86_64,arm,arm64的区别,这里最简单直接的解决办法是在编译sdk时选择什么虚拟机,那运行时也用什么虚拟机,但若是sdk编译时用5s、六、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而后再编译使用,和工程里面是同样的道理,若是都完成了应该换。