先說下封裝SDK的使用場景:
比較常見的就是地圖,視頻播放器,數據統計這種功能性的SDK,做好后出售給其他公司使用,不能暴露源碼;
其他情況就是解耦了,比如說當你的公司有很多個App,名字,電話,頭像,身份證等沒必要讓用戶在登錄公司其它App的時候再設置一遍,也就是所有App共用同一個用戶數據庫,我們就可以開發一個私有庫做組件,或者封裝一個SDK
本文的例子就是封裝一個登錄的SDK
一、開發功能
首先把你想封裝的代碼準備好,比如說用戶登錄時需要的授權工具類,用戶模型等等文件整理好放在一個文件夾里
二、創建庫
1、創建靜態庫
(1).framework
創建一個iOS的CocoaTouch工程,點擊Next,輸入我們Framework的名字即可。下方我們暫且將該Framework的名字命名為“Login”。
操作如下:
Xcode 一> File\New\Project 一> iOS\Framework &Library\Cocoa Touch Framework 一> 命名項目工程 一> 保存目錄
由于framework默認是動態庫,要將Mach-O Type設置為靜態庫“Static Library”
操作如下:
Xcode 一> Project 一> Targets 一> Build Settings 一> Mach-O Type 一> Static Library
(2).a
創建靜態庫的話,可以直接選擇Cocoa Touch Static Library,這樣編譯出來的就是.a文件,不用配置靜態庫了
2、設置最低支持的兼容版本:
創建完工程后,我們要選擇“Deployment Target”, 此處我們選擇的是8.0。也就是說此處我們封裝的SDK所支持的iOS系統版本是iOS8.0+。
操作如下:
Xcode 一> Project 一> Targets 一> General 一> Deployment Info 一> ios8.0(最低支持的兼容版本)
3、導入源代碼文件,設置文件權限:
將第一步準備好的SDK源代碼引入到我們的Framework工程中進行編譯,在編譯之前我們要選擇SDK用戶可以看到的文件。是在Build Phases下的Headers中進行設置的。
將用戶可以看到的頭文件放在Public中,用戶看不到的放在Project中。
操作如下:
Xcode 一> Project 一> Targets 一> Build Phases 一> Headers 一> Public/Private/Project
4、編譯工程:
編譯Framework工程前,需要設置Edit Scheme, 將Debug模式改成Release模式。
設置和配置完畢后,我們就要對我們的Framework工程進行編譯了。先選擇模擬器進行編譯,然后連接真機,選擇真機進行編譯。
編譯完后,在項目Products文件夾下會生成相應的Framework, 然后通過Show in Finder進行查看。
5、合并.framework/.a:
因為在模擬器下編譯會生成模擬器下使用的Framework,在真機下編譯會生成真機使用的Framework。如果想我們生成的Framework既可以在真機下使用,也可以在模擬器下使用,那么我們需要將兩個Framework進行合并。
我們需要的是這兩個文件:
來到終端:
輸入 lipo -info 拖入真機上的這個文件路徑 回車
結果:
前面的不用管,看最后 armv7 arm64 說明是真機,如此方法測試模擬器文件,需得到i386 x86_64才對。
確認兩個文件無誤之后,接下來合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑
因為我們是合并到真機路徑上,所以合并完成后需要按上面的方法進行測試,還是拖入真機路徑,這時候需要得到的是:armv7 i386 x86_64 arm64
此時我們得到了我們需要的SDK了,這個SDK在模擬器上也能使用,在真機上也能使用了:
三、使用
我們把最終的SDK文件拖入我們想要使用的項目中就可以了
導入頭文件方式
如果此時有警告“Missing submodule‘XXXX’”
記得在framework的總頭文件中聲明一下所有公開文件的頭文件
系統的注釋說的也很清楚了
// In this header, you should import all the public headers of your framework using statements like #import <Login/PublicHeader.h>