IOS SDK開發(fā)詳解(.framework、.a、Bundle資源文件創(chuàng)建、SDK中使用其他SDK等)

什么是SDK?

軟件開發(fā)工具包(縮寫:SDK,英語全稱:Software Development Kit),一般都是一些軟件工程師為特定的軟件包、軟件框架、硬件平臺、操作系統(tǒng)等建立應用軟件時的開發(fā)工具的集合。
在OC的開發(fā)中,我們涉及到的一般是靜態(tài)庫(.a)或者動態(tài)庫(.framework)。(注:不是所有的.framework就一定是動態(tài)庫)

靜態(tài)庫與動態(tài)庫的區(qū)別?

  • 靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。表現(xiàn)形式為 .a和.framework。
  • 動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存。 表現(xiàn)形式為 .dylib和.framework。

a與.framework有什么區(qū)別?

.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件。 .a文件不能直接使用,至少要有.h文件配合(微信的SDK就是這種形式),.framework文件可以直接使用。 .a + .h + sourceFile = .framework。 建議用.framework。再者 靜態(tài)方式開發(fā),一直是iOS SDK開發(fā)的主流方式。

靜態(tài)庫.framework開發(fā):

  1. 新建SDK .framework項目:
    • File -> New -> Project -> IOS -> Framework & Library -> Framework
      新建.framework SDK
    • 填寫SKD名:
      填寫SKD名
    • 選擇SDK保存位置。
  2. 設置配置:
    • TARGETS -> General -> Deployment Info,設置支持iOS系統(tǒng)的最低版本和支持的設備。
      支持版本及設備
    • TARGETS -> Build Settings -> Linking -> Mach-O Type 更改為Static Library(靜態(tài)庫),默認為Dynamic Library(動態(tài)庫)。
      更改為靜態(tài)庫
    • TARGETS -> Build Settings -> Linking -> Other Linker Flage 添加-Objc標志(在靜態(tài)庫中慎用Category,如果使用了Category就必須在SDK和SDK使用的項目中都要添加該標識,否則會報unrecognized selector sent to instance的異常
      Category 必填
    • TARGETS -> Build Settings -> Architectures 添加armv7s(Xcode6之后,默認不支持armv7s,如果需要添加SDK的工程是支持armv7s,那將會有沖突)
      支持armv7s
    • TARGETS -> Build Settings -> Build Options -> Link With Standard Libraries 設置為No,默認為YES。
  3. 添加要制作成SDK的代碼。
  4. 配置公開文件:
    • TARGETS -> Build Phases -> Headers
      公開文件
  5. 在SDK的.h頭文件中引用公開的文件:
//#import <SDK名字/公開文件名字.h>
#import <ETCOnlineServices/WebViewController.h>
  1. SDK.framework打包:
    模擬器 iPhone5s 以下是 i386 架構(gòu),iPhone5s 及以上是 x86_64 架構(gòu)。如果想同時支持 i386 和 x86_64,設置:TARGETS -> Build Settings —> Architectures —> Build Active Architecture Only —> NO。
    真機iPhone5s 以下是 armv7 架構(gòu),iPhone5s 及以上是 arm64 架構(gòu)。
    • Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改為release
      Build Configuration.png
    • 生成模擬器和真機使用的framework包:
      1. 真機包:模擬器選項中,選擇Generic IOS Device, Command + B生成真機包。
      2. 模擬器包:模擬器選項中,選擇任意模擬器, Command + B生成模擬器包。
      3. 查看真機包和模擬器包的位置:項目中的Product文件夾中選擇SDK文件,右擊選擇Show in Finder
查看SDK
真機和模擬器包

- 通過終端命令行查看包是真機包還是模擬器包:lipo -info framework路徑
SDK路徑
lipo -info

終端輸出為:armv7 arm64 是真機架構(gòu);i386 x86_64 是模擬器架構(gòu)。

  1. 合并framework的真機包和模擬器包:
    • 通過終端命令行合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑
      合并
    • 通過腳本語言合并:
      1. TARGETS -> Build Phases 點擊加號創(chuàng)建Run Script
        Run Script
      2. Run Script中添加腳本運行代碼:
        Run Script

        command + B 分別生成真機和模擬器包,再次按command + B合并真機包和模擬器包。腳本代碼如下:

if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
  • lipo -info查看合并后的包支持的架構(gòu):
    合并后

靜態(tài)庫.a開發(fā):

  1. 新建SDK .a項目:
    • File -> New -> Project -> IOS -> Framework & Library -> Static Library
      image
    • 填寫SDK名:
      image
    • 選擇SDK保存位置。
    • SDK中會生成.h和.m文件,.m文件可以直接刪除。
    • SDK所支持的最低版本:PROJECT -> info -> Deployment Target
支持的最低版本
  1. 添加需要生成SDK的代碼。
  2. 在SDK的.h頭文件中引用公開調(diào)用的頭文件:
//#import "公開文件名.h"
#import "WebViewController.h"
  1. Targets -> Build Settings -> Copy Files 添加公開的.h文件。并且清空Subpath中的路徑,如果不清空,.a文件和.h文件不在同一個文件夾中。
    公開文件.h
  2. SDK.a打包:
    • Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改為release
      Edit Scheme
    • 生成模擬器和真機使用的framework包:
      1. 真機包:模擬器選項中,選擇Generic IOS Device, Command + B生成真機包。
      2. 模擬器包:模擬器選項中,選擇任意模擬器, Command + B生成模擬器包。
      3. 查看真機包和模擬器包的位置:項目中的Product文件夾中選擇SDK文件,右擊選擇Show in Finder
真機和模擬器包

- 通過終端命令行查看包是真機包還是模擬器包:lipo -info SDK.a路徑
.a的路徑
終端

終端輸出為:arm64 是真機架構(gòu);x86_64 是模擬器架構(gòu)。

  1. 合并framework的真機包和模擬器包:
    • 通過終端命令行合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑
      合并

Bundle資源文件創(chuàng)建:

手動創(chuàng)建Bundle資源:

  1. 創(chuàng)建一個文件夾,把這個文件夾的后綴改成.bundle
    image
  2. 右擊該文件 -> 顯示包內(nèi)容:
    image
  3. 把資源文件直接copy到該文件中:
    image
  4. Bundle加入SDK中:
    添加Bundle
  5. 從Bundle資源文件中讀取內(nèi)容:
  • Html本地文件的讀取:
NSString *htmlFilePath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"Bundle名.bundle/transpay/index.html"];
NSURL * htmlFileURL = [NSURL URLWithString:htmlFilePath];
NSURLRequest * request = [NSURLRequest requestWithURL:htmlFileURL];
[self.webView loadRequest:request];
  • 圖片/視頻資源的讀?。?/li>
NSString *imageFilePath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"Bundle名.bundle/image/xingkong.png"];
imageView.image = [UIImage imageWithContentsOfFile:imageFilePath];
  • Storyboard、xib,需要在對應的視圖控制器中添加以下代碼:
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSBundle *bundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"Bundle名.bundle"]];
    if (bundle) {
        // 如果是storyboard
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"你的storyboard名稱(例如Main)" bundle:bundle];
        self = [storyboard instantiateViewControllerWithIdentifier:@"你在storyboard中設置的此視圖控制器的id"];
        return self;

        // 如果是xib
        self = [super initWithNibName:@"當前控制器的名稱" bundle:bundle];
        return self;
    }
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
  1. 把生成的SDK文件和Bundle資源文件放在同一個文件夾中:
    image.png

    Bundle文件創(chuàng)建和使用完成。

創(chuàng)建的SDK中使用其他的SDK

  1. 往SDK中拖入另一個SDK:
    添加SDK
  2. 在合適的地方,添加這個引入的SDK的相關(guān)代碼。

Bundle 和 其他的SDK都要和創(chuàng)建的SDK放在同一個文件夾,然后拖入要使用的項目中,如果該項目中的SDK和創(chuàng)建的SDK中的引用的SDK重復,那么就只要保持存在一個就好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容