原文鏈接
如何打包靜態庫文件為iOS?</br></br>
在之前的輔導中,你學習了如何循環利用knob control,但是,如何讓別的開發開發者簡單的重復利用它并沒有講O</br></br>
一種方式是直接分享源碼,然而這樣不是很優雅,有一些實現細節你并不想分享出來,而且,開發者也許并不想看到什么東西,因為它們只是想你的代碼和她的代碼融為一體。</br>
另外的方式是將你的代碼編譯為靜態庫,然后將靜態庫添加到工程中,這樣的要求你分發公共頭文件當你用到的時候。</br>
你需要一個簡單的方法編譯代碼,然后他需要各個工程之間重復利用,你需要的是以后將頭文件和靜態庫組合起來,這樣你就可以把它添加到項目中迅速使用了。</br>
這個輔導就是專注這個這個事情,你將學習通過用framework幫助你解決這個具體的問題,os x系統對這個已經有了很好的支持,因為
xcode 提供一個模版,這個模版包括默認的build target,模版也可以包括下面的文件圖片,聲音,字體,你可以創建創建 framework為iOS,但是他有點復雜,如果你繼續學習的如何繞過這些坑。</br>
當你繼續往下學習,你會創建創建一個靜態庫項目用xcode,創建一個app依賴這靜態庫,初次學習怎么將一個靜態庫文件轉化為一個羽翼豐滿的framework,最后你會學習怎么打包一些圖片在你的framework的resource bundle中</br>
</br>這次講解主要目的在于解釋如何創建framework,因此不像這個站點的別的教程,整篇教程只有很少量的Objective-C 代碼,這里主要是示范一下我們之前講的。</br>
從這里下載RWKnobControl代碼開始,當你看完了創建framework的過程,你會知道怎么用它。</br></br>
所有的代碼,做這個項目的工程文件Github上都有,和別的教程的代碼分開提交的。
一個framework是一堆資源,他將一個靜態庫和她的頭文件轉化為Xcode易于導入的你的工程的結構。</br>
在osx上,可以創建鏈接framework,通過動態鏈接,framework 可以被更新不用應用重新鏈接它們,在runtime中,一個單一的library代碼被整個進程共享,這樣減少了內存的使用提高了系統難過的表現,像你看到的一樣,這是個有用的東西。</br></br>
在iOS中,你不能通過這種方式添加動態可以到系統中,只有蘋果提供的framework可以動態鏈接。</br></br>
然而這樣并不意味著rameworks和iOS沒有關系的,為了在不同的app中使用靜態鏈接framework靜態的包裹代碼仍然是一種方便的方式。</br></br>
由于一個framework是一個一站式的工廠對于一個靜態庫來說,這篇教程的第一件事情就是創建和適應靜態庫,當教程講到創建一個framework的時候,你就知道是怎么回事了,不會再云里霧里了。
打開Xcode創建一個新的靜態庫文件通過點擊File\New\Project,然后選擇iOS\Framework,再選擇Library\Cocoa Touch Static Library。

Name the product RWUIControls and save the project to an empty directory.</br>
命名為RWUIControls然后將項目保存到一個空的文件夾</br></br>

A static library project is made up of header files and implementation files, which are compiled to make the library itself.</br>
一個靜態庫工程主要有頭文件和實現文件組成,實現文件被編譯成靜態庫文件。</br></br>
為了讓別的開發者用起來更簡單,你將讓她最終只要導入一個頭文件就可以使用到你想要公開的所有類。</br></br>
當創建靜態庫項目的時候,Xcode添加RWUIControls.h 和RWUIControls.m,你不需要去實現這些文件,所以右擊RWUIControls.m選擇刪除,把他拖到垃圾箱中。</br></br>
Open up RWUIControls.h and replace the contents with the following:</br>
打開RWUIControls.h然后將內容替換為下面的:</br></br>
#import <UIKit/UIKit.h>
這個導入UIKit的頭文件,這個頭文件是庫自己需要的,當你創建
不同的類的時,你將要這些頭文件添加到這個文件中,這樣才能確保他們庫文件的使用者可以使用。</br></br>
這個工程你將要創建的依賴于 UIKit,但是Xcode并不會默認去鏈接,為了修復這個問題,添加UIKit作為依賴,選擇工程在導航欄,在中心的位置,選擇RWUIControls target
</br></br>
點擊Build Phases然后增加Link Binary with選項,點擊加號添加新的framework,在點擊添加之前你要還找到UIKit.</br></br>
</br></br>
一個靜態庫不可用,除非和頭文件結合在一起,頭文件是在binary中有什么類和方法的清單。</br></br>
接著你需要在運行添加一個新的階段,他將會收集公開的頭文件,然后把他放在編譯器能拿到的地方,最后,你將會拷貝這些到framework</br></br>
當仍然在看著Build Phases,選擇Editor\Add Build Phase,然后再選擇Add Copy Headers Build Phase。
注意點:如果你發現那個位置選項是灰色的,試試點擊已經存在的
build phases下面的空白區域,然后再試試</br></br>
拖拽RWUIControls.h從導航欄的位置到到 Copy Headers中,這將會保證頭文件對于用你庫的人來說可用。</br>
注意:這個似乎是很顯然的,但是很重要在你的公共的頭文件中被include的所有文件應該被公開,要不然,開發者嘗試用你的庫的時候就會編譯出錯。當Xcode讀公開的頭文件然后發現一些頭文件沒有公開,這樣對于誰都是不好的。`應該是在頭文件又include也應該暴露出來,說的應該是這個意思,翻譯嘗試一下,mark`</br></br>
現在你已經創建了你的工程,是時候去添加功能到庫里了,由于這篇教程重點是描述怎么創建一個framework,而不是怎么創建一個ui control,你將會借用上一篇教程的代碼,在你之前下載的zip文件中你會發現一個RWKnobControl文件夾,將他拖拽到RWUIControls項目中。</br></br>

</br></br>
選擇copy items 到目標文件夾中,在合適的位置打上勾確保新的文件被添加到新的文件被添加到目標庫中</br></br>

這樣操作會將實現文件放在編譯列表中,默認的會將頭文件駕到Project group選項中,這樣意味著它們是私有的。 </br></br>

注意:當你出問題的時候你會對這三個列表的疑惑的,Public 和你想的一樣,Private headers仍然是暴露的,這個有一點小小誤導,Project headers 一些特殊的文件對你的項目來說。然而你往往更多的發現你的頭文件要么在Public組或者 Project groups中。</br></br>
現在你需要暴露control主頭文件,RWKnobControl.h,有幾種方式做這件事,第一種方式拖拽文件從the Project 分組到the Public在 Copy選項卡中。</br></br>
或者,你可以在編輯這個文件時改變membership在Target Membership選項卡中,當你要繼續要添加或者開發庫時會更方便。</br></br>

注意:當你繼續添加新的類文件到庫中時,記得更新它們的membership,盡量讓他們頭文件在public越少越好,確保剩余的部分在 Project group中。</br></br>
對你的control頭文件另外一件事情是要把它添加到庫的主頭文件中,當開發者使用的時候只需要包含下面你看到的頭文件就可以了,而不需要整理他們需要的各個頭文件。
#import <RWUIControls/RWUIControls.h>
Therefore, add the following to RWUIControls.h:</br>
然后,添加下面到RWUIControls.h中</br>
// Knob Control
#import <RWUIControls/RWKnobControl.h>
Configuring Build Settings(配置Build Settings)
你現在非??斓搅藙摻椖堪阉渲茫缓髣摻殪o態庫,然而需要一系列的配置去保證靜態庫的使用者方便使用。</br></br>
第一件是你需要提供一個字典以你將要copy的公共頭文件命名,這個將確保你在使用頭文件的時候找到頭文件的準確位置。</br></br>
在項目導航欄點擊項目,然后選擇RWUIControls static library target,選擇Build Settings選項,然后搜索 public header,在Public Headers Folder Path 雙擊,在后面彈出框中寫下面的東東。</br></br>

</br></br>
You’ll see this directory later.</br>
然后你會看到字典</br></br>
現在你需要改變一些別的設置,特別是編譯成二進制的庫文件,編譯器給你刪除那些你永遠不會用的代碼的機會。你也可以是debug的符號,方法名字,和別的和debug相關的信息。</br></br>
由于你正在創建一個給別人用的framework,最好的方式是禁用兩者,然后讓使用者決定那個是最好的對于項目,為了做這些,像之前那樣使用search field,更新下面的設置。</br></br>
build然后運行,并沒有看到更多的,然而項目文件仍然運行的非常好沒有任何警告和錯誤。</br>
為了build,選擇target為iOS設備然后按下cmd+B執行編譯,一旦完成,libRWUIControls.a在Project Navigator中的就會從紅色變成黑色,標志他已經存在,?右擊libRWUIControls.a,然后show in finder 。</br></br>

在這個文件夾中你可以看到靜態庫在文件夾中,那個文件夾你指定為公共的頭文件,包括RWUIControls,注意你設定的在public可以在這里看到,和你期望的一樣。</br></br>
Creating a Dependent Development Project(創建一個獨立的項目)
為iOS開發一個UI控件庫是極為困難的當你不能真正看到你在做什么,,這似乎是現在的情況。</br></br>
沒有人想讓你盲目工作,你將會選擇創建一個依賴于之前庫文件的新的項目。用例子的app將讓你能夠開發一個framework。事實上,這個app的代碼會和庫文件完全分開,這將會有一個更清晰的結構。</br></br>
關閉靜態庫項目,然后創建新的項目通過File/New/Project,然后創建Single View Application,新的項目命名為UIControlDevApp,設置類前綴為RW ,然后只是用于iphone,最后把項目保存在你用于RWUIControls相同的文件夾。</br></br>
把RWUIControls.xcodeproj從finder中拖到UIControlDevApp 作為依賴的庫文件。</br></br>

</br></br>
現在你可以從應用程序的項目瀏覽靜態庫項目,它意味著你可以在庫中編輯代碼,并運行示例應用程序來測試更改,這樣很完美。</br></br>
注意:你不可以一個工程在兩個不同的窗口打開。如果你發現你無法瀏覽庫文件,要去檢查你沒有另一個Xcode窗口打開。</br></br>
并不是重新創建應用程序從上一個教程,你可以簡單地復制代碼。首先,選擇main.storyboard,RWViewController.h和RWViewController.m通過右鍵單擊并選擇“刪除”刪除它們,然后選擇要移動到trash。然后從你下載的壓縮文件 復制devapp文件夾,然后在Xcode將要用到的文件拖到UIControlDevApp group。</br></br>
Now you’re going to add the static library as a build dependency of the example app:</br>
現在你將把靜態庫文件作為示例app的依賴。</br></br>
在Project Navigator選擇UIControlDevApp project。
</br></br>找到UIControlDevApp target的Build Phases選擇框。</br></br>
選擇Target Dependencies并點擊加號顯示選項。</br></br>
找到RWUIControls靜態庫選擇并添加,這樣一個動作意味這當編譯 dev app時Xcode會重新檢查靜態庫文件是否需要重新編譯。</br></br>
為了鏈接到靜態庫本身,請使用“庫”面板擴展 Link Binary,然后再次單擊“+”。從工作區組選擇libRWUIControls.a然后單擊“添加.</br></br>
This action makes it so that Xcode will link it against the static library, just as it links against system frameworks like UIKit.</br></br>
這一行為使得讓Xcode將項目與靜態庫就像和鏈接系統的UIKit這樣的frameworks 一樣鏈接起來。</br></br>
Build and run to see it in action. If you followed the previous tutorial on building a knob control, you’ll recognize the simple app before your eyes.</br></br>
編譯和運行,如果你跟隨之前的building a knob control教程,有一個簡單的app出現在你的面前。</br></br>

使用嵌套的項目,這樣做的好處是,你可以繼續搞你的庫文件,也樣也從來沒有離開示例應用程序的項目,即使你保持在不同的地方的代碼。每次生成項目時,你也檢查你有公共/項目成員頭設置正確。如果缺少任何必需的標頭中的示例應用程序將無法建立。
Building a Framework
你可能會不耐煩地敲擊你的腳趾,并想知道framework從哪里來。可以理解,因為到目前為止,你已經做了很多工作,但也看不到framework。</br></br>
好了,事情將會很快改變了。您還沒有創建了一個框架的原因是因為框架幾乎是一個靜態庫和頭文件的集合 - 到目前為止,你已經創建了這么多。</br></br>
有一些事情讓framework顯得不同。</br></br>
文件夾目錄結構。框架具有由Xcode中識別的特殊文件夾結構。您將創建一個構建任務,這個構建任務會為你創建這些結構。</br></br>
The Slices。目前,當你構建庫,這只是對當前所需的cpu體系結構,即I386 ,ARM7等。為了一個框架是有用的,它需要包括建立對所有在其上需要運行架構。您將創建一個新的product,這將建立所需的所有架構,并將其放置在框架。</br></br>
這一部分將會有出現很多腳本魔力,但是我們進行的很慢,原沒有看起來那么復雜</br></br>
Framework Structure
像前面提到的一樣,一個framework有一些特殊的結構像下面這樣</br></br>

</br></br>
現在,您將添加一個腳本會在靜態庫構建過程中創建這樣的文件夾結構。選擇在Project Navigator的RWUIControls項目,并選擇RWUIControls靜態庫的目標。選擇 Build Phases選項卡,然后選擇編輯器中添加一個新的腳本 Editor/Add Build Phase/Add Run Script Build Phase.</br></br>

這會在build phases創建一個新的面板,新的面板允許你在構建過程中運行在某個時刻任意Bash腳本。如果你想改變該腳本在構建過程中運行的時間,可以拖動面板在列表位置。對于framework項目,上運行腳本在最后,所以你可以把它放在默認位置。</br></br>

通過雙擊腳本重命名面板標題,將它換成Build Framework。</br></br>
粘貼下面的Bash腳本到script field</br></br>
set -e
export FRAMEWORK_LOCN="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"
# Create the path to the real Headers die
mkdir -p "${FRAMEWORK_LOCN}/Versions/A/Headers"
# Create the required symlinks
/bin/ln -sfh A "${FRAMEWORK_LOCN}/Versions/Current"
/bin/ln -sfh Versions/Current/Headers "${FRAMEWORK_LOCN}/Headers"
/bin/ln -sfh "Versions/Current/${PRODUCT_NAME}" \
"${FRAMEWORK_LOCN}/${PRODUCT_NAME}"
# Copy the public headers into the framework
/bin/cp -a "${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/" \
"${FRAMEWORK_LOCN}/Versions/A/Headers"
```
這個腳本首先創建RWUIControls.framework /版本/ A /頭目錄,然后創建一個框架所需的三個symbolic links.
- Versions/Current => A
- Headers => Versions/Current/Headers
- RWUIControls => Versions/Current/RWUIControls</br></br>
最后,公共頭文件復制到從你前面指定位置到Versions/A/Headers目錄下。 -a參數保證了修改時間不更改作為復制的一部分,從而防止不必要的重建</br></br>
現在,選擇RWUIControls靜態庫scheme和iOS設備編譯,然后使用CMD + B 。</br></br>
</br></br>
右鍵選擇該RWUIControls項目中libRWUIControls.a靜態庫,并再次選擇在Finder中顯示。</br></br>
</br></br>
此編譯文件夾目錄下,你可以訪問RWUIControls.framework ,并確認目錄結構存在并且正確。</br></br>
</br></br>
這是在完成框架的路徑上的一次飛躍,但你會發現,沒有一個靜態庫在那里。這就是你要下一個進行的地方。
###Multi-Architecture Build
iOS應用程序需要在許多不同的架構上運行:
</br></br>用在最老的iOS 7支持的設備</br></br>
在iPhone 5和5C使用
</br></br> 對于iPhone 5S的64位ARM處理器
- i386: For the 32-bit simulator</br></br>
為32位的模擬器
- x86_64: Used in 64-bit simulator</br></br>
適用于64位模擬器</br></br>
每種架構都需要不同的binary文件,當你創建一個應用程序時,Xcode將建立與你當前架構相適應正確運行的binary文件。例如,如果你要求它在模擬器中運行,那么它只會建立i386版本(或x86_64 64位)。
這意味著創建可以很快的。當你archive應用程序或運行程序在release狀態下,那么的Xcode將建立三個ARM體系結構,從而使應用在大多數設備上運行。那另外的創建呢?</br></br>
當然,當你建立你的框架,你會希望開發人員能夠使用它的所有可能的架構,對不對?當然,你這樣做,因為這將意味著你可以贏取你的同行的尊重和敬佩。</br></br>
因此,你需要做的是讓Xcode構建五個架構。然后創建一個包含所有架構的臃腫的庫文件,啊哈!</br></br>
注:這其實顯現創建一個靜態庫的依賴關系的示例應用程序的另一個原因:該庫只建立由示例應用程序所需的架構,如果有新的變化只需要重新build。這是為什么你興奮?這意味著開發周期盡可能快。```
該框架將在RWUIControls項目中使用新的target來創建。要創建它,選擇在Project Navigator的RWUIControls項目,然后點擊下面的Add Target 。</br></br>
</br></br>
Navigate to iOS/Other/Aggregate, click Next and name the target Framework.</br></br>
</br></br>
Note:為什么使用集合(Aggregate)目標來創建一個framework呢?為什么這么不直接?因為OS X對庫的支持更好一些,事實上,Xcode直接為每一個OS X工程提供一個Cocoa Framework編譯目標?;诖耍銓⑹褂眉暇幾g目標,作為Bash腳本的連接串來創建神奇的framework目錄結構。你是不是開始覺得這里的方法有些愚蠢了?</br></br>
為了確保每當這個新的framework目標被創建時,靜態鏈接庫都會被編譯,你需要往靜態庫目標中添加依賴(Dependency)。在庫工程中選擇Framework目標,在Build Phases中添加一個依賴。展開Target Dependencies面板,點擊 + 按鈕選擇RWUIControls靜態庫。</br></br>
</br></br>
這個目標的主要編譯部分是多平臺編譯,你將使用一個腳本來做到這一點。和你之前做的一樣,在Framework目標下,選擇Build Phases欄,點擊Editor/Add Build Phase/Add Run Script Build Phase,創建一個新的Run Script Build Phase。</br></br>
</br></br>
雙擊Run Script,重命名腳本的名字。這次命名為MultiPlatform Build。
在腳本文本框中粘貼下面的Bash腳本代碼:</br></br>
set -e
# If we're already inside this script then die
if [ -n "$RW_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then
exit 0
fi
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1
RW_FRAMEWORK_NAME=${PROJECT_NAME}
RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"
RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework"
- set –e確保腳本的任何地方執行失敗,則整個腳本都執行失敗。這樣可以避免讓你創建一個部分有效的framework
- 接著,用RW_MULTIPLATFORM_BUILD_IN_PROGRESS變量決定是否循環調用腳本,如果有該變量,則退出。
- 然后設定一些變量。該framework的名字與項目的名字一樣。也就是RWUIControls,另外,靜態lib的名字是libRWUIControls.a。
接下來,用腳本設置一些函數,這些函數一會項目就會用到,把下面的代碼加到腳本的底部。</br></br>
function build_static_library {
# Will rebuild the static library as specified
# build_static_library sdk
xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \
-target "${TARGET_NAME}" \
-configuration "${CONFIGURATION}" \
-sdk "${1}" \
ONLY_ACTIVE_ARCH=NO \
BUILD_DIR="${BUILD_DIR}" \
OBJROOT="${OBJROOT}" \
BUILD_ROOT="${BUILD_ROOT}" \
SYMROOT="${SYMROOT}" $ACTION
}
function make_fat_library {
# Will smash 2 static libs together
# make_fat_library in1 in2 out
xcrun lipo -create "${1}" "${2}" -output "${3}"
}
- build_static_library把SDK作為參數,例如iPhone7.0,然后創建靜態lib,大多數參數直接傳到當前的構建工作中來,不同的是設置ONLY_ACTIVE_ARCH來確保為當前SDK構建所有的結構
- make_fat_library使用lipo將兩個靜態庫合并為一個,其參數為兩個靜態庫和結果的輸出位置。從這里了解更多關于lipo的知識。
為了使用這兩個方法,接下來腳本將定義更多你要用到的變量,你需要知道其他SDK是什么,例如,iphoneos7.0應該對應iphonesimulator7.0,反過來也一樣。你也需要找到該SDK對應的編譯目錄。</br></br>
把下面的代碼添加到腳本的底部。
# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then
RW_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi
# 2 - Extract the version from the SDK
if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then
RW_SDK_VERSION=${BASH_REMATCH[1]}
else
echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi
# 3 - Determine the other platform
if [ "$RW_SDK_PLATFORM" == "iphoneos" ]; then
RW_OTHER_PLATFORM=iphonesimulator
else
RW_OTHER_PLATFORM=iphoneos
fi
# 4 - Find the build directory
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$RW_SDK_PLATFORM$ ]]; then
RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"
else
echo "Could not find other platform build directory."
exit 1
fi
All four of these statements are very similar, they use string comparison and regular expressions to determine RW_OTHER_PLATFORM and RW_OTHER_BUILT_PRODUCTS_DIR.</br></br>
The four if statements in more detail:
上面四句聲明都非常相似,都是使用字符串比較和正則表達式來確定RW_OTHER_PLATFORM和RW_OTHER_BUILT_PRODUCTS_DIR。</br></br>
The four if statements in more detail:</br></br>
1.SDK_NAME將指代iphoneos7.0和iphonesimulator6.1,這個正則表達式取出字符串開頭不包含數字的那些字符,因此,其結果是iphoneos 或 iphonesimulator</br></br>
2.這個正則表達式取出SDK_NAME中表示版本用的數字,7.0或6.1等。
3.這里用簡單的字符串比較來將iphonesimulator 轉換為iphoneos,反過來也一樣。</br></br>
4.從構建好的工程的目錄路徑的末尾找出平臺名稱,將其替換為其他平臺。這樣可以確保為其他平臺構建的目錄可以被找到。這是將兩個靜態庫合并的關鍵部分。</br></br>
現在你可以啟動腳本為其他平臺編譯,然后得到合并兩靜態庫的結果。</br></br>
在腳本最后添加下面的代碼:
# Build the other platform.
build_static_library "${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"
# If we're currently building for iphonesimulator, then need to rebuild
# to ensure that we get both i386 and x86_64
if [ "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then
build_static_library "${SDK_NAME}"
fi
# Join the 2 static libs into 1 and push into the .framework
make_fat_library "${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}"
首先,調用你之前定義好的函數為其他平臺編譯</br></br>
如果你現在正在為模擬器編譯,那么Xcode會默認只在該系統對應的結構下編譯,例如i386 或 x86_64。為了在這兩個結構下都進行編譯,這里調用了build_static_library,基于iphonesimulator SDK重新編譯,確保這兩個結構都進行了編譯。
最后調用make_fat_library將在當前編譯目錄下的靜態lib同在其他目錄下地lib合并,依次實現支持多結構的FAT靜態庫。這個被放到了framework中。</br></br>
The final commands of the script are simple copy commands. Add the following to the end of the script:</br></br>
腳本的最后是簡單的拷貝命令,將下面代碼添加到腳本最后:</br></br>
# Ensure that the framework is present in both platform's build directories
cp -a "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}"
# Copy the framework to the user's desktop
ditto "${RW_FRAMEWORK_LOCATION}" "${HOME}/Desktop/${RW_FRAMEWORK_NAME}.framework"
第一條命令確保framework在所有平臺的編譯目錄中都存在.</br></br>
第二條將完成的framework拷貝到用戶的桌面上,這一步是可選的,但我發現這樣做可以很方便的存取framework。</br></br>
選擇Framework集合方案(aggregate scheme),按下cmd+B編譯該framework。</br></br>
</br></br>
This will build and place a RWUIControls.framework on your desktop.</br></br>這一步將構建并在你的桌面上存放一個RWUIControls.framework。</br></br>
</br></br>
In order to check that the multi-platform build worked, fire up a terminal and navigate to the framework on the desktop, as follows:</br></br>
為了檢查一下我們的多平臺編譯真的成功了,啟動終端,導航到桌面上的framework,像下面一樣</br></br>
$ cd ~/Desktop/RWUIControls.framework
$ RWUIControls.framework xcrun lipo -info RWUIControls
第一條指令導航到framework中,第二行使用lipo指令從RWUIControls靜態庫中得到需要的信息,這將列出存在于該庫中的所有片段</br></br>。</br></br>
這里你可以看到,一共有五種片段:i386, x86_64, arm7, arm7s 和 arm64,正如你在編譯時設定的那樣。如果你之前使用lipo –info指令,你可以看到這些片段的一個分組。
###自己的補充
前面的設置只能生成三種架構,如果需要生成五種架構,還需要按下面的截圖添加一些設置。</br>
