iOS優(yōu)雅開發(fā)SDK詳細(xì)教程

基本概念

基本概念這里參照了奔狂的蝸牛_文章里的內(nèi)容蕾久。

什么是SDK

軟件開發(fā)工具包(縮寫:SDK冤荆,英語全稱:Software Development Kit),一般都是一些軟件工程師為特定的軟件包怨绣、軟件框架、硬件平臺哼御、操作系統(tǒng)等建立應(yīng)用軟件時的開發(fā)工具的集合民逼。
在OC的開發(fā)中霍殴,我們涉及到的一般是靜態(tài)庫(.a)或者動態(tài)庫(.framework)。(注:不是所有的.framework就一定是動態(tài)庫)

靜態(tài)庫與動態(tài)庫的區(qū)別帝簇?

靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中徘郭,被多次使用就有多份冗余拷貝。表現(xiàn)形式為 .a和.framework己儒。動態(tài)庫:鏈接時不復(fù)制崎岂,程序運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用闪湾,系統(tǒng)只加載一次冲甘,多個程序共用,節(jié)省內(nèi)存途样。 表現(xiàn)形式為 .dylib和.framework江醇。注意:動態(tài)庫只能蘋果使用,如果項目中使用了動態(tài)庫不允許上架(如:jspatch)

a與.framework有什么區(qū)別何暇?

.a是一個純二進(jìn)制文件陶夜,.framework中除了有二進(jìn)制文件之外還有資源文件。 .a文件不能直接使用裆站,至少要有.h文件配合(微信的SDK就是這種形式)条辟,.framework文件可以直接使用。 .a + .h + sourceFile = .framework宏胯。 建議用.framework羽嫡。再者 靜態(tài)方式開發(fā),一直是iOS SDK開發(fā)的主流方式

一肩袍、準(zhǔn)備工作

1杭棵、創(chuàng)建一個目錄

用于將后面開發(fā)的文件統(tǒng)一管理在此目錄下。我這里命名為HLTestSDK-library氛赐。

2魂爪、創(chuàng)建一個Workspace放在HLTestSDK-library目錄下。

用于管理SDK和SDK測試的工程艰管。這里命名為HLTestSDK-workspace滓侍。
2.1、快捷鍵創(chuàng)建:control + command + n
2.2牲芋、手動創(chuàng)建如圖:

1.創(chuàng)建Workspace.jpg

3撩笆、創(chuàng)建SDK工程也放在HLTestSDK-library目錄下尔破。

命名為HLTestSDK
3.1浇衬、快捷鍵創(chuàng)建:shift + command + n
3.2懒构、手動創(chuàng)建如圖:

2.創(chuàng)建工程.jpg

3.創(chuàng)建Framework.jpg

4.創(chuàng)建Framework.jpg

4.創(chuàng)建一個測試工程也放在HLTestSDK-library目錄下。

用于測試SDK耘擂,命名為HLTestSDK-test胆剧。
4.1、快捷鍵創(chuàng)建:shift + command + n
4.2醉冤、手動創(chuàng)建如圖:

1.創(chuàng)建Workspace.jpg

5.創(chuàng)建測試工程.jpg

6.創(chuàng)建測試工程.jpg

至此我們準(zhǔn)備工作已經(jīng)做完秩霍。
查看HLTestSDK-library是否如下圖:
7.HLTest-library目錄.jpg

查看HLTestSDK-workspace.xcworkspace是否如下圖:
8.HLTestSDK-workspace工作空間目錄結(jié)構(gòu).jpg

二、在HLTestSDK中添加測試類

主要用于后面演示暴露頭文件和測試用蚁阳,如圖:


9.在SDK中添加測試類.jpg

10.在SDK中添加測試類.jpg

三铃绒、創(chuàng)建一個AggreGate文件關(guān)聯(lián)SDK

命名為HLTestSDK-aggregate

11.創(chuàng)建Aggregate文件.jpg

12.創(chuàng)建Aggregate文件.jpg

13.創(chuàng)建Aggregate文件.jpg

14.添加自動生成framework的腳本文件.jpg

腳本內(nèi)容如下螺捐,可直接復(fù)制

#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"

#創(chuàng)建輸出目錄颠悬,并刪除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"

#分別編譯模擬器和真機(jī)的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#拷貝framework到univer目錄
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"

lipo "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" -remove arm64 -output "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}"


#合并framework,輸出最終的framework到build目錄
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"

#刪除編譯之后生成的無關(guān)的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判斷build文件夾是否存在定血,存在則刪除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打開合并后的文件夾
open "${UNIVERSAL_OUTPUT_FOLDER}"

拷貝關(guān)聯(lián)后如圖:


15.添加自動生成framework的腳本文件.jpg

四赔癌、配置SDK基礎(chǔ)設(shè)置及暴露給外部調(diào)用的頭文件

1.配置SDK支持最低版本

16.配置SDK支持最低版本.jpg

2.配置SDK支持設(shè)備
17.配置SDK支持設(shè)備.jpg

3.配置SDK為靜態(tài)庫(重點(diǎn))
18.配置SDK為靜態(tài)庫.jpg

4.配置Enable Bitcode
19.配置Enable Bitcode.jpg

5.配置SDK Bulid Configuration
20.配置SDK Bulid Configuration.jpg

21.配置SDK Bulid Configuration.jpg

6.配置Other Linker Flags,添加-ObjC
22.配置Other Linker Flags.jpg

23.配置Other Linker Flags.jpg

7.配置Build Active Architecture Only
24.配置Build Active Architecture Only.jpg

設(shè)置為yes表示它只編譯當(dāng)前的architecture版本
設(shè)置為no表示會編譯所有的版本
為了提高編譯速度:
一般debug的時候可以選擇設(shè)置為yes澜沟,release的時候要改為no灾票,以適應(yīng)不同設(shè)備。

8.SDK暴露頭文件給第三方訪問

25.SDK暴露頭文件給第三方訪問.jpg

26.SDK暴露頭文件給第三方訪問.jpg

9.配置Perform Single-Object PrelinkYES
27.配置Perform Single-Object Prelink.jpg

五茫虽、測試

28.測試.jpg

29.測試.jpg

30.測試.jpg

31.測試.jpg

如果控制臺打印了Hello SDK刊苍,表示你已入門SDK開發(fā)了!

六濒析、SDK項目中的資源文件Bundle(可選)

SDK開發(fā)過程中可能會使用到圖片等資源正什,這些資源我們需要使用Bundle來管理。

1悼枢、創(chuàng)建Bundle

最簡單的方式就是:在桌面上創(chuàng)建一個空的文件夾埠忘,然后文件名稱修改為.bundle結(jié)尾脾拆,那么系統(tǒng)就把這個文件轉(zhuǎn)變成bundle文件馒索,然后拖入你的SDK項目中。

2名船、向Bundle中添加資源

選中Bundle文件 - 右鍵 - 顯示包內(nèi)容 - 將資源文件拖入即可

3绰上、SDK中使用資源

我們用圖片資源演示

/**
 * 從Bundle中獲取圖片
 * @param bundleName bundle名稱
 * @param imageName 圖片名稱
 */
+ (UIImage *)imageWithBundle:(NSString *)bundleName imageName:(NSString *)imageName
{
    if ([UIScreen mainScreen].scale == 3) {
        imageName = [NSString stringWithFormat:@"%@@3x", imageName];
    } else {
        imageName = [NSString stringWithFormat:@"%@@2x", imageName];
    }
    
    // 靜態(tài)庫 url 的獲取
    NSURL *url = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"];
    if (!url) {
        // 動態(tài)庫 url 的獲取
        url = [[NSBundle bundleForClass:[self class]] URLForResource:bundleName withExtension:@"bundle"];
    }
    if (!url) {
        return nil;
    }
    NSBundle *bundle = [NSBundle bundleWithURL:url];
    UIImage *image = [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil];
    return image;
}

七、SDK開發(fā)中其他擴(kuò)展(可選)

  • 獲取當(dāng)前顯示的ViewController
/**
* 獲取當(dāng)前顯示的 UIViewController
*/
+ (UIViewController *)findCurrentShowingViewController {
    //獲得當(dāng)前活動窗口的根視圖
    UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
    UIViewController *currentShowingVC = [self findCurrentShowingViewControllerFrom:vc];
    return currentShowingVC;
}

+ (UIViewController *)findCurrentShowingViewControllerFrom:(UIViewController *)vc
{
    // 遞歸方法 Recursive method
    UIViewController *currentShowingVC;
    if ([vc presentedViewController]) {
        // 當(dāng)前視圖是被presented出來的
        UIViewController *nextRootVC = [vc presentedViewController];
        currentShowingVC = [self findCurrentShowingViewControllerFrom:nextRootVC];

    } else if ([vc isKindOfClass:[UITabBarController class]]) {
        // 根視圖為UITabBarController
        UIViewController *nextRootVC = [(UITabBarController *)vc selectedViewController];
        currentShowingVC = [self findCurrentShowingViewControllerFrom:nextRootVC];

    } else if ([vc isKindOfClass:[UINavigationController class]]){
        // 根視圖為UINavigationController
        UIViewController *nextRootVC = [(UINavigationController *)vc visibleViewController];
        currentShowingVC = [self findCurrentShowingViewControllerFrom:nextRootVC];

    } else {
        // 根視圖為非導(dǎo)航類
        currentShowingVC = vc;
    }

    return currentShowingVC;
}
  • Xcode13+: 工程目錄中沒有 products 路徑了
    點(diǎn)擊頂部菜單 Product > Show Build Folder in Finder 打開編譯后的路徑渠驼,Release-iphoneos 中的庫就是編譯后的庫文件蜈块。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子百揭,更是在濱河造成了極大的恐慌爽哎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器一,死亡現(xiàn)場離奇詭異课锌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祈秕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門渺贤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人请毛,你說我怎么就攤上這事志鞍。” “怎么了方仿?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵固棚,是天一觀的道長。 經(jīng)常有香客問我仙蚜,道長玻孟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任鳍征,我火速辦了婚禮黍翎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艳丛。我一直安慰自己匣掸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布氮双。 她就那樣靜靜地躺著碰酝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪戴差。 梳的紋絲不亂的頭發(fā)上送爸,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音暖释,去河邊找鬼袭厂。 笑死,一個胖子當(dāng)著我的面吹牛球匕,可吹牛的內(nèi)容都是我干的纹磺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼亮曹,長吁一口氣:“原來是場噩夢啊……” “哼橄杨!你這毒婦竟也來了秘症?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤式矫,失蹤者是張志新(化名)和其女友劉穎乡摹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體采转,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趟卸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氏义。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锄列。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惯悠,靈堂內(nèi)的尸體忽然破棺而出邻邮,到底是詐尸還是另有隱情,我是刑警寧澤克婶,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布筒严,位于F島的核電站,受9級特大地震影響情萤,放射性物質(zhì)發(fā)生泄漏鸭蛙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一筋岛、第九天 我趴在偏房一處隱蔽的房頂上張望娶视。 院中可真熱鬧,春花似錦睁宰、人聲如沸搂妻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曼振。三九已至,卻和暖如春红符,著一層夾襖步出監(jiān)牢的瞬間青柄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工预侯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留致开,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓雌桑,卻偏偏與公主長得像喇喉,于是被迫代替她去往敵國和親祖今。 傳聞我的和親對象是個殘疾皇子校坑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容