簡單介紹下SDK 的三個層次即彪。
業(yè)務(wù)層 :應(yīng)用方使用相關(guān)API。
銜接層 :保證業(yè)務(wù)層調(diào)用的API不做修改活尊,兼容實現(xiàn)層邏輯隶校。
實現(xiàn)層 :framework ,增加代碼的安全性蛹锰,核心業(yè)務(wù)的保密深胳。
一、為什么做這個framework铜犬?
需求:阿里原有framework包大小為8M(包含的內(nèi)容比較全面)舞终,打包后大概600k,我們需要把整個app的包大小縮減癣猾,那么就需要從每個地方去優(yōu)化敛劝。
二、為什么要有銜接層 纷宇?
要修改底層的framework攘蔽,還要兼顧業(yè)務(wù)方的調(diào)用,那么就需要有這樣一個銜接層呐粘。不然每次修改framework满俗,業(yè)務(wù)方就要修改調(diào)用的API,會無形的增加業(yè)務(wù)方的使用成本作岖。
三唆垃、為什么要有初始化 ?
最開始的設(shè)計思路是痘儡,input 一個字符串辕万,output 一個字符串即可。
+ (DDSecurity *)sharedInstance;
/*
* input 需要加密的數(shù)據(jù)
* return 簽名后字符串
*/
- (NSString *)sign : (NSString *)input;
優(yōu)化后:
+ (DDSecurity *)sharedInstance;
/*
* 初始化數(shù)據(jù)
*/
- (NSInteger )initWithFile;
/*
* input 需要加密的數(shù)據(jù)
* return 簽名后字符串
*/
- (NSString *)sign : (NSString *)input;
初始化好處:只調(diào)用一次,把重復(fù)的事情放在初始化里面渐尿,這樣只需要初始化一次醉途,可以減少內(nèi)存消耗。
四砖茸、iOS 上如何實現(xiàn) Framework 隘擎?
流程參考<和玨貓>的簡書 iOS封裝功能生成 .framework ,有詳細的介紹凉夯。
五货葬、framework 遇到的問題 ?
1.Reason: image not found
dyld: Library not loaded: @rpath/SecurityGuard.framework/SecurityGuard
Referenced from: /Users/didi/Library/Developer/CoreSimulator/Devices/
14A1EFC9-31FD-4FF8-A3A2-64A254FAE27A/data/Containers/Bundle/Application/
60645B0E-F62C-400B-9AA7-53742B0E0B8C/321321.app/321321
Reason: image not found
一頓搜索之后發(fā)現(xiàn)這個問題得產(chǎn)生是因為引用得一些framework只能存在于高版本得sdk中劲够,但是震桶,如果編譯到低版本的ios就會發(fā)生這樣的問題,我的真機是iOS6的版本的征绎,GameController.framework可能高于這個版本蹲姐,這里只需要在對應(yīng)的target下的Build Phases標簽里,找到Link Binary With Libraries人柿,在里面找到GameController.framework柴墩,把status由Required 修改成Optional,然后再運行就OK了顷扩。其他的framework報錯也適用拐邪,只需要修改對應(yīng)的framework的status就行了。
2.遇到 Missing submodule 'SecurityGuard.Security'
#import <UIKit/UIKit.h>
//! Project version number for SecurityGuard.
FOUNDATION_EXPORT double SecurityGuardVersionNumber;
//! Project version string for SecurityGuard.
FOUNDATION_EXPORT const unsigned char SecurityGuardVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <SecurityGuard/PublicHeader.h>
#import <SecurityGuard/DDSecurity.h>
在生成framework 過程中隘截,一定要把你用到的庫包涵在.h中扎阶,不然調(diào)用方引用不到。
3.在模擬器5上運行報錯婶芭,其它模擬器都好使东臀。
在Architectures下增加armv7s,將Build Active Architecture Only 設(shè)置為NO。
4.需要用到的兩個命令
1.lipo -create 合并模擬器和真機
2.lipo -info 查看framework包含的架構(gòu)