iOS開發高級分享 - App間帳號共享與SDK封裝

本篇博客就先封裝一個LoginSDK, 讓後將該SDK植入到兩個App中(一個暫且叫作「App One」, 另外一個暫且稱爲「App Two」)。當App One登陸成功後,當你在打開App Tow進行登陸時,咱們封裝的LoginSDK會從KeyChain中取出App One的帳號進行登陸。前提是這兩個App設置了Keychain Share。廢話少說,進入今天的主題。html

點擊此處便可獲取精選面試資料

1、功能總述git

在博客開始的第一部分,咱們先來看一下咱們最終要實現的效果。下圖中所表述的就是咱們今天博客中要作的事情,下方的App One和App Two都植入了咱們將要封裝的LoginSDK, 兩個App中都設置了Keychain Share。當App One經過咱們的LoginSDK登陸後,在啓動App Two時,會去檢索是否有帳號以及在分享的Keychain中存儲了,若是有的話,那麼不會彈出「登陸」界面,直接進行隱式登陸。固然上述這些工做都是在咱們的LoginSDK中進行作的事情。github

image

本部分算是本篇博客的一個綜述吧,從下方截圖中,咱們能清楚的看到上述的兩個App中都植入了咱們接下來要封裝的SDK。LoginSDK.framework就是咱們封裝的登陸靜態庫,其中提供了用戶所調用的API。面試

  

image

下方這個截圖中的內容就是用戶所調用LoginSDK的API。由於咱們作的只是一個Demo,因此下方的API接口比較簡單,若是你要和現實App中真正的需求和業務邏輯整合到一塊,那麼封裝一個登陸用的SDK是很是麻煩的。由於我考慮過把咱們團隊所開發的幾個App中的登陸模塊封裝成SDK, 仔細考慮了一下,東西仍是蠻多的。扯遠了,不過今天這個Demo仍是能夠提供一個大致思路的。bash

下方API的對象是經過單例來獲取的,若是是首次登陸的話,就須要調用getLoginViewController這個方法來獲取登陸頁面,而且這個函數須要提供一個Block參數,這個Block參數用來處理登陸成功後的事件。而登陸失敗等事件就在咱們SDK中自行處理了。微信

checkHaveLogin方法是用來檢查是否已經有帳號登陸過,該方法須要提供兩個Block,一個是登陸成功要執行的Block,一個是沒有已登陸帳號時執行的Block。當執行該方法時,若是以前有帳號登陸過的話,就直接進行隱式登陸,登陸成功後執行loginSuccessBlock。以前若是沒有帳號在此設備上登陸就執行noAccountBlock, 來處理首次登陸的事件。函數

  

image

該部分先聊這麼多,接下來會根據上述的知識點詳細的展開。oop

2、LoginSDK的封裝測試

在封裝LoginSDK以前呢,SDK的源代碼以及所依賴的資源得準備好對吧。下方截圖就是咱們LoginSDK的源代碼,下方綠框中的部分是留給用戶使用的API, 而黃框中的部分就是咱們這個SDK所依賴的資源了,雖然此處只用一個Storyboard,咱們仍是有必要將該資源文件打包成Bundle文件提供給用戶的。而其餘源代碼SDK的用戶是看不到的。源碼準備好,測試完畢後,接下來咱們就要進行SDK的封裝了。微信支付

  

image

1.建立iOS Framework工程

首先咱們須要建立一個iOS的CocoaTouch工程,點擊Next,輸入咱們Framework的名字便可。下方咱們暫且將該Framework的名字命名爲「CreateLoginSDKFramework」。以下所示:

  

image

  

image

2.設定兼容版本

建立完工程後,咱們要選擇「Deployment Target」, 此處咱們選擇的是8.0。也就是說此處咱們封裝的SDK所支持的iOS系統版本是iOS8.0+

  

image

3.選擇「靜態庫」

咱們建立的framework默認是動態庫,因此咱們要講Mach-O Type設置爲靜態庫「Static Library」,以下所示。

  

image

4.引入源代碼並進行編譯

配置好上述選項後,接下來咱們就須要將咱們事先準備好的SDK源代碼引入到咱們的Framework的工程中進行編譯了,在編譯以前咱們要選擇SDK用戶能夠看到的文件。下方截圖中就是在Build Phases下的Headers中進行設置的。將用戶能夠看到的頭文件房子Public中,用戶看不到的放在Project中。以下所示。

  

image

5.編譯

上述設置和配置完畢後,咱們就要對咱們的Framework工程進行編譯了。先選擇模擬器進行編譯,而後選擇真機進行編譯。編譯完後,在Products下會生成相應的Framework, 而後經過Show in Finder進行查看便可。查看時,若是想看「模擬器」和「真機」的framework的話,在Show in finder後,須要前往上層文件夾查看。具體以下所示。

  

image

6.Framework的合併

由於在模擬器下編譯會生成模擬器下使用的Framework,在真機下編譯會生成真機使用的Framework。若是想咱們生成的Framework既能夠在真機下使用,也能夠在模擬器下使用,那麼咱們須要將兩個Framework進行合併。

下方截圖中,這兩個framework一個是真機生成的,另外一個是模擬器生成的,咱們作的事情就是將下方綠框中的兩個文件進行合併。而後使用合併後的文件將下方的文件替換便可。替換後的framework就能夠在模擬器和真機下進行使用了。

  

image

咱們使用「lipo -create 模擬器framework路徑  真機framework路徑 -output 新的文件」命令將上述兩個文件進行合併。下方就是合併上述兩個文件的執行命令, 執行完下方命令後會生成合並後的文件,將上述文件進行替換便可。通過上述步驟,咱們的Framework至此就封裝完畢了。

  

image

3、封裝Bundle

封裝完Framework後,接下來咱們要對Framework依賴的資源文件進行打包了。由於咱們SDK中的界面是使用Storyboard作的,因此須要將Storyboard打包成Bundle資源文件與上述的Framework一塊兒使用。若是咱們SDK中須要一些圖片資源的話,也能夠進行一併打包。接下來咱們就要對資源文件進行打包。

1.Bundle工程的建立

首先咱們像建立Framework工程同樣建立一個Bundle工程,由於iOS工程下方沒有Bundle類型的工程,因此咱們須要在OS X -> Framework & Library -> Bundle下面來建立咱們的Bundle工程。選擇完後,輸出咱們的Bundle文件的名稱便可,以下所示:

  

image

  

image

2. Bundle工程的配置

建立完Bundle工程後,咱們要對其進行相應的配置。由於咱們是選擇OS X建立的Bundle,默認的Bundle是不能在iOS中使用的,因此咱們得將Base SDK進行設置,選擇相應的iOS版本便可,以下所示。選擇完Base SDK後,咱們還要像上面Framework的封裝同樣,設置一下要兼容的iOS版本(iOS Deployment Target), 在此就不作過多贅述了。

  

image

3.引入資源,進行編譯

進行上述配置完後,接下來就是引入資源文件進行編譯了,下方引入的資源文件就是咱們的LoginSDK.storyboard。引入資源後,進行編譯,編譯後會在Products下面生成相應的Bundle資源文件,該文件就能夠和咱們的Framework進行使用了。

  

image

4.Bundle資源的加載

生成完Bundle資源文件後,咱們在SDK的源代碼中,要從Bundle資源文件中進行資源的加載。下方代碼就是加載相應Bundle的代碼。經過下方的宏定義,就能夠經過「Bundle」的名字來加載Bundle。下方的LOGIN_SDK_BUNDLE就是咱們要使用的Bundle資源文件的對象。

#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對象中加載相應的Storyboard。與咱們以前的代碼不一樣,以前咱們是從MainBundle中加載的Storyboard,而如今咱們是從指定的Bundle中來加載Storyboard。具體代碼以下所示。

  

image

4、SDK的引入

SDK已經依賴的資源文件封裝完畢後,接下來就是在其餘App中使用了。在第一部分中的App One和App Two都引入了上述咱們封裝的LoginSDK。引入SDK步驟也是比較簡單的,這和引入友盟,個推,微信支付,支付寶等等SDK的步驟差很少。下方就是咱們引入SDK的步驟。

1.導入SDK並進行相關配置

導入SDK到咱們的App工程後,咱們要對其進行相應的配置。首先咱們要對Framework Search Paths進行配置,也就是說告訴編譯器咱們的第三方SDK所在的位置。下方這個配置項在引入SDK後就默認存在的,若是沒有的話就進行配置便可。

  

image

配置完路徑後,接下來咱們要在Other Linker Flags添加上-Objc和-all_load選項。這兩個選項在以前的博客中也不止一次的提到過。-Objc這個flag告訴連接器把庫中定義的Objective-C類和Category都加載進來。而-all_load會強制連接器把目標文件都加載進來,即便沒有objc代碼。根據上面介紹的,下方即便不添加-Objc這個選項,下方的工程也是能夠正常運行的。

  

image

2.SDK的使用

配置完畢後,接下來就是在咱們App中使用該SDK了。下方代碼就是咱們上述LoginSDK的使用方式,首先獲取單例,而後檢查是否登陸,登陸成功後根據Block回調跳轉到首頁,若是未登陸,就經過LoginAPI獲取登陸頁面進行登陸。具體以下所示。

  

image

5、Keychain共享

關於Keychain共享的東西,咱們能夠看一下上一篇博客的介紹《iOS逆向工程之KeyChain與Snoop-it》。而在本篇博客中,是對keychain共享的應用,在植入上述LoginSDK後,若是想多個App間進行帳號共享的話,要在相應的App上添加Keychain Share的標示了。下方截圖就是咱們第一部分那兩個App中所設置的Keychain共享的配置項了。具體以下所示。

  

image

通過上面的全部步驟,咱們封裝了一個簡單的LoginSDK, 並在多個App中進行植入,而且進行了帳號共享。依照以前的風格,將本篇博客所涉及的全部內容都會在Github上進行分享,下方就是github分享地址。歡迎交流,上述內容有什麼不足之處,歡迎批評指正,謝謝。

github分享地址:github.com/lizelu/Logi…

你認爲如何?請經過加咱們的交流羣 點擊此處進交流羣 ,來一塊兒交流或者發佈您的問題,意見或反饋。

做者:青玉伏案  出處:www.cnblogs.com/ludashi/

相關文章
相關標籤/搜索