總覽
##一掌测、創(chuàng)建自己的SDK - .a靜態(tài)庫
##二、創(chuàng)建自己的SDK - frameWork靜態(tài)庫
一视粮、創(chuàng)建自己的SDK - .a靜態(tài)庫
這篇教程將只使用一小部分Objective-C代碼采桃,本文主要講解從開始到應用的詳細步驟。
環(huán)境:xcode 8.0(網(wǎng)上的demo大多數(shù)都是老版本的昼弟,發(fā)現(xiàn)很多東西跟現(xiàn)在的不一樣)
下面我們開始操作:
創(chuàng)建一個靜態(tài)庫工程
打開Xcode啤它,點擊File\New\Project,選擇iOS\Framework and Library\Cocoa Touch Static Library新建一個靜態(tài)庫工程.
將工程命名為GGTestSDK舱痘,然后將工程保存到一個空目錄下变骡。
一個靜態(tài)庫工程由頭文件和實現(xiàn)文件組成,這些文件將被編譯為庫本身芭逝。
當創(chuàng)建靜態(tài)庫工程時塌碌,Xcode會自動添加GGTestSDK.h和GGTestSDK.m。你不需要實現(xiàn)文件旬盯,因此右鍵單擊GGTestSDK.m選擇delete台妆,將它刪除到廢紙簍中。
創(chuàng)建一個AlertView控件
其實當前的工程就已經(jīng)可以用了了胖翰,是時候為你的庫添加一些功能了接剩。由于本篇教程的關鍵在于教你怎么樣創(chuàng)建一個GGTestSDK.a,而不是怎么樣構建一個UI控件萨咳,這里你可以使用你自己封裝好的控件懊缺。將你的控件從Finder中拖到Xcode下GGTestSDK目錄下。
這里有一點要注意了某弦,這里一定要勾選以下三個選項:
然后點擊 Finish 進入工程:
對你的控件的頭文件需要做的另一件事是將其添加到庫的主頭文件GGTestSDK.h中桐汤。在這個主頭文件的幫助下,開發(fā)者使用你的庫僅僅需要導入一個頭文件靶壮,如下面的代碼一樣怔毛,而不是自己去選擇自己需要的一塊導入。
接下來就生成靜態(tài)庫
1腾降、靜態(tài)庫分為手機和模擬器兩種(手機端的只有手機能調用拣度,模擬器的只有模擬器能調用)。
首先,構建模擬器的靜態(tài)庫抗果,如圖
然后show in Finder
之后我拿到這個.a文件 還有和他相關的所有.h文件筋帖,存放在一個新的文件夾里(隨便起名越吊越好。我的是:mySDK(我還不想辭職))如下
現(xiàn)在呢冤馏,你就可以拿著這個文件夾去揮霍了日麸。將他拖到你要應用了工程中
你以為這樣就完事了嗎。哼哼逮光,我就知道瞞不住你們代箭,上面已經(jīng)提到了,只能在模擬器上運行涕刚,如果我們鏈接手機:
我滴天嗡综,這都是什么鬼?可怕的報錯信息又來了杜漠。其實沒什么极景,對于這些報錯信息,不要慌驾茴,他都是有關鍵點的盼樟,這個不多說了,有點跑題沟涨。上文說了這是由于我們生成.a文件的時候恤批,是生成的模擬器版本的异吻,想要在手機上用就要生成手機版本的裹赴,那么手機版本的怎生成呢?(我都不好意思說了)看圖吧诀浪,別打我就行棋返。
改成Device 構建構成(command + B)你就會發(fā)現(xiàn) libGGTestSDK.a 變黑了。
重復之前的步驟 就可以在手機上運行了(但是雷猪,模擬器又不能用了睛竣。。求摇。射沟。)
接下來,我們就來生成一個雙方都能用的libGGTestSDK.a
首先与境,打開終端验夯,復制以下命令
lipo -create
模擬器.a文件目錄
真機.a文件目錄
-output 輸出目錄/文件
最后拿到的libGGTestSDK.a 就哪里都可以用了!有不對的地方還望各位多多指正摔刁,大家相互溝通交流挥转。
二、創(chuàng)建自己的SDK - frameWork靜態(tài)庫
iOS中經(jīng)常會把你的代碼給第三方使用,但是又不想讓別人看到你實現(xiàn)的源代碼绑谣,這時候會有兩種選擇:把你的代碼打包成靜態(tài)庫或者Framework党窜。在早兩年的時候,靜態(tài)庫毫無疑問十分容易生成借宵,F(xiàn)ramework卻比較難做:所以很多時候如果代碼中的.h文件比較少的話幌衣,用靜態(tài)庫就夠了。然而Framework一直有一個優(yōu)勢:它看上去高大上(是的壤玫,這是我認為它最大的優(yōu)勢)泼掠,讓你的工程看上去更加整潔;它對頭文件隱藏的更好(這是什么鬼垦细?)择镇。開始很多人都用的開源框架iOS-Universal-Framework來生成Framework,然而后來Xcode升級后制作Framework變得非常容易括改,所以這個框架用的人不是非常多了腻豌。進入正題吧。首先嘱能,你需要新建一個框架的模板:
兩個選項對應Framework和.a文件吝梅,選擇第一個
新建工程成功后你發(fā)現(xiàn)目錄下有一個.h和一個plist文件臀晃,先不管它們扎狱。
新建之后
之后粥庄,你需要拖入一個相對完整的功能模塊吗蚌。這里直接創(chuàng)建了兩個新的工具類:
//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)十嘿。
不得不說這個腳本的彈出功能非常贊
好啦因惭!你已經(jīng)看到這個Framework了,你現(xiàn)在可以把他拖到你想要用的地方了详幽∩富叮快去試試吧浸锨!
怎么?你碰到麻煩了版姑?編譯報錯了柱搜。哦,你還需要讓編譯器提前編譯這個二進制文件剥险。進入General->Embedded Binaries,將加入的Framework添加上去聪蘸。
點擊加號加上去
這樣就OK了。
其實制作過程也只是按部就班罷了表制,F(xiàn)ramework的核心在于內部結構的設計健爬。之前和XX銀行合作時,拿到他們的Framework么介,非常整潔娜遵,類名和方法名都極其直觀,完全不用看接口文檔和注釋壤短,一直引以為規(guī)范设拟。然而不管怎么樣,請謹慎設計你的接口久脯,在每個對外暴露的方法中做好注釋纳胧;最后,一份通用的接口文檔也是必須的帘撰。