IOS7開發~Xcode5製作framework

來源:互聯網
上載者:User

標籤:blog   http   使用   os   io   檔案   for   ar   

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

Mac OS X 擴充了 framework 的功能,讓我們能夠利用它來共用代碼和資源。通過 framework 我們可以共用所有形式的資源,如動態共用程式庫,nib 檔,映像字元資源以及文檔等。系統會在需要的時候將 framework 載入記憶體中,多個應用程式可以同時使用同一個 framework,而記憶體中的拷貝只有一份。一個 framework 同時也是一個 bundle,我們可以在 finder 裡瀏覽其內容,也可以在代碼中通過 NSBundle 訪問它。利用 framework 我們可以實現動態或靜態庫的功能。

 

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

 

二、Framework製作方法

1、首先建立兩個項目,分別為FrameworkHome 和 FrameworkDemo,其中FrameworkHome為framework製作項目,FrameworkDemo為framework測試專案。

 

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

a、選擇工程模版

 

b、清理工程無用檔案( Target 、  FrameworkHome、 FrameworkHomeTests)

刪除前:

     

刪除後:

 

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

 

點擊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就是真機版本的,下邊的檔案夾就是模擬器版本的。

 

2、建立FrameworkDemo工程,選擇Empty Application模版就可以了,將剛剛產生的  DemoLibrary.framework 拷貝(也可以引用形式)拖拽到FrameworkDemo中並運行FrameworkDemo。這個地方還有個小細節,FrameworkDemo ->Target - > Architectures 的設定要和framework中的設定相同,不然會出現問題。

 

編譯運行:

 

控制台列印:

 

 

補充:一般framework項目中會有一些圖片等資源要一同提供給使用者,這時就需要將這些資源打包成bundle檔案,和framework一起拷貝到相應的項目中。

1、建立bundle檔案

建立檔案夾 -> 將圖片資源放到檔案夾中 - > 改檔案夾名字為    XXX.bundle ,再將這個bundle檔案一同放到目標工程中。

2、讀取檔案

framework中的代碼就要這樣讀取檔案了,當然還有其他的初始化路徑方法,有需要的可以以後補充。

  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]];  

 

3、一些錯誤的解決辦法

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

4、建立一個真機和模擬器通用的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):

 

1、在製作framework或者lib的時候,如果使用了category ,則使用該FMWK的程式運行時會crash,此時需要在該工程中 other linker flags 添加兩個參數  -ObjC -all_load

2、編譯出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中,這樣就不會報錯了。

 

來自於:http://www.cnblogs.com/heyonggang/p/3513479.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.