iOS 封裝SDK以及封裝時bundle檔案的處理,iosbundle
這篇教程的主要目的是解釋怎麼樣在你的iOS工程中建立並使用一個SDK,俗稱.a檔案。
環境:xcode 9.0
建立一個靜態庫工程
開啟Xcode,點擊File\New\Project,
選擇iOS\Framework and Library\Cocoa Touch Static Library建立一個靜態庫工程.
將工程命名為SDKTest,然後將工程儲存到一個空目錄下。
當建立靜態庫工程時,Xcode會自動添加.h和.m。
你不需要實現檔案,因此按右鍵SDKTest.m選擇delete,將它刪除即可。
然後工程就已經可以用了了,是時候為你的庫添加一些功能了。
由於本篇教程的關鍵在於教你怎麼樣建立一個SDKTest.a,
而不是怎麼樣構建一個UI控制項,這裡你可以使用你自己封裝好的控制項。
將你的控制項從Finder中拖到Xcode的SDKTest目錄下。
這裡我使用別人封裝過我進行二次封裝的日曆。
這裡有一點要注意了,控制項拖進工程這裡一定要勾選以下三個選項:
Copy items if needed
create gruoups
Add to targets
對你的控制項的標頭檔需要做的另一件事是將其添加到庫的主標頭檔SDKTest.h中。
在這個主標頭檔的協助下,開發人員使用你的庫僅僅需要匯入一個標頭檔,
如下面的代碼一樣,而不是自己去選擇自己需要的一塊匯入。
接下來就產生靜態庫
靜態庫分為手機和模擬器兩種(手機端的只有手機能調用,模擬器的只有模擬器能調用)。
首先,構建模擬器的靜態庫,(點擊三角按鈕就可以了,其實是編譯,圖片中我寫成了運行)!
然後show in Finder把.a檔案拖到案頭即可,
真機的.a檔案一樣的道理,可以改一個名字方便合成一個.a檔案。
之後開啟終端執行下面的命令,這裡就不複製了,
手敲一下記憶一下,運行時候案頭會產生一個合成的.a檔案。
之後拿到這個.a檔案 還有和他相關的所有.h檔案,存放在一個新的檔案夾裡(隨便起名,如下
現在呢,你就可以拿著這個檔案夾去測試了。將它拖到你要應用了工程中
這樣之後你就可以引用SDKTest.h檔案進行使用剛才的控制項了,其實很簡單的。
我在這裡遇到了一個問題;在我使用的時候報這個錯誤,
這個可以這樣解決:把對應的 Use Safe Area Layout Guide 去掉勾選即可
感謝這個篇文章:http://blog.csdn.net/objectivepla/article/details/51211541
但是這隻是對沒有引用圖片和xib的控制項而言的,
如果你要打包的SDK包含xib怎麼辦呢,這類的資源檔是需要另外處理的。
這裡就需要知道bundle
bundle 是一個目錄,其中包含了程式會使用到的資源.
這些資源套件含了像,聲音,編譯好的代碼,nib檔案(使用者也會把bundle稱為plug-in).對應bundle,
cocoa提供了類NSBundle.
簡單的 bundle 檔案的建立,只需要在本地建立一個檔案夾,給檔案夾添加尾碼@".bundle"圖片可以放進去。
但是xib檔案我們需要把xib檔案手動轉換成nib檔案
舉個例子 指令如下:
ibtool --errors --warnings --output-format human-readable-text --compile /Users/Chenfy/Desktop/cc.zip/CCViewController.nib /Users/Chenfy/Desktop/cc.zip/CCViewController.xib
這樣你就可以得到nib檔案了。
當然有複雜一點的 bundle 檔案的建立 就是使用Xcode
添加需要的資源檔
加入你需要編譯在bundle中的資源檔。至少選擇Base SDK 是iOS的,預設選擇是mac的
其他的設定可以參考百度
擷取.budle檔案同樣和擷取.a檔案一樣,編譯一下 然後show in Finder
可以修改檔案的名字和SDK的一樣
將要使用的bundle整合到項目中後,就可以使用了。
需要注意的就是,bundle是靜態,不進行編譯的資源檔。
所以,要使用bundle中的資源,就需要找到相應的資源路徑
注意:
有xib 的.a檔案打包前記得修改xib的應用方式為nib,對應的圖片也是
對於.budle檔案的引用
bundle資源套件的使用:
把產生的bundle檔案拖到要使用工程中;
// 設定檔案路徑
NSString *bundlePath = [[NSBundlemainBundle]pathForResource:@"SourcesBundle"ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundlebundleWithPath:bundlePath];
// 載入 nib檔案
UINib *nib = [UINibnibWithNibName:@"Demo"bundle:resourceBundle];
NSArray *viewObjs = [nibinstantiateWithOwner:niloptions:nil];
// 擷取 xib檔案
UIView *view = viewObjs.lastObject;
view.frame = CGRectMake(20,50,self.view.bounds.size.width -40,self.view.bounds.size.width -40);
[self.view addSubview:view];
VC獲得bundle中的資源
NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "MyBundle"ofType :@ "bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"vc_name"bundle:resourceBundle];
圖片獲得bundle中的資源 UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 50,50)];
UIImage *image = [UIImage imageNamed:@"MyBundle.bundle/img_collect_success"];
[imgView setImage:image];
載入bundle中的xib產生的cell載入nib的時候使用以下代碼,最主要的是表明是從那個bundle中擷取nib
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"WofuSDKBundle"ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
UINib *nib=[UINib nibWithNibName:@"Wofucreditcell"bundle:resourceBundle];
[tab registerNib:nib forCellReuseIdentifier:identifier];
載入bundle詳情見這篇文章http://blog.csdn.net/u011146511/article/details/70147693
我在這裡遇到了一個問題 我在cell 的複用的時候總是報錯
結果 發現複用的時候如果發現沒有可複用的cell時也要從.budle中取,基礎知識不牢固啊,
這一點希望讀者注意,.a檔案打包前需要資源檔的一定要 處理常式,處理資源檔,這也是xib的一個弊端吧!
另外我列印了一下載入budle 是否成功,但是結果是(not yet loaded)這個我也不知道什麼原因,
反正最終結果是載入成功了,有知道的讀者可以@我,謝謝!
最後上一張成功的圖片