SDK的制作详解

摘要:
如果使用多个静态库文件,然后使用此参数,则很可能会遇到ld:duplicatesymbol错误。由于不同的库文件可能具有相同的目标文件,因此建议在-ObjC失败时使用-forces_load参数。

一个简单的SDK制作是很容易的,复杂的sdk其实就和复杂化的应用一样,都是从简单开始的,这里介绍一下sdk的简单制作

步骤:

1.创建sdk,公开文件

2.编译、获取sdk文件

3.导入工程,配置文件

4.解决错误,完成

1.创建sdk,公开文件

SDK的制作详解第1张

然后起个需要的名字

SDK的制作详解第2张

创建出这样的sdk,自动生成的文件和普通工程的viewController一样都是可以删的,不喜欢的可以尽管删

介绍使用sdk里面的类和带xib的控制器

先说类,用这个自动生成的,在类里面添加一个打印的方法

SDK的制作详解第3张

.h文件

#import <Foundation/Foundation.h>

@interface SDK : NSObject

-(void)sdkLog;

@end

.m文件

#import "SDK.h"

@implementation SDK

-(void)sdkLog
{
    NSLog(@"sdkAction");
}

@end

就是这样普通,然后说下控制器

先创建一个控制器,名为:

SDKViewController  记得勾选添加xib,等下要说明一下暴露文件的

SDK的制作详解第4张

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

SDK的制作详解第5张

自己能确定跳转来的是我们sdk里的这个控制器就行了

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

SDK的制作详解第6张

按图操作就能把文件暴露出来,暴露需要被调用的头文件,注意,如果暴露的头文件里包括控制器,而且控制器是有xib文件的,那么xib一定也得暴露出来,否则等下在其他工程里调用的时候,找不到xib的

到这里sdk制作就告一段落,sdk包分三种:真机sdk包,虚拟机sdk包,两种包的合并,合并的就不说了,有兴趣的百度下,一般真正在使用时是不用合并包的,用微博,qq什么sdk的时候就知道,都是把两种包分开的,因为合并的包比较大这样会导致打包后的ipa包变大,引起用户的不满,浪费用户流量。

2.编译、获取sdk文件

接下去-> 编译,选择真机或者Geneic iOS Device编译出来的就是真机sdk,选择虚拟机编译出来的就是虚拟机sdk

真机sdk:

 SDK的制作详解第7张

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

SDK的制作详解第8张

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

SDK的制作详解第9张

注意这里文件夹的名字,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的制作详解第10张

现在就看到两个文件夹了,左边的是真机sdk文件夹,右边的是虚拟机sdk文件夹,点击虚拟机文件夹进去就能看到和真机sdk一样的内容,xcode7可以通过这种方式来找虚拟机sdk文件夹的

3.导入工程,配置文件

用虚拟机示范下

创建一个新工程,例如命名test

SDK的制作详解第11张

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

SDK的制作详解第12张

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

或者自己加可以找到.a文件的其他路径也可以

不然会找不到.a文件

SDK的制作详解第13张SDK的制作详解第14张

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

SDK的制作详解第15张

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的制作详解第16张

那是因为虚拟机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的制作详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle排序MongoDB 的索引到底是使用 B+ 树还是 B 树下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在安卓手机上通过虚拟机运行Windows XP

细数当年的桌面版Windows,似乎针对ARM架构处理器的版本并不多,笔者曾用过一段时间的Windows RT,对它流畅的操作和强大的完整版Office非常满意,然而Windows RT却因不能升级到Windows10而与UWP应用无缘。Windows RT虽被微软宣布了“死缓”,但这并不意味着你不能在ARM架构的处理器上运行桌面版Windows。相信很多...

如何在vm虚拟机中安装linux

1、首先在vm中新建一个虚拟机  2、选择典型 3、点击稍后安装操作系统  4、选择安装linux,版本可以选择centOS64位的,根据自己系统的位数选择即可 5、选择安装路径,建议装在其他盘,..反正最好别装在c盘就行了  6、磁盘大小可以根据自身需求设置,选择多个磁盘  7、最后点击完成就over了 8、安装操作系统,首先现点击编辑虚拟机...

如何利用Oracle VM Templates 在几分钟内部署Oracle Real Application Clusters (RAC)

本文未经授权,禁止一切形式的转载。如果对本文有任何疑问可以通过以下方式和我交流: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/pe...

实现主机和虚拟机之间的虚拟串口通讯

一、工具 1、 win10为系统的主机 2、 openwrt为系统的虚拟机 3、 Oracle VM VirtualBox 5.0.12 4、 VSPD虚拟串口工具 二、步骤 1、 主机创建虚拟串口COM1、COM2 2、 virtual Box设置 选择自己编译生成的vmdk文件。 在openwrt中ttyS0对应的是COM1,而ttyS1对...

【Java虚拟机6】Java内存模型(Java篇)

什么是Java内存模型 《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 在此之前,主流程序语言(如C和C++等)直接使用物理硬件和操作系统的内存模型。因此,由于不同平台上内存模型的差异,有可能导致程序...

Windows7虚拟化体验之三:XP MODE体验

  XP MODE体验           部署完XP MODE后,我们可 以先来简单地体验一下在Windows 7下运行XP程序的效果。如图1所示,在Windows7的程序组 中找到Windows Virtial PC下的Virtual Windows XP,这个Virtual Windows XP其实就是XP MODE。只要执行Virtual Win...