iOS 靜態庫詳解與開發

一:介紹

1. 什麼是庫?

庫是共享程序代碼的方式,通常分爲靜態庫和動態庫。git

靜態庫:連接時完整地拷貝至可執行文件中,被屢次使用就有多份冗餘拷貝。github

動態庫:連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存。bash

2. 兩種形式中.framework的區別

如上圖所示,靜態庫的形式包含.a和.framework兩種形式。微信

動態庫的形式包含.dylib和.framework,其中.framework包括私有的.framework和系統的.framework。模塊化

靜態庫和動態庫都有私有的.framework,可是根本上有所不一樣,動態庫私有的.framework,上架會有機審規則,而且不能動態下載。靜態庫私有的.framework,相似一個封裝的代碼塊,沒有過多的限制。函數

3. 靜態庫中.a與.framework的區別

.a是一個純二進制文件,.framework中除了有二進制文件以外還有資源文件。 .a文件不能直接使用,至少還有.h文件配合,.framework文件能夠直接使用,由於自己包含了h文件和其餘文件post

4. 靜態庫的優勢

  • 實現程序的模塊化,將固定的業務模塊化成靜態庫。
  • 方便共享代碼,便可以和別人分享你的代碼庫,但別人又看不到你代碼的實現。
  • 開發第三方sdk的須要,例如兩個公司之間業務交流,不可能把源代碼都發送給另外一個公司,這時候將私密內容打包成靜態庫,別人只能調用接口,而不能知道其中實現的細節。

公司項目須要開發出一套同時支持微信支付、支付寶支付、銀聯支付的sdk,既要知足本公司項目需求,還須要提供給友方公司使用。微信支付

同時集成三家第三方的支付sdk,其中有大量的配置衝突須要解決。這篇文章經過demo和你們介紹一下如何開發本身的靜態庫.a文件,分享給你們,同時對工做進行總結。ui

二:靜態庫實現

源碼Demo獲取方法

關注 【網羅開發】微信公衆號,回覆【91】即可領取。 網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!url

1. 新建一個靜態庫工程

打開Xcode,點擊File\New\Project,選擇iOS\Framework & Library\Cocoa Touch Static Library新建一個靜態庫工程。

11.png

將工程命名爲FBYSDKDemo,而後將工程保存到一個空目錄下。 靜態庫工程由頭文件FBYSDKDemo.h和實現文件FBYSDKDemo.m組成,這些文件將被編譯爲庫自己,以下圖:

22.png

在開發中,爲了讓開發的靜態庫使用起來更方便,只須要讓使用者導入一個頭文件,即可以訪問你所提供的接口,而且經過接口進行數據回調。

2. 導入頭文件

導入UIKit的頭文件,這是建立一個庫所須要的。當你在建立不一樣的組成類時,你將會爲它們添加到這個文件中,確保它們可以被庫的使用者獲取到。

打開FBYSDKDemo.h,引入頭文件

#import <UIKit/UIKit.h>
複製代碼

點擊Build Phases,展開Link Binary with Libraries這一部分,點擊+添加一個新的framework,找到UIKit.framework,點擊add添加進來。

33.png

若是不結合頭文件,靜態庫是沒有用的,靜態庫編譯一組文件,在這些文件中類和方法都以二進制數據的形式存在。 在靜態庫中類分爲兩類,一類是公開的public,一類是私有的只能內部訪問使用。

接下來,須要在build欄中添加新的phase,來包含全部頭文件。 在Xcode的Build Phases界面,選擇Editor\Add Build Phase\Add Headers Build Phase。

注意:若是發現按上面找到的菜單項是不可點擊的,以下圖:

44.png

點擊下方Build Phases界面的白色區域來獲取Xcode的應用焦點,而後從新試一下

55.png

把FBYSDKDemo.h從項目中拖到Copy Headers下的Public部分。 這裏是要保證用戶可使用庫中公開的類或者接口。

66.png

Copy Headers下的Public部分中所添加的類均是對外公開的。 這裏有三個分組,Public公開的,Private下的頭文件是能夠被用戶看到的,Project下的文件是私有的,這裏建議儘可能將文件放在Public和Project下。

3. 添加配置

添加配置主要是在Build Settings下操做,點擊項目名,而後選擇FBYSDKDemo靜態庫目標,選擇Build Setting欄,而後搜索public header,雙擊Public Headers Folder Path,在彈出視圖中鍵入以下內容

include/$(PROJECT_NAME)
複製代碼

截圖以下:

77.png

由於你建立好的靜態文件供他人使用,最好禁掉無效代碼和debug符號,讓用戶本身選擇對本身的項目有利的部分使用。 在搜索框中分別搜索Dead Code Stripping、Strip Debug Symbol During Copy、Strip Style配置以下:

  • Dead Code Stripping設置爲NO
  • Strip Debug Symbol During Copy 所有設置爲NO
  • Strip Style設置爲Non-Global Symbols

到目前爲止,項目的構建已經完成,選擇目標爲Generic iOS Device,按下command + B進行編譯,工程導航欄中Product目錄下libRWUIControls.a文件將從紅色變爲黑色,代表如今該文件已經存在了。右鍵單擊libRWUIControls.a,選擇Show in Finder,以下圖所示:

83.png

上圖就能夠看到對外公開的FBYSDKDemo.h類,其餘實現類均以二進制的形式在libFBYSDKDemo.a中。

4. 功能實現

這裏以實現靜態庫的開發爲主,功能部分實現一個簡單的功能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進行編譯。

5. 合併靜態庫

選擇目標爲Generic iOS Device,編譯運行後,右鍵單擊libRWUIControls.a,選擇Show in Finder顯示的libFBYSDKDemo.a可在真機,若是在虛擬機中運行會報錯。

因此還要選擇目標爲虛擬機(例如iPhone 7),而後編譯運行,右鍵單擊libRWUIControls.a,選擇Show in Finder顯示的libFBYSDKDemo.a可在虛擬機中運行,若是在真機中運行會報錯。

85.png

合併方法:打開終端,輸入 lipo -create 真機庫.a的路徑 模擬器庫.a的路徑 -output 合成庫的名字(能夠複製模庫.a的路徑,修更名字).a;回車就能夠在模擬庫的文件夾中看到新合成的.a文件了,以下圖:

87.png

合成後靜態庫文件截圖以下:

86.png

libFBYSDKDemo_all.a文件即爲靜態庫文件,一個通用的靜態庫.a就作好了。

三:靜態庫使用

1. 導入靜態庫

導入靜態庫和.h頭文件,注意下圖選項:

89.png

2. 調用函數

源碼以下:

- (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回調獲取到的結果。

3. DEMO截圖以下

DEMO截圖

4. 本篇文章demo源碼:

靜態庫生成demo

靜態庫使用demo

但願能夠幫助你們,若有問題可加QQ技術交流羣: 668562416,若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議

如需轉載請聯繫我,通過受權方可轉載,謝謝

本篇已同步到我的博客:FBY展菲


歡迎關注個人公衆號:網羅開發

相關文章
相關標籤/搜索