Mac OS X 擴展了 Framework 的功能,讓我們能夠利用它來共享代碼和資源。通過 Framework 我們可以共享所有形式的資源,如動態共享庫,nib 文件,圖像字符資源以及文檔等。系統會在需要的時候將Framework 載入內存中,多個應用程序可以同時使用同一個 Framework,而內存中的拷貝只有一份。一個 Framework 同時也是一個 Bundle,我們可以在 Finder 裏瀏覽其內容,也可以在代碼中通過 NSBundle 訪問它。利用 Framework 我們可以實現動態或靜態庫的功能。
1.創建一個名爲PersonFramework 模板選擇“Cocoa Touch Static Library”
2.填寫項目名稱
3.清理工程無用文件( Target 、 PersionFramework、 PersionFrameworkTests)
4.刪除舊的Target的編譯設置:
5.我們把Target刪除後 需要添加一個新的Target
6.修改新的Target編譯配置
a. Architectures 改爲 Standard architectures (armv7, armv7s)根據需要修改
b.在 Deployment 下,將 “Mac OS X Deployment Target”改爲”Compiler Default”,將 “Targeted Device Family”改爲需要的,此處改成了”iPhone/iPad”,同時可以根據需要修改 “iOS Deployment Target”,此處改爲了 “iOS 7.1”(更具需求來,你需要支持到最低系統版本是多少就選多少):
c.在 Linking 中,將 “Dead Code Stripping” 改爲 “NO”,將 “Link with Standard Libraries” 改爲 “NO”,將 “Mac-O Type” 改爲 “Relocatable Object File”:
d. Packaging 中,將 “Wrapper Extention” 改爲“framework”:
e.修改 Info,將 “Bundle OS Type Code” 改爲 “FMWK”(Framework )
f.修改預編譯頭文件,註釋其中代碼
到此爲止,基本的配置就算完成了,可以看到現在的 Products中的文件爲 DemoFrame.Framework,這個就是其它項目需要使用的Framwwork,但在這之前首先編寫一些 DemoLibrary.framework 中的內容,然後把接口提供給其它工程。
7.給調用該Framework的項目提供API
首先建一個名叫FrameDemo的Class
不要忘記選Target
導出頭文件
開始添加
選中.h文件
添加後效果
到這裏,大功告成,但這個地方有一個細節要注意,當前選擇Build生成的Framework要選擇iOS Device,不要選擇你當前鏈接的真機,否則會出現在打包的Framework在別的機器上使用時出錯。
另外,當前的Framework適合真機,如果要做模擬器的Framework,要修改成模擬器版本
好了,現在可以Build FrameworkHome 工程了
我們要的FrameWork出現了
如果要模擬器的 講運行環境設置爲模擬器 在編譯就好了
其中Debug-iphoneos中的framework就是真機版本的,下邊的文件夾就是模擬器版本的。
測試Framework
新建一個iOS項目
導入Framework
編寫代碼:
有沒有看到效果?
好了 製作Framework的教程完成了。
補充
1.讀取文件
Framework中的代碼就要這樣讀取文件了,當然還有其他的初始化路徑方法,有需要的可以以後補充。
示例代碼如下:
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@”Resource” withExtension:@”bundle”]];
UIImage *img = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"testImg" ofType:@"png"]];
[viewCtr.view addSubview:[[UIImageView alloc] initWithImage:img]];
2.建立一個真機和模擬器通用的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改名字,並放回到framework文件夾中,替換原來的文件就可以了。
3.錯誤1
在製作framework或者lib的時候,如果使用了category ,則使用該FMWK的程序運行時會crash,此時需要在該工程中 other linker flags 添加兩個參數 -ObjC -all_load
4.警告
編譯出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