這篇教程的主要目的是解釋怎麼樣在你的iOS工程中創建並使用一個SDK,俗稱.a文件。 環境:xcode 9.0 創建一個靜態庫工程 打開Xcode,點擊File\New\Project, 選擇iOS\Framework and Library\Cocoa Touch Static Library新建 ...
這篇教程的主要目的是解釋怎麼樣在你的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)這個我也不知道什麼原因,
反正最終結果是載入成功了,有知道的讀者可以@我,謝謝!
最後上一張成功的圖片