swift framework 制作

首先我們通過新建菜單的 Framework & Library 創(chuàng)建一個 Cocoa Touch Framework 項目QJWiFi

1涨共、內(nèi)容:

創(chuàng)建需要打包的代碼测暗,將需要公開調(diào)用的接口方法聲明為public(供其他 module 調(diào)用)

2、framework 生成:

將運行設(shè)備選擇為任一 iOS 模擬器蚂踊,然后使用 Shift + Cmd + I 進行 Profiling 編譯(同時生成 debug 與 release 版本约谈,如果是 Cmd + B,則只生成 debug 版本)犁钟。我們可以在項目的生成的數(shù)據(jù)文件夾 中找到QJWiFi.framework

(對應(yīng)項目的 ~/Build/Products/Release-iphonesimulator)

快捷訪問生成文件

3棱诱、版本兼容:

將運行設(shè)備選擇為真機,使用 Shift + Cmd + I 進行 Profiling 編譯涝动,此時我們的生成文件目錄下有(Debug-iphonesimulator迈勋、Release-iphoneos、Release-iphonesimulator)三個文件醋粟,我們需要將其中的一些內(nèi)容合并

合并A:合并 Release-iphoneos 與Release-iphonesimulator 文件下的二進制文件
終端命令:

 cd /Users/xxx/Library/Developer/Xcode/DerivedData/QJWiFi-fejnkmidkzkbocbjnkbgoclwbobz/Build/Products
lipo -create Release-iphoneos/QJWiFi.framework/QJWiFi Release-iphonesimulator/QJWiFi.framework/QJWiFi -output Release-iphoneos/QJWiFi.framework/QJWiFi
lipo -info QJWiFi  // 查詢framework 支持的 cpu 架構(gòu)
Architectures in the fat file: QJWiFi are: i386 x86_64 armv7 arm64 

合并B:拷貝Release-iphonesimulator/QJWiFi.framework/Modules/QJWiFi.swiftmodule 文件夾下的所有文件到 Release-iphoneos 相應(yīng)的文件夾中靡菇,現(xiàn)在 Release-iphoneos 文件中的 QJWiFi.framework 就是我們需要的架包重归。


4、測試:

新建一個 Swift 項目, 將 QJWiFi.framework 拖拽添加到項目中厦凤。我們最好勾選上 Copy items if needed鼻吮,這樣原來的框架的改動就不會影響到我們的項目了。然后较鼓,在需要使用這個框架的地方導(dǎo)入框架的 module(import QJWiFi)椎木,這樣我們就可以使用使用框架中的公開類與方法。

但是博烂。香椎。。運行項目禽篱,success 之后編譯器會報以下錯誤

dyld: Library not loaded: @rpath/QJWiFi.framework/QJWiFi
  Referenced from: /Users/laichunhui/Library/Developer/CoreSimulator/Devices/CBBB7623-1930-4A1F-A094-6A2AC27A8E29/data/Containers/Bundle/Application/AB2EAE28-C094-4047-9379-815980E8A214/QJWiFiDemo.app/QJWiFiDemo
  Reason: image not found

這是因為我們還未將框架復(fù)制到項目包中畜伐。在 Build Phases 選項卡里添加一個 Copy File 的階段 ,然后將目標(biāo)設(shè)定為 Frameworks躺率,將我們的 QJWiFi.framework 添加到新建的階段里烤礁,來指定 IDE 在編譯時進行復(fù)制。

常見問題:

  1. Objective-C 項目集成 Swift framework 注意點
    如果要將框架導(dǎo)入到 OC 項目中(#import "QJWiFi/QJWiFi.h" 或 #import "QJWiFi/QJWiFi-Swift.h")肥照,還需要將 Build setting 中的 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES 設(shè)置為 YES,否則項目會報 image not found 的錯誤勤众。


  2. 資源加載

  • framework 自身對應(yīng)的 bundle: Bundle(for: QJWiFi.self)
  • framework 內(nèi)部 image 訪問: UIImage(named: imageName, in: bundle, compatibleWith: nil)
  1. 報錯: Include of non-modular header inside framework module
    如果我們項目中調(diào)用了比如 CommonCrypto 等底層框架舆绎,由于這些框架并未打包成 module,我們無法直接導(dǎo)入到 Swift 項目中们颜,如果在 framework 的頭文件中直接導(dǎo)入 (#import <CommonCrypto/CommonCrypto.h>)就會報以上錯誤吕朵。在framework 中,橋接是不被允許的窥突,有興趣的可以不妨一試努溃。所以我們只能為這個底層框架創(chuàng)建 module。
  • 首先在你的 Framework/Target 下建一個文件夾阻问,可以叫做 CommonCrypto 梧税,并創(chuàng)建兩個子文件夾,可以分別命名為 iphoneos 称近、iphonesimulator第队,并分別新建一個 module.modulemap的文件,內(nèi)容分別為:
  module CommonCrypto [system] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
module CommonCrypto [system] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
  • 然后在你的 Target 的 Build Setting 中找到 Swift ComCompiler - Search Paths 的 Import Paths 刨秆,設(shè)置鍵值:
    • Any iOS Simulator SDK
      ${SRCROOT}/QJWiFi/CommonCrypto/iphonesimulator

    • Any iOS SDK
      ${SRCROOT}/QJWiFi/CommonCrypto/iphoneos


這樣在 framework 中就可以直接導(dǎo)入 module (import CommonCrypto)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凳谦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衡未,更是在濱河造成了極大的恐慌尸执,老刑警劉巖家凯,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異如失,居然都是意外死亡绊诲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門岖常,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驯镊,“玉大人,你說我怎么就攤上這事竭鞍“寤螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵偎快,是天一觀的道長冯乘。 經(jīng)常有香客問我,道長晒夹,這世上最難降的妖魔是什么裆馒? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丐怯,結(jié)果婚禮上喷好,老公的妹妹穿的比我還像新娘。我一直安慰自己读跷,他們只是感情好梗搅,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著效览,像睡著了一般无切。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丐枉,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天哆键,我揣著相機與錄音,去河邊找鬼瘦锹。 笑死籍嘹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弯院。 我是一名探鬼主播噩峦,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抽兆!你這毒婦竟也來了识补?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤辫红,失蹤者是張志新(化名)和其女友劉穎凭涂,沒想到半個月后祝辣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡切油,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年蝙斜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澎胡。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡孕荠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攻谁,到底是詐尸還是另有隱情稚伍,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布戚宦,位于F島的核電站个曙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏受楼。R本人自食惡果不足惜垦搬,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艳汽。 院中可真熱鬧猴贰,春花似錦、人聲如沸河狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甚牲。三九已至,卻和暖如春蝶柿,著一層夾襖步出監(jiān)牢的瞬間丈钙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工交汤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雏赦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓芙扎,卻偏偏與公主長得像星岗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戒洼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 靜態(tài)庫與動態(tài)庫的區(qū)別 首先來看什么是庫圈浇,庫(Library)說白了就是一段編譯好的二進制代碼寥掐,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,882評論 3 42
  • (原文:How to Create a Framework for iOS 作者:Sam Davies 譯者:Mr...
    王憲嶺閱讀 4,872評論 2 23
  • 1.The business went belly up after only six months. 這家公司只...
    Mr_Oldman閱讀 84評論 0 0
  • 深深感恩彩虹老師帶領(lǐng)和分享靴寂,用教練技術(shù)這樣可以內(nèi)在測量的善巧工具,一步一步調(diào)整自己的身心狀態(tài)召耘。內(nèi)在覺察更加精準(zhǔn)具體...
    施雨希閱讀 167評論 1 1
  • 大綱 一心想開個飯館的小廚娘與不走尋常路的冷面殺手之間的二三事百炬。 一,救命之恩污它。 殺手與廚娘的初相遇 二剖踊,殺手與...
    兩柒閱讀 311評論 0 0