SDK的封裝與使用

原文地址:iOS中SDK的簡單封裝與使用 - CSDN博客

一察净、功能總述

我們先來看一下我們最終要實(shí)現(xiàn)的效果。下圖中所表述的就是我們今天博客中要做的事情尾序,下方的App One和App Two都植入了我們將要封裝的LoginSDK, 兩個(gè)App中都設(shè)置了Keychain Share搂鲫。當(dāng)App One通過我們的LoginSDK登錄后疹蛉,在啟動(dòng)App Two時(shí)嘿般,會去檢索是否有賬號以及在分享的Keychain中存儲了段标,如果有的話,那么不會彈出“登錄”界面炉奴,直接進(jìn)行隱式登錄逼庞。當(dāng)然上述這些工作都是在我們的LoginSDK中進(jìn)行做的事情。


從下方截圖中瞻赶,我們能清楚的看到上述的兩個(gè)App中都植入了我們接下來要封裝的SDK赛糟。LoginSDK.framework就是我們封裝的登錄靜態(tài)庫,其中提供了用戶所調(diào)用的API砸逊。


下方這個(gè)截圖中的內(nèi)容就是用戶所調(diào)用LoginSDK的API璧南。因?yàn)槲覀冏龅闹皇且粋€(gè)Demo,所以下方的API接口比較簡單师逸,如果你要和現(xiàn)實(shí)App中真正的需求和業(yè)務(wù)邏輯整合到一塊司倚,那么封裝一個(gè)登錄用的SDK是非常麻煩的。因?yàn)槲铱紤]過把我們團(tuán)隊(duì)所開發(fā)的幾個(gè)App中的登錄模塊封裝成SDK, 仔細(xì)考慮了一下篓像,東西還是蠻多的动知。扯遠(yuǎn)了,不過今天這個(gè)Demo還是可以提供一個(gè)大體思路的员辩。

下方API的對象是通過單例來獲取的盒粮,如果是首次登錄的話,就需要調(diào)用getLoginViewController這個(gè)方法來獲取登錄頁面奠滑,并且這個(gè)函數(shù)需要提供一個(gè)Block參數(shù)丹皱,這個(gè)Block參數(shù)用來處理登錄成功后的事件。而登錄失敗等事件就在我們SDK中自行處理了宋税。

checkHaveLogin方法是用來檢查是否已經(jīng)有賬號登錄過摊崭,該方法需要提供兩個(gè)Block,一個(gè)是登錄成功要執(zhí)行的Block弃甥,一個(gè)是沒有已登錄賬號時(shí)執(zhí)行的Block爽室。當(dāng)執(zhí)行該方法時(shí)汁讼,如果之前有賬號登錄過的話淆攻,就直接進(jìn)行隱式登錄,登錄成功后執(zhí)行l(wèi)oginSuccessBlock嘿架。之前如果沒有賬號在此設(shè)備上登錄就執(zhí)行noAccountBlock, 來處理首次登錄的事件瓶珊。


二、LoginSDK的封裝

在封裝LoginSDK之前呢耸彪,SDK的源代碼以及所依賴的資源得準(zhǔn)備好對吧伞芹。下方截圖就是我們LoginSDK的源代碼,下方綠框中的部分是留給用戶使用的API, 而黃框中的部分就是我們這個(gè)SDK所依賴的資源了,雖然此處只用一個(gè)Storyboard唱较,我們還是有必要將該資源文件打包成Bundle文件提供給用戶的扎唾。而其他源代碼SDK的用戶是看不到的。源碼準(zhǔn)備好南缓,測試完畢后胸遇,接下來我們就要進(jìn)行SDK的封裝了。


1.創(chuàng)建iOS Framework工程

首先我們需要?jiǎng)?chuàng)建一個(gè)iOS的CocoaTouch工程汉形,點(diǎn)擊Next纸镊,輸入我們Framework的名字即可。下方我們暫且將該Framework的名字命名為“CreateLoginSDKFramework”概疆。如下所示:



2.設(shè)定兼容版本

創(chuàng)建完工程后逗威,我們要選擇“Deployment Target”, 此處我們選擇的是8.0。也就是說此處我們封裝的SDK所支持的iOS系統(tǒng)版本是iOS8.0+岔冀。


3.選擇“靜態(tài)庫”

我們創(chuàng)建的framework默認(rèn)是動(dòng)態(tài)庫凯旭,所以我們要講Mach-O Type設(shè)置為靜態(tài)庫“Static Library”,如下所示楣颠。

4.引入源代碼并進(jìn)行編譯

配置好上述選項(xiàng)后尽纽,接下來我們就需要將我們事先準(zhǔn)備好的SDK源代碼引入到我們的Framework的工程中進(jìn)行編譯了,在編譯之前我們要選擇SDK用戶可以看到的文件童漩。下方截圖中就是在Build Phases下的Headers中進(jìn)行設(shè)置的弄贿。將用戶可以看到的頭文件房子Public中,用戶看不到的放在Project中矫膨。如下所示差凹。

5.編譯

上述設(shè)置和配置完畢后,我們就要對我們的Framework工程進(jìn)行編譯了侧馅。先選擇模擬器進(jìn)行編譯危尿,然后選擇真機(jī)進(jìn)行編譯。編譯完后馁痴,在Products下會生成相應(yīng)的Framework, 然后通過Show in Finder進(jìn)行查看即可谊娇。查看時(shí),如果想看“模擬器”和“真機(jī)”的framework的話罗晕,在Show in finder后济欢,需要前往上層文件夾查看。具體如下所示小渊。


6.Framework的合并

因?yàn)樵谀M器下編譯會生成模擬器下使用的Framework法褥,在真機(jī)下編譯會生成真機(jī)使用的Framework。如果想我們生成的Framework既可以在真機(jī)下使用酬屉,也可以在模擬器下使用半等,那么我們需要將兩個(gè)Framework進(jìn)行合并揍愁。

下方截圖中,這兩個(gè)framework一個(gè)是真機(jī)生成的杀饵,另一個(gè)是模擬器生成的莽囤,我們做的事情就是將下方綠框中的兩個(gè)文件進(jìn)行合并。然后使用合并后的文件將下方的文件替換即可切距。替換后的framework就可以在模擬器和真機(jī)下進(jìn)行使用了烁登。


我們使用“l(fā)ipo -create 模擬器framework路徑 ?真機(jī)framework路徑 -output 新的文件”命令將上述兩個(gè)文件進(jìn)行合并。下方就是合并上述兩個(gè)文件的執(zhí)行命令, 執(zhí)行完下方命令后會生成合并后的文件蔚舀,將上述文件進(jìn)行替換即可饵沧。經(jīng)過上述步驟,我們的Framework至此就封裝完畢了赌躺。


三狼牺、封裝Bundle

封裝完Framework后,接下來我們要對Framework依賴的資源文件進(jìn)行打包了礼患。因?yàn)槲覀僑DK中的界面是使用Storyboard做的是钥,所以需要將Storyboard打包成Bundle資源文件與上述的Framework一起使用。如果我們SDK中需要一些圖片資源的話缅叠,也可以進(jìn)行一并打包悄泥。接下來我們就要對資源文件進(jìn)行打包。

1.Bundle工程的創(chuàng)建

首先我們像創(chuàng)建Framework工程一樣創(chuàng)建一個(gè)Bundle工程肤粱,因?yàn)閕OS工程下方?jīng)]有Bundle類型的工程弹囚,所以我們需要在OS X -> Framework & Library -> Bundle下面來創(chuàng)建我們的Bundle工程。選擇完后领曼,輸出我們的Bundle文件的名稱即可鸥鹉,如下所示:


2. Bundle工程的配置

創(chuàng)建完Bundle工程后,我們要對其進(jìn)行相應(yīng)的配置庶骄。因?yàn)槲覀兪沁x擇OS X創(chuàng)建的Bundle毁渗,默認(rèn)的Bundle是不能在iOS中使用的,所以我們得將Base SDK進(jìn)行設(shè)置单刁,選擇相應(yīng)的iOS版本即可灸异,如下所示。選擇完Base SDK后羔飞,我們還要像上面Framework的封裝一樣肺樟,設(shè)置一下要兼容的iOS版本(iOS Deployment Target), 在此就不做過多贅述了。


3.引入資源褥傍,進(jìn)行編譯

進(jìn)行上述配置完后儡嘶,接下來就是引入資源文件進(jìn)行編譯了喇聊,下方引入的資源文件就是我們的LoginSDK.storyboard恍风。引入資源后,進(jìn)行編譯,編譯后會在Products下面生成相應(yīng)的Bundle資源文件朋贬,該文件就可以和我們的Framework進(jìn)行使用了凯楔。


4.Bundle資源的加載

生成完Bundle資源文件后,我們在SDK的源代碼中锦募,要從Bundle資源文件中進(jìn)行資源的加載摆屯。下方代碼就是加載相應(yīng)Bundle的代碼。通過下方的宏定義糠亩,就可以通過“Bundle”的名字來加載Bundle虐骑。下方的LOGIN_SDK_BUNDLE就是我們要使用的Bundle資源文件的對象。

#defineLOGIN_SDK_BUNDLE_NAME @"LoginSDKResource.bundle"#defineLOGIN_SDK_BUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: LOGIN_SDK_BUNDLE_NAME]#defineLOGIN_SDK_BUNDLE [NSBundle bundleWithPath: LOGIN_SDK_BUNDLE_PATH]

下方代碼就是從上述Bundle對象中加載相應(yīng)的Storyboard赎线。與我們之前的代碼不同廷没,之前我們是從MainBundle中加載的Storyboard,而現(xiàn)在我們是從指定的Bundle中來加載Storyboard垂寥。具體代碼如下所示颠黎。

四、SDK的引入

SDK已經(jīng)依賴的資源文件封裝完畢后滞项,接下來就是在其他App中使用了狭归。在第一部分中的App One和App Two都引入了上述我們封裝的LoginSDK。引入SDK步驟也是比較簡單的文判,這和引入友盟过椎,個(gè)推,微信支付戏仓,支付寶等等SDK的步驟差不多潭流。下方就是我們引入SDK的步驟。

1.導(dǎo)入SDK并進(jìn)行相關(guān)配置

導(dǎo)入SDK到我們的App工程后柜去,我們要對其進(jìn)行相應(yīng)的配置灰嫉。首先我們要對Framework Search Paths進(jìn)行配置,也就是說告訴編譯器我們的第三方SDK所在的位置嗓奢。下方這個(gè)配置項(xiàng)在引入SDK后就默認(rèn)存在的讼撒,如果沒有的話就進(jìn)行配置即可。

配置完路徑后股耽,接下來我們要在Other Linker Flags添加上-Objc和-all_load選項(xiàng)根盒。這兩個(gè)選項(xiàng)在之前的博客中也不止一次的提到過。-Objc這個(gè)flag告訴鏈接器把庫中定義的Objective-C類和Category都加載進(jìn)來物蝙。而-all_load會強(qiáng)制鏈接器把目標(biāo)文件都加載進(jìn)來炎滞,即使沒有objc代碼。根據(jù)上面介紹的诬乞,下方即使不添加-Objc這個(gè)選項(xiàng)册赛,下方的工程也是可以正常運(yùn)行的钠导。

2.SDK的使用

配置完畢后,接下來就是在我們App中使用該SDK了森瘪。下方代碼就是我們上述LoginSDK的使用方式牡属,首先獲取單例,然后檢查是否登錄扼睬,登錄成功后根據(jù)Block回調(diào)跳轉(zhuǎn)到首頁逮栅,如果未登錄,就通過LoginAPI獲取登錄頁面進(jìn)行登錄窗宇。具體如下所示措伐。

五、Keychain共享

關(guān)于Keychain共享的東西军俊,我們可以看一下上一篇博客的介紹《iOS逆向工程之KeyChain與Snoop-it - 青玉伏案 - 博客園》废士。而在本篇博客中,是對keychain共享的應(yīng)用蝇完,在植入上述LoginSDK后官硝,如果想多個(gè)App間進(jìn)行賬號共享的話,要在相應(yīng)的App上添加Keychain Share的標(biāo)示了短蜕。下方截圖就是我們第一部分那兩個(gè)App中所設(shè)置的Keychain共享的配置項(xiàng)了氢架。具體如下所示。


經(jīng)過上面的所有步驟朋魔,我們封裝了一個(gè)簡單的LoginSDK, 并在多個(gè)App中進(jìn)行植入岖研,并且進(jìn)行了賬號共享。

github分享地址:https://github.com/lizelu/LoginManagerSDKSimpleDemo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末警检,一起剝皮案震驚了整個(gè)濱河市孙援,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扇雕,老刑警劉巖拓售,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镶奉,居然都是意外死亡础淤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門哨苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸽凶,“玉大人,你說我怎么就攤上這事建峭〔=模” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵亿蒸,是天一觀的道長凑兰。 經(jīng)常有香客問我掌桩,道長,這世上最難降的妖魔是什么票摇? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮砚蓬,結(jié)果婚禮上矢门,老公的妹妹穿的比我還像新娘。我一直安慰自己灰蛙,他們只是感情好祟剔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摩梧,像睡著了一般物延。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仅父,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天叛薯,我揣著相機(jī)與錄音,去河邊找鬼笙纤。 笑死耗溜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的省容。 我是一名探鬼主播抖拴,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腥椒!你這毒婦竟也來了阿宅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤笼蛛,失蹤者是張志新(化名)和其女友劉穎洒放,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滨砍,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拉馋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惨好。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煌茴。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖日川,靈堂內(nèi)的尸體忽然破棺而出蔓腐,到底是詐尸還是另有隱情,我是刑警寧澤龄句,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布回论,位于F島的核電站散罕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏傀蓉。R本人自食惡果不足惜欧漱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葬燎。 院中可真熱鬧误甚,春花似錦、人聲如沸谱净。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壕探。三九已至冈钦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間李请,已是汗流浹背瞧筛。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留导盅,地道東北人驾窟。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像认轨,于是被迫代替她去往敵國和親绅络。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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