Xcode6.1標準Framework靜態庫製做方法。工程轉Framework,靜態庫加xib和圖片。完美解決方案。

http://www.cocoachina.com/bbs/read.php?tid-282490.htmlphp

 

Xcode6.1標準Framework靜態庫製做方法。工程轉Framework,靜態庫加xib和圖片。完美解決方案。   

 
 
 
在cocoachina呆挺長時間了。沒什麼大貢獻。就整理了這個,但願對你們有幫助。絕對原創。呵呵。

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

 

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

 

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

 

2.三、Target:並選擇 Build Settings ->  Architectures -> Base SDK  改成Latest iOS(ios 8.1)

 

2.四、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.五、Target:在 Linking 下,
將 「Dead Code Stripping」 改成 「NO」,
將 「Link with Standard Libraries」 改成 「NO」,
將 「Mac-O Type」 改成 「Relocatable Object File」:


 


2.六、Target:Packaging 中,
將 「Wrapper Extention」 改成「framework」:


 

2.六、Target:返回Info 標籤。
將 「Bundle OS Type Code」 改成 「FMWK」(Framework )


 

2.七、Target:返回Build Phases 標籤。加入Copy Headers,後邊會用到。

  
 
 
三、返回目錄,能夠看到設置好的 Framewor文件。紅色表明尚未這個靜態庫,須要你生成一下。後邊會講到。


 

3.一、如何管理靜態庫:

 

點開菜單,能夠看到全部可管理的工程、靜態庫。
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對勾都勾選上後,菜單就會出來這兩個選項。去掉對勾會隱藏。


 


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

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

 

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


  
 

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



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

 
7.一、選中如下,分別command+B。

  
 

黑了吧, 
 


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






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





八、關於靜態庫引用文件
若是但願你的工程能在將來能導出成靜態庫,那麼在你編寫的時候要遵循靜態庫引用原則,使用這種方式。
注意:這種引用方式必須在你的Products下靜態庫成黑色時候,才能編譯經過。


 



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


 

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


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

好了,你分析完後就好辦了,咱們作的這個靜態庫沒有設置本身的兼容屬性,因此就照成了這種錯誤。在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文件同樣。



九、關於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.一、在MyViewController.m文件中編寫下。別忘了在*.h裏寫上接口。

 


9.二、而後就是給新加的資源文件拖拽下。

 

再選中工程文件,拖拽後的樣子(就是轉靜態庫的工程)。
爲了方便查看,我把MyViewController.xib背景塗成了藍色,加了個紅按鈕。直接:command+R。一切運行正常。




9.三、而後把這兩個文件都複製出來。 
 

放到其餘工程裏,運行。是否是很簡單。




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





10.一、其餘工程引用靜態庫,再跑。正常。嘿嘿,是否是多了個圖片文件。


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





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

 


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

 



工程跑,OK。沒問題。




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

相關文章
相關標籤/搜索