溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

發(fā)布時(shí)間:2020-05-21 14:37:00 來(lái)源:網(wǎng)絡(luò) 閱讀:413 作者:胡壯壯 欄目:移動(dòng)開(kāi)發(fā)

App間的數(shù)據(jù)共享可以使用KeyChian來(lái)實(shí)現(xiàn)。本篇博客就實(shí)戰(zhàn)一下呢。開(kāi)門(mén)見(jiàn)山,本篇博客會(huì)封裝一個(gè)登錄用的SDK, 該登錄SDK中包括登錄、注冊(cè)、忘記密碼等功能,當(dāng)然該SDK中包括這些功能的UI、數(shù)據(jù)驗(yàn)證等業(yè)務(wù)邏輯、網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)存儲(chǔ)等等。當(dāng)然此處的登錄SDK是一個(gè)簡(jiǎn)化版的,真正的登錄SDK比這個(gè)考慮的東西要多的多,如果在加上多個(gè)App進(jìn)行登錄賬號(hào)的共享的話,那么考慮的東西就更為復(fù)雜了。

本篇博客就先封裝一個(gè)LoginSDK, 讓后將該SDK植入到兩個(gè)App中(一個(gè)暫且叫做“App One”, 另一個(gè)暫且稱為“App Two”)。當(dāng)App One登錄成功后,當(dāng)你在打開(kāi)App Tow進(jìn)行登錄時(shí),我們封裝的LoginSDK會(huì)從KeyChain中取出App One的賬號(hào)進(jìn)行登錄。前提是這兩個(gè)App設(shè)置了Keychain Share。廢話少說(shuō),進(jìn)入今天的主題。

 

一、功能總述

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

 iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

本部分算是本篇博客的一個(gè)綜述吧,從下方截圖中,我們能清楚的看到上述的兩個(gè)App中都植入了我們接下來(lái)要封裝的SDK。LoginSDK.framework就是我們封裝的登錄靜態(tài)庫(kù),其中提供了用戶所調(diào)用的API。

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

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

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

checkHaveLogin方法是用來(lái)檢查是否已經(jīng)有賬號(hào)登錄過(guò),該方法需要提供兩個(gè)Block,一個(gè)是登錄成功要執(zhí)行的Block,一個(gè)是沒(méi)有已登錄賬號(hào)時(shí)執(zhí)行的Block。當(dāng)執(zhí)行該方法時(shí),如果之前有賬號(hào)登錄過(guò)的話,就直接進(jìn)行隱式登錄,登錄成功后執(zhí)行loginSuccessBlock。之前如果沒(méi)有賬號(hào)在此設(shè)備上登錄就執(zhí)行noAccountBlock, 來(lái)處理首次登錄的事件。

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

該部分先聊這么多,接下來(lái)會(huì)根據(jù)上述的知識(shí)點(diǎn)詳細(xì)的展開(kāi)。

 

二、LoginSDK的封裝

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

5.編譯

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

6.Framework的合并

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

三、封裝Bundle

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

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

2. Bundle工程的配置

創(chuàng)建完Bundle工程后,我們要對(duì)其進(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), 在此就不做過(guò)多贅述了。

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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

進(jìn)行上述配置完后,接下來(lái)就是引入資源文件進(jìn)行編譯了,下方引入的資源文件就是我們的LoginSDK.storyboard。引入資源后,進(jìn)行編譯,編譯后會(huì)在Products下面生成相應(yīng)的Bundle資源文件,該文件就可以和我們的Framework進(jìn)行使用了。

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

4.Bundle資源的加載

生成完Bundle資源文件后,我們?cè)赟DK的源代碼中,要從Bundle資源文件中進(jìn)行資源的加載。下方代碼就是加載相應(yīng)Bundle的代碼。通過(guò)下方的宏定義,就可以通過(guò)“Bundle”的名字來(lái)加載Bundle。下方的LOGIN_SDK_BUNDLE就是我們要使用的Bundle資源文件的對(duì)象。

#define LOGIN_SDK_BUNDLE_NAME   @"LoginSDKResource.bundle"#define LOGIN_SDK_BUNDLE_PATH   [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: LOGIN_SDK_BUNDLE_NAME]#define LOGIN_SDK_BUNDLE        [NSBundle bundleWithPath: LOGIN_SDK_BUNDLE_PATH]

下方代碼就是從上述Bundle對(duì)象中加載相應(yīng)的Storyboard。與我們之前的代碼不同,之前我們是從MainBundle中加載的Storyboard,而現(xiàn)在我們是從指定的Bundle中來(lái)加載Storyboard。具體代碼如下所示。

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

四、SDK的引入

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

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

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

2.SDK的使用

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

五、Keychain共享

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

   iOS開(kāi)發(fā)之App間賬號(hào)共享與SDK封裝

 

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


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI