創建.framework和靜態庫.a文件

創建.framework文件#

說明:本次操作使用的是Xcode7.2

1.新建工程,選擇Framework

Create a new Xcode project.png
選擇Framework.png

2.給工程命名,點擊next,選擇保存路徑

project name.png

3.我們首先看到的Products下的FrameworkDemo.framework是紅色,表示還沒有相應的framework文件生成

framework_unvalid.png

4.刪除默認的FrameworkDemo.h文件

刪除默認的.h文件.png

5.刪除后就可以創建自己的類來實現相應的功能,比如

功能實現.png

說明:兩個類里僅寫了示例代碼

在GPModel.h里定義了一個方法

@interface GPModel : NSObject

- (void) learn;

@end

實現方法

@implementation GPModel

-(void)learn{
    NSLog(@"正在學習如何創建framework");
}

@end

在GPView.h文件定義了一個方法

@interface GPView : UIView

- (void) createViewFromSuperView:(UIView *) superView;

@end

實現方法

@implementation GPView

-(void)createViewFromSuperView:(UIView *)superView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    view.backgroundColor = [UIColor redColor];
    [superView addSubview:view];
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end

到這里,假設該framework的所有功能都實現完了,下面的操作就很關鍵了~~

點擊項目,選擇Build Phases,Headers,默認情況下所有的.h文件都已經添加到Project里面了,但是我們需要做一些調整,有些.h必須放到Public下,這樣在外界使用的時候才能調用到相應的接口,不公開的接口文件放在Private下。

接口文件1.png
需要公開的接口文件.png

處理好之后就可以做一下編譯之前的準備工作了

1.選擇運行環境,模擬器或者真機,這個應該都知道怎么選擇吧 這里不在累述了,先選擇模擬器

2.選擇Edit Scheme

Edit Scheme_simulator.png

3.選擇Run,Debug模式,點擊close

RunAndDebug.png

4.編譯一下,到這里,在模擬器下運行的framework已經生成了,但是此時你看到的Product下的.framework文件還是紅色的,這是正常的。甭管它

切換到真機狀態下

1.選擇真機或者iOS Device

iPhone.png

2.選擇Edit Scheme

Edit Scheme_iPhone.png

3.選擇Run,Release模式, 點擊close

RunAndRelease.png

4.編譯,到這里,在真機上運行的framework文件就生成好了,此時看到的product下的.framework文件已經變成黑色了

framework_valid.png

點擊Products下的FrameworkDemo.framework文件,右鍵,選擇show in Finder,可以看到該文件所在位置

show in Finder.png

在這兒可以看到有兩個文件夾,分別對應模擬器和真機,選中任意一種狀態下的FrameworkDemo.framework文件,可以看到該framework文件里面包含的文件

framework——included.png

紅色框選中的為二進制文件。后面會用到

到這里就可以創建一個測試工程來測試創建的framework是否可用了,但是現在使用的話模擬器和真機是分開的,也就是前面兩個文件夾下的framework文件只能在對應的環境下使用。可以通過終端看一下使用環境,首先切換到該目錄下,然后使用 lipo -info 命令。

模擬器文件下的framework

模擬器運行環境.png

真機文件夾下的framework

真機運行環境.png

為了統一使用,可以將兩種狀態下的framework文件合并成一個,這樣在使用的時候就不用區分了。還是用使用終端來實現這一強大的轉變。使用lipo -create XXX XXX -output FrameworkDemo命令。

說明:兩個XXX分別表示模擬器和真機兩個文件下的FrameworkDemo.framework里面的二進制文件FrameworkDemo,output FrameworkDemo中的FrameworkDemo指的是合并之后的二進制文件

合并.png

最后通過ls可以看到多了一個FrameworkDemo文件

使用前的準備
在模擬器或者真機文件夾里把 FrameworkDemo.framework文件復制一份放到桌面上(隨便你放在哪兒都一樣哈),然后把合并之后生成的二進制文件替換調FrameworkDemo.framework里面的二進制文件。這樣一個完整的framework文件就制作完成了,耶耶~

激動人心的時刻到了,創建一個測試工程test,把桌面上的FrameworkDemo.framework放到測試項目中,可以清晰地看到里面的.h文件提供了哪些接口。

scan.png

導入頭文件

#import <FrameworkDemo/GPModel.h>
#import <FrameworkDemo/GPView.h>

測試代碼

- (void)viewDidLoad {
    [super viewDidLoad];

    GPModel *model = [[GPModel alloc] init];
    [model learn];
    
    GPView *view = [[GPView alloc] init];
    [view createViewFromSuperView:self.view];
}

點擊運行,此刻程序崩了,他娘的~ 氣死人了吧
![Error info.png](./Error info.png)

別著急,會有解決辦法的~
點擊項目,General,在Embedded Binaries添加Framework

add Framework.png

添加之后在Linked Frameworks and Libraries里面會看到兩個相同的文件,刪掉一個吧

Delete Framework.png

然后在運行一下,就可以看到你想要的結果了

模擬器運行結果.png

真機運行會出同樣的結果哈,試試吧

結果出來了,恭喜你~~

創建靜態庫.a文件#

打開Xcode,選擇Framework&Library,選擇Cocoa Touch Static Library,點擊Next

choose staticLibrary.png

給靜態庫文件命名(staticLibDemo),點擊Next,選擇保存路徑...

name.png

在項目的左側,我們看到Products文件夾里的libstaticLibDemo.a文件是紅色的,說明該文件是不存在的,所以...

a_ notExist.png

刪除默認的.h和.m文件

delete default.png

創建自己的類來實現該.a文件的功能

my class.png

在GPModel.h里定義了一個方法

@interface GPModel : NSObject

- (void) learn;

@end

實現方法

@implementation GPModel

-(void)learn{
    NSLog(@"正在學習創建靜態庫.a文件");
}

@end

在GPView.h文件定義了一個方法

@interface GPView : UIView

- (void) createViewFromSuperView:(UIView *) superView;

@end

實現方法

@implementation GPView

-(void)createViewFromSuperView:(UIView *)superView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    view.backgroundColor = [UIColor redColor];
    [superView addSubview:view];
}

@end

到這里,假設該靜態庫.a文件的所有功能都實現完了,下面將介紹如何生成.a文件。
首先選中項目名稱,Build Phases,點擊加號+,選擇 New Headers Phase

add New Headers.png

此刻發現Headers里面empty

headers_empty.png

點擊下方的加號+,選中所有.h文件,點擊Add

add_h.png

添加之后發現.h文件全部都在Project里面,所以在這里我們做一些調整,將需要公開接口的.h文件移動到Public,不公開的可以移動到Private

headers_Project.png
headers_Public.png

現在進行編譯,通常只需要設置模擬器和真機,但是在這里需要提醒一下,在編譯之前先進行一項設置,這一步非常重要,選中項目,Build Settings, Architectures里面的Build Active Architecture Only里面有Debug和Release兩種狀態,請都設置成NO,請設置成NO,請設置成NO,重要的事說三遍,(如果是YES的話,假如你選中的是5s進行編譯的話,生成的.a文件就只能在5s的模擬器上運行,在其他機型上是跑不起來的~~)

settings.png

選擇Edit Scheme, Run, Debug, 點擊Close,最后編譯一下,只要編譯成功就可以了,到這里和生成framework是一樣的

Edit Scheme_simulator.png
RunandDebug.png

模擬器編譯完成后.a文件依然是紅色的,和framework一樣,不必驚訝

simulator_a.png

選擇真機

choose iPhone.png
Edit Scheme_iPhone.png

真機選擇 Release ?。?!

RunandRelease.png

編譯成功后.a文件顯示黑色,Show in Finder

iPhone_a.png

在文件夾中發現有兩個文件夾:模擬器的Debug版和真機的Release版, 到這里就創建好了,而且能使用了,但是還不完整,模擬器上的.a文件不能在真機上運行,同樣真機的.a文件不能再模擬器上運行,所以還是和framework一樣,把兩個.a合并成一個通用的版本。

two_a.png

啟動終端,使用lipo -create XXX XXX -output XXX

說明:前面兩個XXX分別表示模擬器和真機編譯的.a文件,最后一個XXX是指合并后的.a文件

terminal.png

執行完以后發現Products下除了模擬器和真機兩個文件夾以外多了一個.a文件,恭喜你,這個.a文件就是通用版本的.a文件,直接把這個.a文件復制一個,比如放在桌面

universal_a.png

.a文件要稍微麻煩一點,除了把這個.a放到項目以外,還要把公開的.h文件一起拷貝出來,可以新建一個文件夾libstaticlibdemo

doucment.png

使用的時候把文件夾libstaticlibdemo放到項目中就可以了。

下面可以新建一個測試工程來測試.a文件的功能
如果出現下面的錯誤,檢測一下前面在編譯之前的準備工作是否完善,選中項目,Build Settings, Architectures里面的Build Active Architecture Only里面有Debug和Release兩種狀態,如果是YES的話就只能選擇之前編譯時選中的模擬器型號了,改成NO,重新生成吧,自作孽,不可活

error information.png

運行結果:

result.png

恭喜,.a文件創建成功.

.framework和.a文件都Ok了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容