Build iOS framework with Xcode

前言

有時候我們會想把專案裡的某些小功能打包起來,如此一來可以方便自己和其他開發者使用。針對 framework 檔,開發者不需要知道檔案裡面的實作細節,只要正確使用其中的方法和屬性,framework 就能幫開發者達成某些功能。

準備原始碼,決定公開和私有的檔案

在 Xcode 環境下建立 framework project

Menu bar: file/ New/ Project
Menu bar: file/ New/ Project

選擇 Cocoa Touch Framework 建立一個框架專案檔
選擇 Cocoa Touch Framework 建立一個框架專案檔

加入原始碼,設定環境

  • 把 framework 所有原始碼加入 Xcode
    加入 framework 所需的原始碼檔案

  • 決定欲公開的檔案

    • 將欲公開的檔案加入 frameworkName.h
      在 frameworkName.h 檔案中加入欲公開的 header 檔

    • 在 framework TARGET 下的 Build Phase 標籤頁中添加欲公開的 header 檔
      將 Headers 欄中 Project 項目下欲公開的 header 檔拖曳至上方的 Public 項目下。此步驟的「欲公開的 header 檔」與前一步的 #import 項目相同。

    • (Optional)合併實機和模擬器的 framework

      點選 Build Phase 左上方的加號,加入 run script 讓實機與模擬器的 framework 合併。

      複製以下的程式碼加入 Run Script 欄的灰色框內。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      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}/"
      lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
      open "${SRCROOT}/Products"
      fi

      加完後如下圖所示:

建立 framework 檔

首先,在 framework project 的模擬器建立 framework 檔(cmd + B)

在建立模擬器的 framework 時會出現 build failed 的警告,請不要驚慌,這是因為此時實機的 framework 尚未建立,執行這段 script 時無法將實機和模擬器的 framework 合併。

接著選擇 Generic iOS Device 再 build 一次。

最後我們可以在自動開啟的 Products 資料夾下看見建立好的 framework 檔。