這篇教程的主要目的是解釋怎么樣在你的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];
NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "MyBundle"ofType :@ "bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"vc_name"bundle:resourceBundle];
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)這個我也不知道什么原因,
反正最終結果是加載成功了,有知道的讀者可以@我,謝謝!

最后上一張成功的圖片
