總覽
##一、創建自己的SDK - .a靜態庫
##二、創建自己的SDK - frameWork靜態庫
一、創建自己的SDK - .a靜態庫
這篇教程將只使用一小部分Objective-C代碼,本文主要講解從開始到應用的詳細步驟。
環境:xcode 8.0(網上的demo大多數都是老版本的,發現很多東西跟現在的不一樣)
下面我們開始操作:
創建一個靜態庫工程
打開Xcode,點擊File\New\Project,選擇iOS\Framework and Library\Cocoa Touch Static Library新建一個靜態庫工程.
將工程命名為GGTestSDK,然后將工程保存到一個空目錄下。
一個靜態庫工程由頭文件和實現文件組成,這些文件將被編譯為庫本身。
當創建靜態庫工程時,Xcode會自動添加GGTestSDK.h和GGTestSDK.m。你不需要實現文件,因此右鍵單擊GGTestSDK.m選擇delete,將它刪除到廢紙簍中。
創建一個AlertView控件
其實當前的工程就已經可以用了了,是時候為你的庫添加一些功能了。由于本篇教程的關鍵在于教你怎么樣創建一個GGTestSDK.a,而不是怎么樣構建一個UI控件,這里你可以使用你自己封裝好的控件。將你的控件從Finder中拖到Xcode下GGTestSDK目錄下。
這里有一點要注意了,這里一定要勾選以下三個選項:
然后點擊 Finish 進入工程:
對你的控件的頭文件需要做的另一件事是將其添加到庫的主頭文件GGTestSDK.h中。在這個主頭文件的幫助下,開發者使用你的庫僅僅需要導入一個頭文件,如下面的代碼一樣,而不是自己去選擇自己需要的一塊導入。
接下來就生成靜態庫
1、靜態庫分為手機和模擬器兩種(手機端的只有手機能調用,模擬器的只有模擬器能調用)。
首先,構建模擬器的靜態庫,如圖
然后show in Finder
之后我拿到這個.a文件 還有和他相關的所有.h文件,存放在一個新的文件夾里(隨便起名越吊越好。我的是:mySDK(我還不想辭職))如下
現在呢,你就可以拿著這個文件夾去揮霍了。將他拖到你要應用了工程中
你以為這樣就完事了嗎。哼哼,我就知道瞞不住你們,上面已經提到了,只能在模擬器上運行,如果我們鏈接手機:
我滴天,這都是什么鬼?可怕的報錯信息又來了。其實沒什么,對于這些報錯信息,不要慌,他都是有關鍵點的,這個不多說了,有點跑題。上文說了這是由于我們生成.a文件的時候,是生成的模擬器版本的,想要在手機上用就要生成手機版本的,那么手機版本的怎生成呢?(我都不好意思說了)看圖吧,別打我就行。
改成Device 構建構成(command + B)你就會發現 libGGTestSDK.a 變黑了。
重復之前的步驟 就可以在手機上運行了(但是,模擬器又不能用了。。。。)
接下來,我們就來生成一個雙方都能用的libGGTestSDK.a
首先,打開終端,復制以下命令
lipo -create
模擬器.a文件目錄
真機.a文件目錄
-output 輸出目錄/文件
最后拿到的libGGTestSDK.a 就哪里都可以用了!有不對的地方還望各位多多指正,大家相互溝通交流。
二、創建自己的SDK - frameWork靜態庫
iOS中經常會把你的代碼給第三方使用,但是又不想讓別人看到你實現的源代碼,這時候會有兩種選擇:把你的代碼打包成靜態庫或者Framework。在早兩年的時候,靜態庫毫無疑問十分容易生成,Framework卻比較難做:所以很多時候如果代碼中的.h文件比較少的話,用靜態庫就夠了。然而Framework一直有一個優勢:它看上去高大上(是的,這是我認為它最大的優勢),讓你的工程看上去更加整潔;它對頭文件隱藏的更好(這是什么鬼?)。開始很多人都用的開源框架iOS-Universal-Framework來生成Framework,然而后來Xcode升級后制作Framework變得非常容易,所以這個框架用的人不是非常多了。進入正題吧。首先,你需要新建一個框架的模板:
兩個選項對應Framework和.a文件,選擇第一個
新建工程成功后你發現目錄下有一個.h和一個plist文件,先不管它們。
新建之后
之后,你需要拖入一個相對完整的功能模塊。這里直接創建了兩個新的工具類:
//Tool1.h
- (void)printName:(NSString *)name;
//Tool1.m
- (void)printName:(NSString *)name{ NSLog(@"您的名字為:%@",name);
}
//Tool2.h
- (void)printMyName;
//Tool2.m
#import "Tool1.h"
- (void)printMyName{
Tool1 *tool1 = [[Tool1 alloc]init];
[tool1 printName:@"Tony"];
}
之后向項目中加入你所依賴的框架。
不加的話跑不起來的
隨后在Build Phases->Headers中設置你要暴露的接口。
主要設置Public和Private
這里我把Tool1.h和Tool2.h都移動到了Public中。選擇相應的運行設備:
選個模擬器玩玩
如果你選擇了模擬器,那么打包出來的框架將能在對應的模擬器上使用;如果你選擇了真機,那么將能在對應真機上使用。接下來要用到腳本。所以在Build Phases添加一項Run Script。
點擊那個加號
進入Run Script中,
記得這個在Build Phases下哦
加入下面的腳本將模擬器和真機的Framework合并:
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
接下來的工作就十分輕松了,點擊左上角的運行按鈕,然后腳本就自動彈出生成的Framework了。不過你要在64位和32位的編譯器上各跑一次來適配不同的設備(比如5和5S)。
不得不說這個腳本的彈出功能非常贊
好啦!你已經看到這個Framework了,你現在可以把他拖到你想要用的地方了。快去試試吧!
怎么?你碰到麻煩了?編譯報錯了。哦,你還需要讓編譯器提前編譯這個二進制文件。進入General->Embedded Binaries,將加入的Framework添加上去。
點擊加號加上去
這樣就OK了。
其實制作過程也只是按部就班罷了,Framework的核心在于內部結構的設計。之前和XX銀行合作時,拿到他們的Framework,非常整潔,類名和方法名都極其直觀,完全不用看接口文檔和注釋,一直引以為規范。然而不管怎么樣,請謹慎設計你的接口,在每個對外暴露的方法中做好注釋;最后,一份通用的接口文檔也是必須的。