題記:程序員求打賞買個包子吃,謝謝各位
方法比較老 ?但是實踐證明還是很實用的
1.創(chuàng)建一個工程,或者在原有的工程上進行。
2.在原有工程上添加一個靜態(tài)庫

2.1選擇OSX 的Bundle。因為Xcode7 中iOS里沒有Bundle。

2.2、修改Bundle的屬性,一是讓他能用在iOS上。二是改變Bundle成為Framework
選中要修改的Bundle

2.3、Target:并選擇Build Settings- > Architectures -> Base SDK 改為Latest iOS(iOS9)

2.4、Target:在 Deployment 下,
將 “Mac OS X Deployment Target”改成”Compiler Default”,
將 “Targeted Device Family”改成”iPhone/iPad”,根據(jù)自己的需要改。如果你只想在iPhone上用,那選iPhone就行
將??“iOS Deployment Target”,改成?“iOS 7.0”:也就是說這個靜態(tài)庫支持7.0以上版本。

2.5、Target:在 Linking 下,
將 “Dead Code Stripping” 改為 “NO”,
將 “Link with Standard Libraries” 改為 “NO”,
將 “Mac-O Type” 改為 “Relocatable Object File”:

2.6、Target:Packaging 中,
將 “Wrapper Extention” 改為“framework”:

2.6、Target:返回Info 標簽。
將 “Bundle OS Type Code” 改為 “FMWK”(Framework )

2.7、Target:返回Build Phases 標簽。加入Copy Headers,后邊會用到。


3、返回目錄,可以看到設置好的 Framewor文件。紅色代表還沒有這個靜態(tài)庫,需要你生成一下。后邊會講到。

3.1、如何管理靜態(tài)庫:

點開菜單,可以看到所有可管理的工程、靜態(tài)庫。
3.2:LineChart(App圖標樣式)是App 工程文件,選中這個運行(command+R 或command+B)意思是讓工程導出或者測試運行可發(fā)布的應用程序(就是上線文件)。對應功能就不一一介紹了。
3.3:PZGLineChart(Bundle圖標樣式)是靜態(tài)庫。選中這個運行(只能運行command+B,不能運行command+R)意思是導出靜態(tài)庫,也就是自己的封裝代碼,用于共享給其他人。如果選中iOS Device運行(command+R),將會導出真機版本的靜態(tài)庫,如果選中iOS Simulator以下其他任何版本運行(command+R),將會導出模擬器的靜態(tài)庫版本。至于為什么這樣,是因為真機的iOS和Mac系統(tǒng)中的虛擬iOS目錄結(jié)構(gòu)是不一樣的,如果導錯了,編譯器會報錯,“找不到指定文件。”
3.4:選中:Edit Scheme…:在這里管理所有工程文件、靜態(tài)庫、測試、發(fā)布等等的程序關系。
在這里,我們把剛才加入Framewor的導入,以便程序直接建立關系。

成為這樣:

3.5:選中:Manage Scheme…:、這里的添加刪除、會改變

如果希望測試菜單中測試其他工程、靜態(tài)庫等等東西,在這里添加就行,比如下邊的這個。Show對勾都勾選上后,菜單就會出來這兩個選項。去掉對勾會隱藏。

4、給靜態(tài)庫添加文件、xib、image....
直接介紹其屬性:
1:不知道。沒用過。等高手補充
2:程序文件放的地方:(*.m 、*.mm等),需要壓縮保護的代碼,只要放在這里的文件,都將被靜態(tài)庫壓縮。使用靜態(tài)庫的一方是無法看到源代碼的。
3:庫文件放的地方,比如把其他的靜態(tài)庫、動態(tài)庫壓縮到這里。
4:資源文件放的地方,圖片、音視頻、xib、Images.xcassets、甚至是Main.storyboard(故事板);只要放到這里,都將被壓縮,使用方是無法編譯或者看到源代的。
5:對外接口。主要就是這里,展開后,會看到第一行(Public),不用介紹了吧,看英文應該就能猜到,何況這個單詞是程序中常用的單詞,公用嗎!,只要是放到這里的文件,都將會暴露給使用方,建議把所有的*.h文件放到這里。
現(xiàn)在就把你想要管理的文件一個一個往里拖拽吧。就不在一個一個介紹。

6、首先測試,程序部分是否運行正常。我新增加了一個MyViewController(帶.xib),在MyViewController.m里簡單寫了個打印。

還有我拖拽完就是這個樣子:

7:生成靜態(tài)庫:大家看到了,都是紅色,意思是Xcode找不到文件,別慌,我們都給他跑一邊。

7.1、選中以下,分別command+B。


黑了吧,

選中PZGLineChart.framewor文件,鼠標右鍵,Show in Finder。
看到了吧,成功了,就這么簡單。現(xiàn)在生成的是真機版本,如果需要模擬機使用的靜態(tài)庫,選中模擬后,再分別command+B一下。

模擬機版本:
模擬機版本的就選擇:Debug-iphonesimuator文件夾下。如果沒有Debug-iphonesimuator文件夾,那你選擇


8、關于靜態(tài)庫引用文件
如果希望你的工程能在未來能導出成靜態(tài)庫,那么在你編寫的時候要遵循靜態(tài)庫引用原則,使用這種方式。
注意:這種引用方式必須在你的Products下靜態(tài)庫成黑色時候,才能編譯通過。

9、新建一個工程,把你做的靜態(tài)庫Add進來。對接好,然后直接Command+R。是不是成功了。其實就這么簡單。
關于找不到文件的報錯:直接看下邊。我有介紹,

跑成功的工程,一切正常。

10、關于第三方庫找不到文件的提示錯誤。簡單補充下吧,別走彎路。
首先你要確定這個錯誤產(chǎn)生的原因:大致分兩種,
一:你做的項目缺失文件,百度下,加入就解決了;
二:你引入的第三方框架發(fā)生找不到文件錯誤:這樣的結(jié)果分兩種:
二、一:開發(fā)第三方框架的程序人員沒有做好自己的框架。尤其是在生成框架的時候,沒有設置好自身屬性。導致使用者用的時候出現(xiàn)找不到文件錯誤,最后迫使使用者不得不去改自己的工程配置。
二、二:你在引入第三方框架的時候,少引用了文件。
好了,你分析完后就好辦了,我們做的這個靜態(tài)庫沒有設置自己的兼容屬性,所以就照成了這種錯誤。在iPad Retina的模擬器上跑就正常,換成其他的模擬設備就報錯。所以改下其屬性就能解決。
Target: ->?Build Settings ->? Architectures -> Build Active Architecture Only 全改成NO;
分析原因:


在我們生成靜態(tài)庫的時候,我們選擇的是iPad Retina。也就是說這個靜態(tài)庫在引用的時候,必須也是iPad Retina。否則Xcode編譯器會找不到文件所在。
大家可以實驗下,在iPad Retina下導出靜態(tài)庫,在其他工程使用的時候,如果用iPad Retina跑就沒有錯誤。如果選擇其他設備就會提示找不到文件。
兼容全部設備解決方法:改下靜態(tài)庫的兼容屬性。Target: ->?Build Settings ->? Architectures -> Build Active Architecture Only 全改成NO;
Build Active Architecture Only
這個屬性設置為yes,是為了debug的時候編譯速度更快,它只編譯當前的architecture版本,所以會報錯編譯不到文件,出錯("_OBJC_CLASS_$_xxxxxx", referenced from:)
而設置為no時,會編譯所有的版本,這樣就解決編譯出錯的問題了。
這個是設備對應的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
arm64:iPhone5s
編譯出的版本是向下兼容的,比如你設置此值為yes,用iphone4編譯出來的是armv7版本的,iphone5也可以運行,但是armv6的設備就不能運行。
真機版和模擬器版的庫合并解決方法:在framework文件夾下,你會看到一個白板文件,這個文件名和的的framework靜態(tài)庫名相同,只是沒有后綴名。 這個文件在被引入到其他工程時候是看不見的。只有在Show In Finder下能看到。
打開終端,輸入命令:中文換成你的真實目錄。
lipo -create “……真機/目錄/那個白板文件“ "……/模擬器/目錄/那個白板文件" -output “…..另保存的/目錄/文件”
合并好的新文件,覆蓋掉原來的framework中的文件即可。這個framework就會支持所有設備和真機、模擬器全部版本。
其實這個方法就是用*.a文件的合并方法。在framework一樣有效。framework中的白板文件就好像*.a文件一樣。
9、關于xib的引用。同樣根上邊創(chuàng)建framework的方法一樣,只是設置不同。我加了一個名字為:Resource.bundle靜態(tài)資源文件。
這個樣子

Target:并選擇 Build Settings ->? Architectures -> Base SDK? 改為Latest iOS(ios 8.1)
Target:在 Deployment 下,
Target:將 “Mac OS X Deployment Target”改為”Compiler Default”,
Target:將 “Targeted Device Family”改”iPhone/iPad”,
Target:將 “iOS Deployment Target”,改為 “iOS 7.0”:
9.1、在MyViewController.m文件中編寫下。別忘了在*.h里寫上接口。

9.2、然后就是給新加的資源文件拖拽下。

為了方便查看,我把MyViewController.xib背景涂成了藍色,加了個紅按鈕。直接:command+R。一切運行正常。

9.3、然后把這兩個文件都復制出來。

放到其他工程里,運行。是不是很簡單。

10、加個圖片。怎么加不解釋來。先加一個不用管理器管理的圖片。
工程command+R。。一切正常。

10.1、其他工程引用靜態(tài)庫,再跑。正常。嘿嘿,是不是多了個圖片文件。

10.2、提高難度,我們在Images.xcassets圖片管理器里加圖片。我加了個矩陣圖片,并設置了矩陣屬性。

在xib里加個按鈕。全設備匹配按鈕。我沒有寫一行代碼,只是在xib里拉個按鈕。然后設置了下背景。系統(tǒng)自動識別圖片。關于這個大家可以度娘下。

不管三七二十一,直接把Images.xcassets拉到資源庫。

工程跑,OK。沒問題。

引入靜態(tài)庫。OK。沒問題。有沒有發(fā)現(xiàn)。多了一個不明的文件:Assets.car。這個就是Images.xcassets管理,里邊所有的圖片都被封裝了,也就是說被Images.xcassets管理的圖片竟然也被加密保護了起來。瘋狂吧??窠邪伞:呛?,“碼農(nóng)”一族們??燹D(zhuǎn)變思維吧,不然很快被Apple淘汰了。

補個圖片。關于制作靜態(tài)庫兼容多版本的設置。
