一比驻、SDK簡介
庫是程序代碼的集合檀咙,是可執(zhí)行代碼的二進制格式,可以被載入內(nèi)存中執(zhí)行
根據(jù)源代碼的公開與否嫁佳,可以分為開源庫和閉源庫
開源庫公開源代碼挨队,可以看到具體實現(xiàn),如AFNetworking蒿往、SDWebImage等
閉源庫不公開源代碼盛垦,是經(jīng)過編譯的二進制文件,如微信SDK瓤漏,騰訊地圖SDK等
閉源庫又分為靜態(tài)庫和動態(tài)庫
靜態(tài)庫腾夯,鏈接時會被復制到可執(zhí)行文件中,文件形式為.a或.framework蔬充,使用靜態(tài)庫可減少編譯時間蝶俱。
動態(tài)庫,鏈接時不復制饥漫,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存中榨呆,文件形式為.dylib.或framework,使用動態(tài)庫可減小包大小庸队。
二积蜻、SDK常用命令
設(shè)備的CPU架構(gòu):
1、模擬器:
4s-5:i386
5s-皿哨?:x86_64
2浅侨、真機
3gs-4s:armv7
5-5c ? ?:armv7s
5s-? ? :arm64
lipo -info XXX.a
lipo -create Debug-iphoneos/XXX.a Debug-iphonesimulator/XXX.a -output?XXX.a
lipo?XXX.a -thin arm64 -output?XXX-arm64.a
info常用于對外輸出檢查靜態(tài)庫的架構(gòu)信息证膨,create常用于合并真機和模擬器版本如输,一般寫在自動打包的腳本中
三、SDK對外輸出
對外輸出SDK時央勒,必要的元素包括通過測試的SDK本身不见、Demo、接入文檔崔步、測試報告等稳吮。
1、接入文檔
接入文檔中需說明SDK的接入方式和依賴的系統(tǒng)動態(tài)庫
接入文檔中需說明SDK需要的工程配置井濒,如SDK中包括類別方法灶似,需在Build Setting選項卡中Other Linker Flags中加入-ObjC或-force_load等配置
接入文檔中需說明SDK需要的權(quán)限配置列林,如NSLocationWhenInUseUsageDescription、NSFaceIDUsageDescription等
接入文檔中需說明SDK編譯環(huán)境
2酪惭、SDK
SDK必須使用官方正式版Xcode編譯(15年XcodeGhost)
SDK必須使用Release模式編譯(優(yōu)化代碼希痴,Debug模式包含NSLog和測試功能入口)
SDK必須包含真機和模擬器(避免宿主模擬器編譯報錯)
SDK必須支持應有架構(gòu)
SDK應該支持bitcode
SDK應該在頭文件或info中包含靜態(tài)版本號(便于排查問題)
SDK應該提供版本號的查詢API(便于接入方進行版本差異化處理)
SDK如果以.a靜態(tài)庫形式輸出,應包括.h和.a春感,如果有資源還應包括bundle(均不限于一個)
SDK如果以.framework靜態(tài)庫形式輸出砌创,宿主工程需額外引入bundle
SDK如果以.framework動態(tài)庫形式輸出,還需提供對應的dSYM符號文件
四鲫懒、SDK開發(fā)原則
1嫩实、必須加類前綴
iOS沒有命名空間,Apple建議開發(fā)者為自己的項目添加統(tǒng)一的類前綴窥岩,避免和iOS的某些系統(tǒng)符號沖突甲献,但目前沒有強制校驗,App體量增長后統(tǒng)一的前綴也不容易貫徹執(zhí)行颂翼。
開發(fā)SDK為避免與宿主App或系統(tǒng)符號沖突竟纳,必須添加類前綴。
其他iOS內(nèi)的頂級符號也需注意疚鲤,如全局變量、C函數(shù)名等缘挑。
如果SDK包含資源集歇,資源命名也需注意。
2语淘、 類別方法名必須加前綴
因為類別方法也會在類加載過程中被添加到類的方法列表中诲宇,且后添加的先被找到。所以SDK內(nèi)的類別方法如果和宿主App同名惶翻,會有覆蓋或者被覆蓋的情況出現(xiàn)姑蓝。
3、禁止使用Runtime替換系統(tǒng)方法實現(xiàn)吕粗。
部分App選擇使用Runtime替換系統(tǒng)方法實現(xiàn)的方式完成自動化埋點等需求纺荧,如ViewController生命周期方法、按鈕點擊颅筋、手勢等宙暇,如果SDK替換了系統(tǒng)方法實現(xiàn),會導致宿主App此部分功能異常议泵。
4占贫、禁止調(diào)用Apple私有方法
調(diào)用Apple私有方法會導致宿主App有被拒的風險,如使用prefs:root=引導用戶進入各個權(quán)限設(shè)置頁面等功能先口。
5型奥、盡量避免在load方法中加入邏輯
啟動時間是衡量一個App性能的重要指標瞳收,如無必要,盡量避免在SDK開發(fā)中出現(xiàn)使用load方法的情況
五厢汹、工程搭建
開發(fā)SDK螟深,SDK工程的產(chǎn)物為.a或.framework,導入App Demo工程進行聯(lián)調(diào)或測試坑匠,以.a為例血崭,如圖:
由于Demo中Debug較復雜,實際開發(fā)中厘灼,會選擇更便捷的工程組合進行聯(lián)調(diào):
1夹纫、子工程方式,如圖:
需要修改Demo工程Build Settings選項卡Header Search Paths设凹,添加頭文件的相對路徑舰讹。
需要修改Demo工程Build Phases選項卡Link Binary With Libraries,添加SDK闪朱。
2月匣、單工程多Target方式,如圖:
需要修改Demo工程Build Phases選項卡Link Binary With Libraries奋姿,添加SDK锄开。
因為在同一個工程目錄內(nèi),Header Search Paths無需配置称诗。
3萍悴、Workspace方式,如圖:
Demo工程配置與子工程方式相同寓免。
4癣诱、Pod
pod lib create JDPLibrary
幾種方式各有利弊,如何選擇需從項目規(guī)模袜香、工程配置撕予、打包腳本和最重要的業(yè)務(wù)等方面綜合考慮。
六蜈首、第三方庫
原則上实抡,SDK開發(fā)中盡量少使用或者不使用第三方庫,以避免外部的依賴和不可控因素疾就。實際開發(fā)中澜术,由于工期、穩(wěn)定性等因素猬腰,不可避免得使用一些成熟的第三方庫鸟废。為了避免與宿主App可能出現(xiàn)的符號沖突,有幾種方式可以選擇:
1姑荷、改名
優(yōu)點:改名后通過測試既代表比較穩(wěn)定了盒延,后續(xù)不會因為宿主升級第三方庫對自身造成影響
缺點:修改類名缩擂、全局變量名、枚舉名添寺、C方法名等工作量較繁瑣胯盯;SDK包含一份第三方庫的代碼,如果宿主App也依賴计露,這部分屬于冗余代碼博脑。
改名方式:Xcode->Rename;宏命令
2票罐、編譯時不包含第三方庫
優(yōu)缺點與前一種方式相反叉趣,SDK可能受到宿主App升級或修改第三方庫的影響,但無冗余代碼该押。
編譯方式:編譯時只引入頭文件疗杉,對外輸出時,額外輸出一個依賴庫的全集蚕礼,并在接入文檔中寫明版本號烟具。
3、Pods管理