iOS 創(chuàng)建含有 cocoapods 依賴的 framework

之前一直用的 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ù)需要把一切需要調用的都標上 publicopen

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诀姚,之后生成就可以直接在項目里用了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末玷禽,一起剝皮案震驚了整個濱河市赫段,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矢赁,老刑警劉巖糯笙,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撩银,居然都是意外死亡给涕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門额获,熙熙樓的掌柜王于貴愁眉苦臉地迎上來够庙,“玉大人,你說我怎么就攤上這事抄邀≡耪#” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵境肾,是天一觀的道長线得。 經常有香客問我,道長办铡,這世上最難降的妖魔是什么凌蔬? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮衫嵌,結果婚禮上读宙,老公的妹妹穿的比我還像新娘。我一直安慰自己楔绞,他們只是感情好结闸,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布唇兑。 她就那樣靜靜地躺著,像睡著了一般桦锄。 火紅的嫁衣襯著肌膚如雪扎附。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天结耀,我揣著相機與錄音留夜,去河邊找鬼。 笑死图甜,一個胖子當著我的面吹牛碍粥,可吹牛的內容都是我干的。 我是一名探鬼主播黑毅,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚼摩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矿瘦?” 一聲冷哼從身側響起枕面,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缚去,沒想到半個月后潮秘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡病游,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年唇跨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衬衬。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡买猖,死狀恐怖,靈堂內的尸體忽然破棺而出滋尉,到底是詐尸還是另有隱情玉控,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布狮惜,位于F島的核電站高诺,受9級特大地震影響,放射性物質發(fā)生泄漏碾篡。R本人自食惡果不足惜虱而,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望开泽。 院中可真熱鬧牡拇,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剔蹋,卻和暖如春旅薄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泣崩。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工少梁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人律想。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓猎莲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親技即。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容