自己在創(chuàng)建Framework的過程中踩了很多坑,特別是我們有一部分關(guān)鍵代碼是 C++ 寫的而且還需要引用第三方 Object-C 庫就更坑了抵恋,把跳坑的方法寫在這里。
創(chuàng)建Framework
Xcode->File->New->Project->Cocoa Touch Framework
我這里命名 TestUIKit
Swift創(chuàng)建 Framework 文件目錄要求代碼放進(jìn)Sources文件夾宝磨,我們需要修改一下文件目錄弧关,將項(xiàng)目中的 TestUIKit實(shí)體文件夾改名成 Sources,前后對比圖:
與此同時(shí)我們還需要在項(xiàng)目右側(cè)的TARGETS->Build Setting里面修改Info.plist路徑地址Sources/Info.plist
創(chuàng)建 Object-C 類
創(chuàng)建一個(gè)CustomMath繼承 NSObject 的類 執(zhí)行一個(gè) ? 方法
如果我們在 Swift 項(xiàng)目中使用 Object-C 代碼的話建立一個(gè)橋接文件 Bridging-header.h
唤锉,在橋接文件中#import "CustomMath.h"
就能在 Swift 中調(diào)用 OC 代碼了世囊,但是
Swift創(chuàng)建 Framework 是不允許使用橋接文件的(編譯報(bào)錯(cuò)error: using bridging headers with framework targets is unsupported)
,怎么辦?!
- 第一種方法窿祥,按照文檔中株憾,為了讓Swift文件訪問Objective-C文件,我們應(yīng)該在umbrella header晒衩,也就是TestUIKit.h中嗤瞎,暴露所需要的header墙歪。
然后你就可以在Swift代碼中輕松的使用CustomMath類了
- 第二種方法,如果你的Objective-C文件和接口并不想暴露可以采用modulemap猫胁。新建一個(gè)module.modulemap文件箱亿,內(nèi)容如下:
這里輸入的路徑是module.modulemap文件所在的路徑。(這里面可以申明多個(gè)模塊)
然后弃秆,刪除TestUIKit.h(umbrella header)中#import 的OC header届惋。
把OCSource.h的權(quán)限改回默認(rèn)的project。
然后在需要使用的 Swift 類中導(dǎo)入頭文件一樣 import CustomMath 就能在 Swift 代碼中愉快的使用 OC 代碼了菠赚。使用module.modulemap方法原文移步
引入cocopods代碼
我們用MBProgressHUD做例子脑豹,畢竟MBProgressHUD用法比較簡單。
使用 cocopods 下載衡查,然后打開workspace瘩欺。
雖然上面說可以使用module.modulemap方法可以使用OC代碼了,但是我測試了一下即使把MBProgressHUD.h的完整路徑寫進(jìn)去 編譯時(shí)依然無法將module MBProgressHUD編譯成功拌牲,可能我的操作方式不對俱饿。
后來只能另辟蹊徑了:創(chuàng)建一個(gè)OC類OCBridgingHeader將MBProgressHUD等其他需要的使用的OC類都在這里導(dǎo)入頭文件
在使用的地方 import OCBridgingHeader
最后還有一點(diǎn),在合并真機(jī)和虛擬機(jī)庫后塌忽,要將兩者M(jìn)odules文件夾中MaraTrackSDK.swiftmodule文件夾里所有的東西也合并拍埠,這樣合并后的framework才真正的能在真機(jī)和虛擬機(jī)中使用!