IOS7開發~Xcode5製做framework

IOS7開發~Xcode5製做framework

 

相關連接:IOS開發~Cocoa Touch Static Library(靜態庫)html



1、Framework 簡介(Introduction to Framework Programming Guide)

Mac OS X 擴展了 framework 的功能,讓咱們可以利用它來共享代碼和資源。經過 framework 咱們能夠共享全部形式的資源,如動態共享庫,nib 文件,圖像字符資源以及文檔等。系統會在須要的時候將 framework 載入內存中,多個應用程序能夠同時使用同一個 framework,而內存中的拷貝只有一份。一個 framework 同時也是一個 bundle,咱們能夠在 finder 裏瀏覽其內容,也能夠在代碼中經過 NSBundle 訪問它。利用 framework 咱們能夠實現動態或靜態庫的功能。ios

 

翻譯:https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.htmlxcode


2、Framework製做方法

一、首先新建兩個項目,分別爲FrameworkHome 和 FrameworkDemo,其中FrameworkHome爲framework製做項目,FrameworkDemo爲framework測試項目。app



(1)創建FrameworkHome(選擇靜態庫模版)iphone

a、選擇工程模版ide



b、清理工程無用文件( Target 、  FrameworkHome、 FrameworkHomeTests測試

刪除前:字體

     

刪除後:ui



c、刪除舊目標對應的編譯設置spa



點擊Manage Scheme



點擊左下角 「 - 」 號



選擇Delete而且點擊OK



d、增長一個新的Target


點擊 Add Target



選擇模版



點擊Next,而且配置不須要需改,起一個名字,而後點擊Finish



結果



e、修改項目配置

點擊 「步驟d」 中建立的Target,並選擇 Build Settings ->  Architectures -> Base SDK  改成Latest iOS(ios 7.0)

並將 Architectures 改成 Standard architectures (armv7, armv7s)



在 Deployment 下,將 「Mac OS X Deployment Target」改成」Compiler Default」,將 「Targeted Device Family」改成須要的,此處改爲了」iPhone/iPad」,同時能夠根據須要修改 「iOS Deployment Target」,此處改成了 「iOS 5.0」:



在 Linking 中,將 「Dead Code Stripping」 改成 「NO」,將 「Link with Standard Libraries」 改成 「NO」,將 「Mac-O Type」 改成 「Relocatable Object File」:




 Packaging 中,將 「Wrapper Extention」 改成「framework」:



修改 Info,將 「Bundle OS Type Code」 改成 「FMWK」(Framework )



修改預編譯頭文件,注視其中代碼



到此爲止,基本的配置就算完成了,能夠看到如今的 Products中的文件爲 DemoLibrary.framework,不錯,這個就是給FrameworkDemo 使用的framwwork,雖然如今FrameworkDemo尚未建立。但在這以前首先編寫一些 DemoLibrary.framework 中的內容,而後把接口提供給FrameworkDemo。


f、提供對外接口

首先,建立一個類,建議不要使用IXIB,由於之後打包成 framework之後,我遇到了viewController找不到XIB文件的問題,因此不建議使用XIB。

建立兩個ViewController,分別爲 OpenViewController 和 PraviteViewController ,其中OpenViewController 是對外公開的接口,內部實現使用到了 PraviteViewController。



別忘記選擇Target



g、導出頭文件

選中Target(DemoLibrary ) -> Build Phases - > Editor - > Add Build Phase - > Add Copys Headers Build Phase 






展開 「Copy Headers」



點擊右下角的 「 + 」選擇相應的 .h 文件來添加對外的接口



還要把相應Project下的文件拖動到Public下



大功告成,但這個地方有一個細節要注意,當前選擇build生成的framework要選擇ios Device,不要選擇你當前連接的真機,不然會出如今打包的framework在別的機器上使用時出錯。



另外,當前的framework適合真機,若是要作模擬器的framework,要修改爲模擬器版本





如今能夠build  FrameworkHome 工程了!



這個地方有個小技巧,當選擇模擬器,build以後,發現Products下的文件仍然是紅色字體,表示不存在,實際上文件已經有了。那把模擬器換 成Devixe,再build一下,會發現DemoLibrary.framework 字體變黑,表示文件有了,用finder找到起位置:



其中Debug-iphoneos中的framework就是真機版本的,下邊的文件夾就是模擬器版本的。


二、創建FrameworkDemo工程,選擇Empty Application模版就能夠了,將剛剛生成的  DemoLibrary.framework 拷貝(也能夠引用形式)拖拽到FrameworkDemo中並運行FrameworkDemo。這個地方還有個小細節,FrameworkDemo ->Target - > Architectures 的設置要和framework中的設置相同,否則會出現問題。



編譯運行:



控制檯打印:




補充:通常framework項目中會有一些圖片等資源要一同提供給使用者,這時就須要將這些資源打包成bundle文件,和framework一塊兒拷貝到相應的項目中。

一、創建bundle文件

新建文件夾 -> 將圖片資源放到文件夾中 - > 改文件夾名字爲    XXX.bundle ,再將這個bundle文件一同放到目標工程中。

二、讀取文件

framework中的代碼就要這樣讀取文件了,固然還有其餘的初始化路徑方法,有須要的能夠之後補充。

[objc] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  1. NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"Resource" withExtension:@"bundle"]];  

  2. UIImage *img = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"testImg" ofType:@"png"]];  

  3. [viewCtr.view addSubview:[[UIImageView alloc] initWithImage:img]];  


三、一些錯誤的解決辦法

http://stackoverflow.com/questions/14367793/duplicate-symbol-error-in-xcode

duplicate symbol _NXArgcin:    解決辦法:Please set the option "Link with Standard Library" to NO in your build setting

也能夠參考:http://blog.csdn.net/lizhongfu2013/article/details/12912807

四、創建一個真機和模擬器通用的framework

首先用finder找到framework所在的位置


而後找到framework中的文件,例如這裏的  Kalagame-library,而且紀錄其路徑  os_frame_path


一樣方法打開另外一個文件夾,紀錄其中庫的路徑,simulator_frame_path



而後打開控制檯,輸入 lipo -create os_frame_path  simulator_frame_path  -output  newframe

這樣就完成了模擬器和真機版本framework的合併,用finder找到這個newframe,而後把newframe更名字(例如這裏的Kalagame-library),並放回到framework文件夾中,替換原來的文件。


補充(2013/12/20):

 

一、在製做framework或者lib的時候,若是使用了category ,則使用該FMWK的程序運行時會crash,此時須要在該工程中 other linker flags 添加兩個參數  -ObjC -all_load

二、編譯出Framework是,須要把 GenerateDebugSymbols =NO,project與target都要設置下,不然會出現不少 warning:

相似

 

warning: (armv6) /Users/myuser/Library/Developer/Xcode/DerivedData/ ....build/Objects-normal/armv6/ImageRequest.o unable to open object file

 

ios static library 爲何代碼只有700k,最終編譯出來的有3.4m。 

緣由

1: 選擇的是debug模式,改爲release模式後,估計可以下降不少。

2:ios static library 是靜態庫,包含了全部的引用到的代碼,所以多出來的大小,是引用的代碼的大小。因此改爲release之後,大小也不是固定的,取決你所引用代碼的多少。


補充(2014/01/03):

公開了public的類,但public類中引用了private的類,因而打包好以後,對外會報錯,說找不到那個private類。  能夠把 import 「private.h」  放到 public 的.m中,這樣就不會報錯了。

相關文章
相關標籤/搜索