[iOS]探秘系列之-SDK開發(fā)

背景

最近入職了一家新公司,進(jìn)來(lái)之后分配到的任務(wù)是為公司APP和客戶做插件化服務(wù)(勘誤:在ios中說(shuō)插件化,怕是要翻水水),也就是做SDK開發(fā).之前開發(fā)APP的時(shí)候總是吐槽別人家的SDK很難用,各種使用上的坑.現(xiàn)在輪到自己來(lái)做了,心里難免會(huì)有一種翻水水的感覺,哈哈......

初識(shí)SDK

iOS中SDK開發(fā)通常有兩種方式:

StaticLibrary
Framework

至于如何創(chuàng)建StaticLibraryFramework的方法這里就不細(xì)說(shuō)了.我這里采用的Framework的方式來(lái)開發(fā),原因是Framework只會(huì)加載一次,比較省空間(移動(dòng)設(shè)備的內(nèi)存通常都是比較珍貴的).
其中Framework工程的BuildSetting中Mach-O Type 設(shè)置為 Static Library;

開發(fā)過(guò)程

  1. 當(dāng)我創(chuàng)建好一個(gè)framework工程之后,我編寫了一些簡(jiǎn)單的代碼用來(lái)測(cè)試,如下圖:


    測(cè)試代碼.png

    功能是:電話號(hào)碼和密碼有為空的情況就彈出一個(gè)警告框,并且回調(diào)一個(gè)bool值判斷是否登錄成功.

  2. 經(jīng)過(guò)編譯之后在Products文件下可以看到framework已經(jīng)生成了:



    然后找到framework的生成文件,拖入到實(shí)現(xiàn)準(zhǔn)備好的測(cè)試demo項(xiàng)目.

  3. 在測(cè)試demo的ViewController.m文件中,我導(dǎo)入了測(cè)試的頭文件MenuSDK.h,調(diào)用了framework中的方法,然后運(yùn)行.
登錄界面

點(diǎn)擊登錄之后按道理應(yīng)該會(huì)有彈窗的出現(xiàn)提示為空的,這里卻并沒有顯示,這里是用sb拖入控件的方式.

那么問(wèn)題來(lái)了

  • 問(wèn)題一:利用xib或者sb拖入的UITextField控件默認(rèn)值是@"",而不是nil,所以我判斷的方式if(!text)有問(wèn)題,于是加了不為@""的情況,然后我在framework工程中更改代碼之后,重新編譯,然后又拖到demo工程中,運(yùn)行之后點(diǎn)擊,效果出現(xiàn)了.嗯,很開心.
  • 問(wèn)題二:在這個(gè)過(guò)程中,每次修改完framework代碼之后都需要重新編譯并且將包拖入到demo工程中,如此反復(fù)幾次之后,簡(jiǎn)直深惡痛絕,這樣搞會(huì)讓人崩潰的!如果把framework工程和demo工程一起管理,編譯demo工程的時(shí)候framework工程就自動(dòng)更新好了那該多好!

問(wèn)題二解決方式:
(1) 打開demo工程,File->New->Workspace,新建一個(gè)workspace,用來(lái)管理demo和framework.
(2) 這時(shí)候會(huì)出現(xiàn)一個(gè)空白的workspace界面,先不動(dòng)它.關(guān)掉demo和framework工程,將兩者根目錄下的xcodeproj拖入到剛剛新建的workspace工程中,如下圖:

workspace

(3)在demo的target中Embedded BinariesLinked Frameworkd and Libaries都要添加MenuSDK.framework

(4) 這時(shí)運(yùn)行會(huì)報(bào)錯(cuò),找不到頭文件MenuSDK.h,因?yàn)樵赿emo的build setting中沒有指定header search paths,雙擊后面的空格,將MenuSDK.frameworkHeaders路徑拖入其中即可,因?yàn)樵趂ramework中頭文件都是在Headers目錄下:

最后成功運(yùn)行!于是就完成了demo和framwork的統(tǒng)一管理,極大方便了SDK的開發(fā)和調(diào)試.

  • 問(wèn)題三:本來(lái)以為將兩者統(tǒng)一到workspace中就基本沒啥問(wèn)題了,但是后來(lái)手賤搞了一個(gè)分類到framework中,然后呢,奇怪的一幕發(fā)生了,當(dāng)我將分類import到.m文件里時(shí),編譯沒問(wèn)題.后來(lái)想到improt到.h中更好,于是順利的按照提示import了,但這時(shí)候報(bào)錯(cuò)了,說(shuō)找不到分類文件......氣哭!好吧,還是import到.m中,這下總沒問(wèn)題了吧.運(yùn)行,報(bào)錯(cuò),定位到使用分類方法的位置,提示:Unrecognize selector.......

這里有兩個(gè)點(diǎn):
1.為啥import到.h文件中找不到分類
2.導(dǎo)入.m文件中后方法未識(shí)別.
解決方式:
咨詢了一位搞SDK的老司機(jī)之后,他回復(fù)了一句話:-ObjC,專治分類.恍然大悟,于是立馬去framework的buildSetting中設(shè)置other link flag-ObjC,問(wèn)題解決,分類也可以使用了.心中一萬(wàn)只那啥跑過(guò)......猜測(cè)一下原因應(yīng)該是分類是屬于OC獨(dú)有的語(yǔ)法特性,所以需要指定-ObjC,額,我能想到就只有這么多了.

  • 問(wèn)題四:framework通常是搭配bundle來(lái)使用的,并且蘋果不允許將bundle打進(jìn)framework包里.那如何使用bundle管理資源文件(圖片,音頻等)呢?

創(chuàng)建bundle有兩種方式:
(1) xcode里面setting bundle
(2) 新建一個(gè)文件夾,放入資源文件,然后修改后綴為.bundle
這里我采用的是第二種方式.將bundle拖入到項(xiàng)目中.但是由于是將資源放入了bundle中,那么讀取文件的方式就不同了,以圖片為例:


就需要取到bundle的path來(lái)讀取了.

以上就是這兩天研究SDK開發(fā)遇到的一些實(shí)際問(wèn)題,路才剛剛開始,希望自己以后的SDK開發(fā)之路一()路()順()利().

最后鳴謝羅老板給與的無(wú)私幫助!
9-4日更新:

當(dāng)我們需要在SDK中集成其他sdk的時(shí)候,例如我的sdk中接入微信支付的SDK,那么這個(gè)時(shí)候我們需要將wxpay.a以及header拖入到我們項(xiàng)目中,引入依賴庫(kù)即可.

但是,如果需要集成的是framework的話,親測(cè),直接拖入framework集成暫時(shí)不可行(不知道是我哪里搞錯(cuò)了沒),于是乎查閱了網(wǎng)上的資料,發(fā)現(xiàn)framework只是對(duì).a文件的一次封裝,我們只需要將framework中的二進(jìn)制文件:

添加一個(gè)后綴.a,同時(shí)將這個(gè)轉(zhuǎn)換的.a文件拖入Headers中,最后將這個(gè)Headers文件拖入你的SDK項(xiàng)目中,添加依賴文件即可引用.如下圖效果:

2018-3-27補(bǔ)充:framework中如何做到不直接依賴AFN等三方庫(kù)
1.首先我們新建一個(gè)Lib的framework,里面放入AFN等三方框架,建議是直接拖入代碼.如下圖:


此時(shí)我們需要去target里面配置Build phases,將AFN所有的頭文件全部設(shè)置為public(很重要):

2.我們?cè)俳⑽覀冏约旱膄ramework Task,里面放入業(yè)務(wù)代碼.然后建立一個(gè)workspace,workspace位置可以放在Task工程目錄中,同時(shí)導(dǎo)入lib和Task:


并且Task中關(guān)聯(lián)lib.framwork:

接著在build setting里面設(shè)置framwork search path lib的framwork地址,header search path為lib framwork的headers地址.

最后在我們的業(yè)務(wù)里面可以直接導(dǎo)入三方的頭文件,使用即可:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铐达,一起剝皮案震驚了整個(gè)濱河市猬腰,隨后出現(xiàn)的幾起案子孽江,更是在濱河造成了極大的恐慌,老刑警劉巖掸驱,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工碾,死亡現(xiàn)場(chǎng)離奇詭異庵楷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伞矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門笛洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人乃坤,你說(shuō)我怎么就攤上這事苛让。” “怎么了湿诊?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵狱杰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我厅须,道長(zhǎng)仿畸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任朗和,我火速辦了婚禮错沽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眶拉。我一直安慰自己千埃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布忆植。 她就那樣靜靜地躺著放可,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唱逢。 梳的紋絲不亂的頭發(fā)上吴侦,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音坞古,去河邊找鬼。 笑死劫樟,一個(gè)胖子當(dāng)著我的面吹牛痪枫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叠艳,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奶陈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了附较?” 一聲冷哼從身側(cè)響起吃粒,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拒课,沒想到半個(gè)月后徐勃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事示,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年僻肖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肖爵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臀脏,死狀恐怖劝堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揉稚,我是刑警寧澤秒啦,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站搀玖,受9級(jí)特大地震影響帝蒿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巷怜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一葛超、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧延塑,春花似錦绣张、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宋雏,卻和暖如春芜飘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磨总。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工嗦明, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚪燕。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓娶牌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親馆纳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诗良,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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