什么是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ā):
- 新建SDK .framework項目:
-
File -> New -> Project -> IOS -> Framework & Library -> Framework新建.framework SDK
-
填寫SKD名:填寫SKD名
- 選擇SDK保存位置。
-
File -> New -> Project -> IOS -> Framework & Library -> Framework
- 設置配置:
-
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。
-
TARGETS -> General -> Deployment Info,設置支持iOS系統(tǒng)的最低版本和支持的設備。
- 添加要制作成SDK的代碼。
- 配置公開文件:
-
TARGETS -> Build Phases -> Headers公開文件
-
TARGETS -> Build Phases -> Headers
- 在SDK的.h頭文件中引用公開的文件:
//#import <SDK名字/公開文件名字.h>
#import <ETCOnlineServices/WebViewController.h>
- 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修改為releaseBuild Configuration.png
- 生成模擬器和真機使用的framework包:
- 真機包:模擬器選項中,選擇Generic IOS Device, Command + B生成真機包。
- 模擬器包:模擬器選項中,選擇任意模擬器, Command + B生成模擬器包。
- 查看真機包和模擬器包的位置:項目中的Product文件夾中選擇SDK文件,右擊選擇Show in Finder
-
Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改為release

查看SDK

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

SDK路徑

lipo -info
終端輸出為:armv7 arm64 是真機架構(gòu);i386 x86_64 是模擬器架構(gòu)。
- 合并framework的真機包和模擬器包:
-
通過終端命令行合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑合并
- 通過腳本語言合并:
-
TARGETS -> Build Phases 點擊加號創(chuàng)建Run ScriptRun Script
-
Run Script中添加腳本運行代碼:Run Script
command + B 分別生成真機和模擬器包,再次按command + B合并真機包和模擬器包。腳本代碼如下:
-
TARGETS -> Build Phases 點擊加號創(chuàng)建Run Script
-
通過終端命令行合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑
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ā):
- 新建SDK .a項目:
-
File -> New -> Project -> IOS -> Framework & Library -> Static Libraryimage
-
填寫SDK名:image
- 選擇SDK保存位置。
- SDK中會生成.h和.m文件,.m文件可以直接刪除。
- SDK所支持的最低版本:PROJECT -> info -> Deployment Target
-
File -> New -> Project -> IOS -> Framework & Library -> Static Library

支持的最低版本
- 添加需要生成SDK的代碼。
- 在SDK的.h頭文件中引用公開調(diào)用的頭文件:
//#import "公開文件名.h"
#import "WebViewController.h"
-
Targets -> Build Settings -> Copy Files 添加公開的.h文件。并且清空Subpath中的路徑,如果不清空,.a文件和.h文件不在同一個文件夾中。公開文件.h
- SDK.a打包:
-
Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改為releaseEdit Scheme
- 生成模擬器和真機使用的framework包:
- 真機包:模擬器選項中,選擇Generic IOS Device, Command + B生成真機包。
- 模擬器包:模擬器選項中,選擇任意模擬器, Command + B生成模擬器包。
- 查看真機包和模擬器包的位置:項目中的Product文件夾中選擇SDK文件,右擊選擇Show in Finder
-
Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改為release

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

.a的路徑

終端
終端輸出為:arm64 是真機架構(gòu);x86_64 是模擬器架構(gòu)。
- 合并framework的真機包和模擬器包:
-
通過終端命令行合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑合并
-
通過終端命令行合并:lipo -create 真機路徑 模擬器路徑 -output 真機路徑
Bundle資源文件創(chuàng)建:
手動創(chuàng)建Bundle資源:
-
創(chuàng)建一個文件夾,把這個文件夾的后綴改成.bundleimage
-
右擊該文件 -> 顯示包內(nèi)容:image
-
把資源文件直接copy到該文件中:image
-
Bundle加入SDK中:添加Bundle
- 從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];
}
-
把生成的SDK文件和Bundle資源文件放在同一個文件夾中:image.png
Bundle文件創(chuàng)建和使用完成。
創(chuàng)建的SDK中使用其他的SDK
-
往SDK中拖入另一個SDK:添加SDK
- 在合適的地方,添加這個引入的SDK的相關(guān)代碼。
Bundle 和 其他的SDK都要和創(chuàng)建的SDK放在同一個文件夾,然后拖入要使用的項目中,如果該項目中的SDK和創(chuàng)建的SDK中的引用的SDK重復,那么就只要保持存在一個就好了。





















