iOS下建立framewok(上)

來源:互聯網
上載者:User

標籤:

iOS開發中,有時候需要將一些工具封裝起來,做成sdk提供給客戶使用,製作過程可以分為兩種。一種是製作靜態庫.a檔案,一種是製作成framework檔案。前者操作起來簡單,但是提供給客戶時比較麻煩,需要提供標頭檔。後者使用簡便,可以直接匯入,但是製作較為麻煩。

蘋果在iOS8之前都不支援動態庫framework方法,所以這裡說的framework實質上都是靜態庫檔案。如果有什麼理解和整理錯誤的地方,歡迎大家指出問題所在。

這篇文章主要記錄建立framework的方法。建立framework也有兩種方法,一種是Xcode6之前的製作方法,一種是Xcode6之後的製作方法。這篇部落格先講解最新版本Xcode7製作framework的方法。

Xcode6就已經提供了動態庫的製作方法。這裡還是以Xcode7為例,兩者的操作步驟是相同的。建立一個Project,選擇iOS下的Framework & Library選項:



建立之後,選擇你建立的Targets,在BuildSetting中搜尋Mach-O,將之設定為Static Library:



然後這裡開始寫一個類來製作framework,提供給另一個項目進行測試,當建立好一個類檔案的時候,需要在預設存在的ZYXTestFramework.h中將建立的類的標頭檔暴露出來,否則在另一個項目中匯入標頭檔時會出現“Missing XXXXX”的警告。



在建立的類中寫一個測試方法,列印傳遞過來的字串,標頭檔暴露出該方法:


完成之後,選擇Targets下的Build Phase選項,還需要將新建立的類的標頭檔暴露給使用framework的開發人員調用。Headers下有三個選項Public,Private,Projects。可能中間的Private的名字會讓人產生一些困惑,Private並不表明是私人的,其還是暴露了一些東西,Projects才是表明是私人的檔案(該解釋是從網上一篇教程中看到的,目前也不是太明確,不過一般來說還是使用Public和Projects這兩個)。將ZYXFrameworkTest.h移動到Public下。





此時已經可以進行編譯操作了,但是這裡需要說明:我們製作的framework針對的iPhone手機的架構不只一種,一般模擬器使用的是x86 64與i386,而真機主要是arm64和armv7。armv7s很多sdk都沒有特定去編譯他,比如說facebook,我查看他們支援的架構未包括armv7s。網上有些教程說需要更改中的兩個選項,其實對於這篇博文來說是沒有必要的。


在編譯時間,設定為Release狀態來進行framework的產生。這裡先產生支援模擬器的Release版本,選擇EditScheme,將run狀態下的Debug改為Release。



運行,產生framework。可以查看產生的framework支援的架構,開啟產生的framework在Finder中的位置,拖拽到終端,使用lipo命令來查看支援的架構。其中ZYXTestFramework檔案實質上是靜態.a檔案。



可以看見支援的架構為i386何x86 64。接著再為真機產生一次framewok,因為手邊沒有真機,沒辦法。產生步驟與上述操作一樣,只要換成真機裝置就可以了。

最終產生之後需要合并兩個檔案,使之支援4個架構,在合并時,操作的就是上面所說的實質上是靜態.a的ZYXTestFramework檔案。在終端下執行lipo -create (模擬器產生的ZYXTestFrameWork路徑)     ( 真機產生的路徑 )  -outfile  合并的之後的路徑和名稱


上述產生操作也可以直接使用指令碼來執行,在Xcode中建立一個Target,選擇Aggregate。該Target可以用來執行指令碼產生項目。


建立完畢後,在Build Phase下點擊+號,選擇New copy Run scripts,然後添加一段指令碼



指令碼內容如下:

set -e

# Sets the target folders and the final framework product.

# 如果工程名稱和Framework的Target名稱不一樣的話,要自訂FMKNAME

# 例如: FMK_NAME = "MyFramework"

FMK_NAME=${PROJECT_NAME}

# Install dir will be the final output to the framework.

# The following line create it in the root folder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework

# Working dir will be deleted after the framework creation.

WRK_DIR=build

DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework

# -configuration ${CONFIGURATION}

# Clean and Building both architectures.

xcodebuild -configuration "Release" -target"${FMK_NAME}" -sdk iphoneos clean build

xcodebuild -configuration "Release" -target"${FMK_NAME}" -sdk iphonesimulator clean build

# Cleaning the oldest.

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/""${INSTALL_DIR}/"

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

lipo -create "${DEVICE_DIR}/${FMK_NAME}""${SIMULATOR_DIR}/${FMK_NAME}" -output"${INSTALL_DIR}/${FMK_NAME}"

rm -r "${WRK_DIR}"


open "${INSTALL_DIR}"

注意:使用這段指令碼時“xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build”該段指令碼直接執行了真機產生,所以就像使用真機調試一樣,需要一個簽署憑證。否則Build會失敗。


產生時需要調整Target,對Aggregate執行run操作。最終會在當前項目目錄中建立一個Products目錄,在該目錄下會有合成後的framework。  但是會有一個_codeSignature檔案夾,應該是真機調試簽名產生的檔案夾。因為我看facebook的SDK中的framework中沒有這個檔案夾,所以不知道刪除這個_codeSignature會不會有影響。使用者在使用這個framework時會不會也對這個framework進行簽名,如果有人能解惑,非常感謝。


將產生後的framework放入測試專案中,匯入標頭檔,進行測試。因為身邊沒有手機,所以直接用的模擬器測試的,這也是上面那個問題沒有驗證的原因。最終測試結果如下:(好像圖片上傳不了了,匯入標頭檔和調用什麼的都沒了,太大)



可以看見最終是成功調用到framework中的api。這是Xcode7產生framework的方法,我個人覺得最終還是靜態庫,應該不會被蘋果拒絕,和facebook對比發現就是多了一個_codeSignature檔案夾,這個app真機簽名檔案夾刪除之後不知道有沒有影響。

以上博文,懇請各位有能力的人能夠指教解惑。再三感謝。


iOS下建立framewok(上)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.