庫是共享程序代碼的方式,通常分爲靜態庫和動態庫。git
靜態庫:連接時完整地拷貝至可執行文件中,被屢次使用就有多份冗餘拷貝。github
動態庫:連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存。bash
如上圖所示,靜態庫的形式包含.a和.framework兩種形式。微信
動態庫的形式包含.dylib和.framework,其中.framework包括私有的.framework和系統的.framework。模塊化
靜態庫和動態庫都有私有的.framework,可是根本上有所不一樣,動態庫私有的.framework,上架會有機審規則,而且不能動態下載。靜態庫私有的.framework,相似一個封裝的代碼塊,沒有過多的限制。函數
.a是一個純二進制文件,.framework中除了有二進制文件以外還有資源文件。 .a文件不能直接使用,至少還有.h文件配合,.framework文件能夠直接使用,由於自己包含了h文件和其餘文件post
公司項目須要開發出一套同時支持微信支付、支付寶支付、銀聯支付的sdk,既要知足本公司項目需求,還須要提供給友方公司使用。微信支付
同時集成三家第三方的支付sdk,其中有大量的配置衝突須要解決。這篇文章經過demo和你們介紹一下如何開發本身的靜態庫.a文件,分享給你們,同時對工做進行總結。ui
關注 【網羅開發】微信公衆號,回覆【91】即可領取。 網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!url
打開Xcode,點擊File\New\Project,選擇iOS\Framework & Library\Cocoa Touch Static Library新建一個靜態庫工程。
將工程命名爲FBYSDKDemo,而後將工程保存到一個空目錄下。 靜態庫工程由頭文件FBYSDKDemo.h和實現文件FBYSDKDemo.m組成,這些文件將被編譯爲庫自己,以下圖:
在開發中,爲了讓開發的靜態庫使用起來更方便,只須要讓使用者導入一個頭文件,即可以訪問你所提供的接口,而且經過接口進行數據回調。
導入UIKit的頭文件,這是建立一個庫所須要的。當你在建立不一樣的組成類時,你將會爲它們添加到這個文件中,確保它們可以被庫的使用者獲取到。
打開FBYSDKDemo.h,引入頭文件
#import <UIKit/UIKit.h>
複製代碼
點擊Build Phases,展開Link Binary with Libraries這一部分,點擊+添加一個新的framework,找到UIKit.framework,點擊add添加進來。
若是不結合頭文件,靜態庫是沒有用的,靜態庫編譯一組文件,在這些文件中類和方法都以二進制數據的形式存在。 在靜態庫中類分爲兩類,一類是公開的public,一類是私有的只能內部訪問使用。
接下來,須要在build欄中添加新的phase,來包含全部頭文件。 在Xcode的Build Phases界面,選擇Editor\Add Build Phase\Add Headers Build Phase。
注意:若是發現按上面找到的菜單項是不可點擊的,以下圖:
點擊下方Build Phases界面的白色區域來獲取Xcode的應用焦點,而後從新試一下
把FBYSDKDemo.h從項目中拖到Copy Headers下的Public部分。 這裏是要保證用戶可使用庫中公開的類或者接口。
Copy Headers下的Public部分中所添加的類均是對外公開的。 這裏有三個分組,Public公開的,Private下的頭文件是能夠被用戶看到的,Project下的文件是私有的,這裏建議儘可能將文件放在Public和Project下。
添加配置主要是在Build Settings下操做,點擊項目名,而後選擇FBYSDKDemo靜態庫目標,選擇Build Setting欄,而後搜索public header,雙擊Public Headers Folder Path,在彈出視圖中鍵入以下內容
include/$(PROJECT_NAME)
複製代碼
截圖以下:
由於你建立好的靜態文件供他人使用,最好禁掉無效代碼和debug符號,讓用戶本身選擇對本身的項目有利的部分使用。 在搜索框中分別搜索Dead Code Stripping、Strip Debug Symbol During Copy、Strip Style配置以下:
到目前爲止,項目的構建已經完成,選擇目標爲Generic iOS Device,按下command + B進行編譯,工程導航欄中Product目錄下libRWUIControls.a文件將從紅色變爲黑色,代表如今該文件已經存在了。右鍵單擊libRWUIControls.a,選擇Show in Finder,以下圖所示:
上圖就能夠看到對外公開的FBYSDKDemo.h類,其餘實現類均以二進制的形式在libFBYSDKDemo.a中。
這裏以實現靜態庫的開發爲主,功能部分實現一個簡單的功能demo來舉例。
在頭文件FBYSDKDemo.h中實現以下代碼:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
typedef void (^FBYSDKCompletion)(NSString *result);
@interface FBYSDKDemo : NSObject
/**
*
* @param urltype 網頁類型信息 urltype可爲iOS、Android
* @param completion 根據urltype獲取到相應網頁url結果回調
*
*/
- (void)urlType:(NSString *)urltype withCompletion:(FBYSDKCompletion)completion;
@end
複製代碼
其中urltype爲網頁類型信息 urltype可爲iOS、Android,根據urltype獲取到相應網頁url結果回調completion。
在實現文件FBYSDKDemo.m中代碼以下:
#import "FBYSDKDemo.h"
@interface FBYSDKDemo ()
@end
@implementation FBYSDKDemo
- (void)urlType:(NSString *)urltype withCompletion:(FBYSDKCompletion)completion{
if ([urltype isEqualToString:[NSString stringWithFormat:@"iOS"]]) {
if (completion) {
completion(@"https://juejin.im/post/5a41c04c6fb9a044fc44fd23");
}
}else if ([urltype isEqualToString:[NSString stringWithFormat:@"Android"]]) {
if (completion) {
completion(@"https://juejin.im/post/5a31e6adf265da430c11d41f");
}
}
}
@end
複製代碼
選擇目標爲Generic iOS Device,按下command + B進行編譯。
選擇目標爲Generic iOS Device,編譯運行後,右鍵單擊libRWUIControls.a,選擇Show in Finder顯示的libFBYSDKDemo.a可在真機,若是在虛擬機中運行會報錯。
因此還要選擇目標爲虛擬機(例如iPhone 7),而後編譯運行,右鍵單擊libRWUIControls.a,選擇Show in Finder顯示的libFBYSDKDemo.a可在虛擬機中運行,若是在真機中運行會報錯。
合併方法:打開終端,輸入 lipo -create 真機庫.a的路徑 模擬器庫.a的路徑 -output 合成庫的名字(能夠複製模庫.a的路徑,修更名字).a;回車就能夠在模擬庫的文件夾中看到新合成的.a文件了,以下圖:
合成後靜態庫文件截圖以下:
libFBYSDKDemo_all.a文件即爲靜態庫文件,一個通用的靜態庫.a就作好了。
導入靜態庫和.h頭文件,注意下圖選項:
源碼以下:
- (void)blogsBtn:(UIButton *)sender {
if (sender.tag == 6000) {
[FBYSDKDemo urlType:@"iOS" withCompletion:^(NSString *result) {
[self contentURL:result];
}];
}else if (sender.tag == 6001) {
[FBYSDKDemo urlType:@"Android" withCompletion:^(NSString *result) {
[self contentURL:result];
}];
}
}
複製代碼
result就是經過sdk回調獲取到的結果。
但願能夠幫助你們,若有問題可加QQ技術交流羣: 668562416,若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,通過受權方可轉載,謝謝
本篇已同步到我的博客:FBY展菲
歡迎關注個人公衆號:網羅開發