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然后再編譯使用,和工程里面是一樣的道理,如果都完成了應該換。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM