SDK的製做詳解

一個簡單的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而後再編譯使用,和工程裏面是同樣的道理,若是都完成了應該換。

相關文章
相關標籤/搜索