之前一直用的 framework 實現(xiàn)了 OC 和 Swift 互調炕婶,現(xiàn)在需要添加依賴保檐,即 framework 也需要 cocoapods 引入庫殴边,建立的方式稍有不同搪桂,這里記錄一下康谆。
建立新項目赐劣,選擇 framework柄慰,命名鳍悠,這里我命名為 HKYKit税娜。
支持版本調低,和項目一樣就可以了藏研。這里比項目支持版本高的話會在引入 framework 時報錯敬矩。如果有多個項目需要引這個 framework,選最低的版本蠢挡。
引入 cocoapods 庫
framwork 可能依賴別的庫(比如我創(chuàng)建的 framework 就依賴 SwiftJSON)弧岳,這時候和普通項目一樣建立 Podfile,注意使用 use_frameworks!
pod install业踏,從 .xcworkspace 打開禽炬,創(chuàng)建代碼。
接口
這里創(chuàng)建一個 Experiment.swift 作為示例勤家,根據(jù)需要把一切需要調用的都標上 public
或 open
import Foundation
import SwiftyJSON
public struct Experiment {
public init() { }
public func anyJSON() -> JSON {
var json = JSON()
json["title"].string = "實驗"
return json
}
}
將 Experiment.swift 作為暴露給 framework 外部的文件
TARGETS->Build Phases->Headers腹尖,添加到 Public
生成 .framework
先設置,TARGETS->Build Settings->Mach-O Type却紧,設為 Static Library桐臊。這里如果需要設為 Dynamic Library ,在引入 .framework 的項目還需設置一下晓殊,文末有設置方法断凶。
構建框架
選到模擬器和真機,分別 build 一遍
項目目錄->Products->XXX.framework->Show in Finder
看到 XXX.framework 文件夾及 Pods 文件夾巫俺。 Products 文件夾包含 Debug-iphoneos 和 Debug-iphonesimulator认烁,對應真機和模擬器。
生成通用框架
TARGETS 左下角加號介汹,添加一個 Aggregate却嗡,命名為 Maker
Build Phases->左上角加號->New Run Script Phase
注意 UNIVERSAL_OUTPUTFOLDER
路徑,xxx 改為用戶名嘹承。這里先測試一下窗价,生成到桌面,實際生成到項目目錄里比較方便叹卷。
if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"
UNIVERSAL_OUTPUTFOLDER=/Users/xxx/Desktop
# 輸出文件夾
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build
xcodebuild -target "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
fi
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
fi
Maker 的 Build Setting->Excluded Architectures 添加 arm64
選到 Maker撼港,Build, 生成 .framework
引入 framework
新建一個項目骤竹,測試 framework 是否能用帝牡。如果 framework 使用了 cocoapods,項目也要使用 cocoapods蒙揣,引入需要的庫靶溜。建立一個測試項目取名為 SwiftDemo,生成 SwiftDemo.xcworkspace
直接將生成的 .framework 拖入項目目錄,確保 TARGETS->Build Phases 中有 .framework
測試代碼
import UIKit
import HKYKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let e = Experiment()
let json = e.anyJSON()
print("\(json["title"].stringValue)")
}
}
Run 一下罩息,如果 framework 的 Mach-O Type 選的是 Dynamic Library 嗤详,則會報錯
dyld: Library not loaded: @rpath/HKYKit.framework/HKYKit
Referenced from: /private/var/containers/Bundle/Application/02734D3C-F7CC-4DD1-BDDB-971CC2597F54/SwiftDemo.app/SwiftDemo
Reason: image not found
將 TARGETS->General->Frameworks,Libraries,and Embeded Content 中 framework 的 Do Not Embed 改為 Embed & Sign。
建議使用 Static Library扣汪,Do Not Embed断楷。
如果報錯
Building for iOS, but the linked and embedded framework was built for iOS + iOS Simulator.
在 stackoverflow 找到解決方法:TARGETS->Build Settings->Validate Workspace 改為 YES,Run 一次崭别,再改回 NO 就可以了。
正常運行恐锣,輸出“實驗”
在項目中的 .framework 上右鍵茅主,Show in Finder,拷貝其 目錄地址土榴,復制到上面的 UNIVERSAL_OUTPUTFOLDER
诀姚,之后生成就可以直接在項目里用了。