iOS---Xcode6.1標準Framework靜態庫製作方法

1、創建一個工程,或者在原有的工程上進行。不在列舉。
2、在原有工程上添加一個靜態庫

 

2.1、選擇OS X 的Bundle。因爲Xcode6.1中iOS裏沒有Bundle。

 

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

 

2.3、Target:並選擇 Build Settings ->  Architectures -> Base SDK  改爲Latest iOS(ios 8.1)

 

2.4、Target:在 Deployment 下,
將 “Mac OS X Deployment Target”改成”Compiler Default”,
將 “Targeted Device Family”改成”iPhone/iPad”,根據自己的需要改。如果你只想在iPhone上用,那選iPhone就行
將  “iOS Deployment Target”,改成 “iOS 7.0”:也就是說這個靜態庫支持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,後邊會用到。

  

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

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

  
 

黑了吧, 
 


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






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





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


 



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


 

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


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


 

3.1、如何管理靜態庫:

 

點開菜單,可以看到所有可管理的工程、靜態庫。
3.2:LineChart(App圖標樣式)是App 工程文件,選中這個運行(command+R 或command+B)意思是讓工程導出或者測試運行可發佈的應用程序(就是上線文件)。對應功能就不一一介紹了。
3.3:PZGLineChart(Bundle圖標樣式)是靜態庫。選中這個運行(只能運行command+B,不能運行command+R)意思是導出靜態庫,也就是自己的封裝代碼,用於共享給其他人。如果選中iOS Device運行(command+R),將會導出真機版本的靜態庫,如果選中iOS Simulator以下其他任何版本運行(command+R),將會導出模擬器的靜態庫版本。至於爲什麼這樣,是因爲真機的iOS和Mac系統中的虛擬iOS目錄結構是不一樣的,如果導錯了,編譯器會報錯,“找不到指定文件。”

3.4:選中:Edit Scheme…:在這裏管理所有工程文件、靜態庫、測試、發佈等等的程序關係。
在這裏,我們把剛纔加入Framewor的導入,以便程序直接建立關係。


 
成爲這樣:

 



3.5:選中:Manage Scheme…:、這裏的添加刪除、會改變 
 。主要是方便開發者測試使用。
如果希望測試菜單中測試其他工程、靜態庫等等東西,在這裏添加就行,比如下邊的這個。Show對勾都勾選上後,菜單就會出來這兩個選項。去掉對勾會隱藏。


 


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

現在就把你想要管理的文件一個一個往裏拖拽吧。就不在一個一個介紹。

 

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


  
 

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


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

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

  
 

黑了吧, 
 


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






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





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


 



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


 

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



10、關於第三方庫找不到文件的提示錯誤。簡單補充下吧,別走彎路。
首先你要確定這個錯誤產生的原因:大致分兩種,
一:你做的項目缺失文件,百度下,加入就解決了;
二:你引入的第三方框架發生找不到文件錯誤:這樣的結果分兩種:
二、一:開發第三方框架的程序人員沒有做好自己的框架。尤其是在生成框架的時候,沒有設置好自身屬性。導致使用者用的時候出現找不到文件錯誤,最後迫使使用者不得不去改自己的工程配置。
二、二:你在引入第三方框架的時候,少引用了文件。

好了,你分析完後就好辦了,我們做的這個靜態庫沒有設置自己的兼容屬性,所以就照成了這種錯誤。在iPad Retina的模擬器上跑就正常,換成其他的模擬設備就報錯。所以改下其屬性就能解決。
Target: -> Build Settings ->  Architectures -> Build Active Architecture Only 全改成NO;
《插不了圖片了。樓下8樓找吧》



分析原因:

  
 
在我們生成靜態庫的時候,我們選擇的是iPad Retina。也就是說這個靜態庫在引用的時候,必須也是iPad Retina。否則Xcode編譯器會找不到文件所在。
大家可以實驗下,在iPad Retina下導出靜態庫,在其他工程使用的時候,如果用iPad Retina跑就沒有錯誤。如果選擇其他設備就會提示找不到文件。

兼容全部設備解決方法:改下靜態庫的兼容屬性。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靜態庫名相同,只是沒有後綴名。 這個文件在被引入到其他工程時候是看不見的。只有在Show In Finder下能看到。
打開終端,輸入命令:中文換成你的真實目錄。

lipo -create “……真機/目錄/那個白板文件“ "……/模擬器/目錄/那個白板文件" -output “…..另保存的/目錄/文件”

合併好的新文件,覆蓋掉原來的framework中的文件即可。這個framework就會支持所有設備和真機、模擬器全部版本。
其實這個方法就是用*.a文件的合併方法。在framework一樣有效。framework中的白板文件就好像*.a文件一樣。



9、關於xib的引用。同樣根上邊創建framework的方法一樣,只是設置不同。我加了一個名字爲:Resource.bundle靜態資源文件。
這個樣子:

 


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、其他工程引用靜態庫,再跑。正常。嘿嘿,是不是多了個圖片文件。




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





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

 


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

 



工程跑,OK。沒問題。




引入靜態庫。OK。沒問題。有沒有發現。多了一個不明的文件:Assets.car。這個就是Images.xcassets管理,裏邊所有的圖片都被封裝了,也就是說被Images.xcassets管理的圖片竟然也被加密保護了起來。瘋狂吧。狂叫吧。呵呵,“碼農”一族們。快轉變思維吧,不然很快被Apple淘汰了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章