iOS&Mac SDK開發(fā)(腳本自動合成河闰,方便調(diào)試)

公司最近開發(fā)SDK,最開始使用原工程褥紫、SDK工程姜性、SDK集成Demo驗證三個工程分開的方式開發(fā),每次都要在原工程開發(fā)實現(xiàn)效果后髓考,將代碼拖到SDK工程生成Framework部念,再將Framework導(dǎo)出到SDK集成Demo進行驗證,做了很多不必要的機械性工作氨菇。本篇通過WorkSpace+SDK自動生成腳本相結(jié)合實現(xiàn)代碼效果與SDK制作實現(xiàn)同步操作儡炼。

Demo地址點這里

1. 工作區(qū)(WorkSpace)結(jié)構(gòu)

SDK之WorkSpace工程結(jié)構(gòu)

1.1 創(chuàng)建工作區(qū)

新建一個目錄DevSDKWorkSpace,創(chuàng)建WorkSpace,選擇剛才創(chuàng)建的目錄查蓉。

創(chuàng)建workspace

1.2 新建一個Project

首先創(chuàng)建原工程乌询,選擇剛剛創(chuàng)建的WorkSpace。

新建Project

按照這樣豌研,創(chuàng)建好SDK集成Demo妹田。

1.3 創(chuàng)建SDK工程之Framework工程

1.3.1 新建Project

選擇CocoaTouchFramework唬党,選擇第一步創(chuàng)建的WorkSpace,這樣就創(chuàng)建好了產(chǎn)生.framework和.a文件的SDK工程鬼佣。

SDK之SDK創(chuàng)建

1.3.2 修改配置

創(chuàng)建好SDK中Framework工程后驶拱,修改其配置:

在Other Linker Flags 下添加一個-fembed-bitcode,增加Bitcode支持

SDK之Framework配置

1.3.3 新建一個Aggregate

新建一個Aggregate

選中剛剛創(chuàng)建的Aggregare,然后選中右側(cè)的Build Phases,點擊左邊的+號晶衷,選擇New Run Script Phases

SDK之Aggregate嵌入腳本

1.3.4 將下面的腳本復(fù)制進去

if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"


#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"


#真機build生成的.framework文件路徑
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/${PROJECT_NAME}.framework
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"
#模擬器build生成的.framework文件路徑
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/${PROJECT_NAME}.framework
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"


#目標(biāo)文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"
#目標(biāo).framework路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/${PROJECT_NAME}.framework
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"


#判斷build文件夾是否存在蓝纲,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi
#判斷目標(biāo)文件夾是否存在,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

#創(chuàng)建目標(biāo)文件夾  -p會創(chuàng)建中間目錄
mkdir -p "${INSTALL_DIR}"


#build之前clean一下
xcodebuild -target ${target_Name} clean
#模擬器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator
#真機build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos


cp -R "${DEVICE_DIR_A}" "${INSTALL_DIR_A}"

#合成模擬器和真機.framework包
lipo -create "${DEVICE_DIR_A}/${PROJECT_NAME}" "${SIMULATOR_DIR_A}/${PROJECT_NAME}" -output "${INSTALL_DIR_A}/${PROJECT_NAME}"

#打開目標(biāo)文件夾
open "${INSTALL_DIR}"

fi
SDK之腳本嵌入

1.3.5 直接編譯

Command+B直接編譯晌纫,產(chǎn)生.framework税迷。

SDK之Aggregate編譯

1.3.6 添加新文件

添加新文件,將需要暴露的文件進行配置缸匪。

SDK之Framework暴露文件配置

1.4 創(chuàng)建SDK工程之.a工程

1.4.1 創(chuàng)建.a工程及配置

基本步驟與FrameWork工程一致翁狐,第一步要選擇CocoaTouchStaticLibrary类溢。

然后凌蔬,直接跳到第四步,將如下腳本復(fù)制進去闯冷。

if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"

#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真機build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真機build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

#目標(biāo)文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"

#目標(biāo)頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目標(biāo).a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

#判斷build文件夾是否存在砂心,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判斷目標(biāo)文件夾是否存在,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標(biāo)文件夾
mkdir -p "${INSTALL_DIR}"

#build之前clean一下
xcodebuild -target ${target_Name} clean

#模擬器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真機build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

#復(fù)制頭文件到目標(biāo)文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模擬器和真機.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打開目標(biāo)文件夾
open "${INSTALL_DIR}"

fi

1.4.2 編譯

Command+B直接編譯蛇耀,產(chǎn)生.a及暴露的頭文件(Headers文件夾中)辩诞。

SDK之Aggregate編譯.a

1.4.3 添加新文件

添加新文件,將需要暴露的文件進行配置纺涤。

SDK之靜態(tài).a生成所有要暴露的h都添加在這里

1.5 目錄結(jié)構(gòu)

目錄的最終結(jié)構(gòu)如圖所示:

ADreamClusive為原工程

ADreamClusiveSDK和ADreamClusiveStasticSDK為(分別產(chǎn)生Framework和.a)SDK工程

ADSDKDemo為SDK集成Demo译暂。

SDK之目錄

2. 將1.3和1.4產(chǎn)生的SDK與SDK集成Demo進行關(guān)聯(lián)

將1.3產(chǎn)生的.framework拖到ADSDKDemo工程中

使用SDK之.framework運行ADSDKDemo。

SDK之Framework調(diào)用

修改SDK中HomeViewController內(nèi)容撩炊,再次編譯運行ADSDKDemo查看效果??M庥馈!拧咳!

集成.a的方式與.framework類型伯顶,不再贅述。

3. 創(chuàng)建使用Bundle資源包

我們的項目中難免會用到圖片資源和xib骆膝,storyboatd資源祭衩,我們可以將這些資源全部歸類到bundle文件中,便于管理阅签。

3.1 創(chuàng)建Bundle

SDK之Bundle創(chuàng)建

3.2 配置

  1. 刪除安裝目錄Bundle文件不需要安裝
  2. 設(shè)置COMBINE_HIDPI_IMAGES參數(shù)為NO,不然圖片會被打包成.tiff后綴
  3. 設(shè)置bundle包與framework的關(guān)聯(lián)
SDK之bundle配置

這樣bundle的修改就能實時反映出來

3.3 生成SDK及使用

編譯運行產(chǎn)生bundle文件掐暮,找到bundle文件,并將bundle包拖到測試demo的目錄下面(選擇Create folder reference)政钟。

SDK之Bundle生成使用

3.4 使用bundle中的資源

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"ADreamClusiveBundle" ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];

// VC的nib資源
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"vc_name" bundle:resourceBundle];

// 圖片資源
UIImageView *imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(120, 50, 100, 50)];
imgView2.image = [UIImage imageNamed:@"buynew" inBundle:resourceBundle compatibleWithTraitCollection:nil];
[self.view addSubview:imgView2];

UIImageView *imgView3 = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
imgView3.image = [UIImage imageNamed:@"demo"];
[self.view addSubview:imgView3];

3.5 此外還可以直接創(chuàng)建一個bundle

省去很多配置劫乱,也可以達到上述效果

SDK之bundle直接方式

參考文獻

  1. 【iOS開發(fā)】在Xcode中做一個.a包合成腳本
  2. iOS SDK~ 打包framework织中、開發(fā)與調(diào)試
  3. iOS 項目中SDK的開發(fā)(framework形式)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市衷戈,隨后出現(xiàn)的幾起案子狭吼,更是在濱河造成了極大的恐慌,老刑警劉巖殖妇,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁笙,死亡現(xiàn)場離奇詭異,居然都是意外死亡谦趣,警方通過查閱死者的電腦和手機疲吸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來前鹅,“玉大人摘悴,你說我怎么就攤上這事〗⒒妫” “怎么了蹂喻?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捂寿。 經(jīng)常有香客問我口四,道長,這世上最難降的妖魔是什么秦陋? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蔓彩,我火速辦了婚禮,結(jié)果婚禮上驳概,老公的妹妹穿的比我還像新娘赤嚼。我一直安慰自己,他們只是感情好顺又,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著待榔,像睡著了一般逞壁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锐锣,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天分瘦,我揣著相機與錄音,去河邊找鬼土陪。 笑死顷窒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馁龟。 我是一名探鬼主播句灌,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屈呕!你這毒婦竟也來了虎眨?” 一聲冷哼從身側(cè)響起棺耍,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤以现,失蹤者是張志新(化名)和其女友劉穎外傅,沒想到半個月后纪吮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡萎胰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年碾盟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奥洼。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巷疼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚼沿,我是刑警寧澤估盘,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站骡尽,受9級特大地震影響遣妥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攀细,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一箫踩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谭贪,春花似錦境钟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至套媚,卻和暖如春缚态,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堤瘤。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工玫芦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人本辐。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓桥帆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親师郑。 傳聞我的和親對象是個殘疾皇子环葵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355