公司最近開發(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)
1.1 創(chuàng)建工作區(qū)
新建一個目錄DevSDKWorkSpace,創(chuàng)建WorkSpace,選擇剛才創(chuàng)建的目錄查蓉。
1.2 新建一個Project
首先創(chuàng)建原工程乌询,選擇剛剛創(chuàng)建的WorkSpace。
按照這樣豌研,創(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工程鬼佣。
1.3.2 修改配置
創(chuàng)建好SDK中Framework工程后驶拱,修改其配置:
在Other Linker Flags 下添加一個-fembed-bitcode,增加Bitcode支持
1.3.3 新建一個Aggregate
選中剛剛創(chuàng)建的Aggregare,然后選中右側(cè)的Build Phases,點擊左邊的+號晶衷,選擇New Run Script Phases
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
1.3.5 直接編譯
Command+B直接編譯晌纫,產(chǎn)生.framework税迷。
1.3.6 添加新文件
添加新文件,將需要暴露的文件進行配置缸匪。
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文件夾中)辩诞。
1.4.3 添加新文件
添加新文件,將需要暴露的文件進行配置纺涤。
1.5 目錄結(jié)構(gòu)
目錄的最終結(jié)構(gòu)如圖所示:
ADreamClusive為原工程
ADreamClusiveSDK和ADreamClusiveStasticSDK為(分別產(chǎn)生Framework和.a)SDK工程
ADSDKDemo為SDK集成Demo译暂。
2. 將1.3和1.4產(chǎn)生的SDK與SDK集成Demo進行關(guān)聯(lián)
將1.3產(chǎn)生的.framework拖到ADSDKDemo工程中
使用SDK之.framework運行ADSDKDemo。
修改SDK中HomeViewController內(nèi)容撩炊,再次編譯運行ADSDKDemo查看效果??M庥馈!拧咳!
集成.a的方式與.framework類型伯顶,不再贅述。
3. 創(chuàng)建使用Bundle資源包
我們的項目中難免會用到圖片資源和xib骆膝,storyboatd資源祭衩,我們可以將這些資源全部歸類到bundle文件中,便于管理阅签。
3.1 創(chuàng)建Bundle
3.2 配置
- 刪除安裝目錄Bundle文件不需要安裝
- 設(shè)置COMBINE_HIDPI_IMAGES參數(shù)為NO,不然圖片會被打包成.tiff后綴
- 設(shè)置bundle包與framework的關(guān)聯(lián)
這樣bundle的修改就能實時反映出來
3.3 生成SDK及使用
編譯運行產(chǎn)生bundle文件掐暮,找到bundle文件,并將bundle包拖到測試demo的目錄下面(選擇Create folder reference)政钟。
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
省去很多配置劫乱,也可以達到上述效果