說(shuō)明
- 本篇文章中 Frmaework 是在 Objective-C 環(huán)境下創(chuàng)建的到推,包含 Objective-C 和 Swift 文件底循。由于項(xiàng)目原因踱卵,只涉及 Objective-C 調(diào)用 Swift。
- Swift 調(diào)用 Objective-C 需要添加一個(gè) bridge 文件郑临,本文不做詳述栖博。
注意事項(xiàng)
Xcode 9 中不要直接拖動(dòng)文件到項(xiàng)目中(直接拖入不會(huì)選中 Targets 的那個(gè)復(fù)選框),需要右鍵導(dǎo)入文件牧抵,并且選中 Targets 的那個(gè)復(fù)選框笛匙,否則會(huì)找不到文件侨把。
0.jpg
PS:也可以在拖動(dòng)后犀变,選中文件,在 Xocde 的右側(cè)選中那個(gè)復(fù)選框秋柄。
1.png
完成一個(gè) Framework
創(chuàng)建一個(gè) Objective-C 的Framework(截圖省略)
在 Build Settings 中設(shè)置 Defines Module 為 YES
2.png
- 在 Build Phases -> Headers -> Public 中添加需要暴露的 .h 文件,不需要暴露的文件放在 Build Phases -> Headers -> Project 中。
3.png
- 在 Objective-C 的 .h 文件中曙咽,需要用到 Swift 中的對(duì)象時(shí)竿拆,前置聲明在 Swift 中的類。
不要在 .h 中 #import <ChartFramework/ChartFramework-Swift.h>
笨触,否則會(huì)報(bào)錯(cuò)找不到文件
PS:ChartFramework-Swift.h 是我自己項(xiàng)目中的命名懦傍。格式是 productModuleName-Swift.h。
當(dāng)你工程中有 Swift 文件時(shí)芦劣,會(huì)自動(dòng)生成的(注意前面提到的注意事項(xiàng))粗俱,不需要手動(dòng)創(chuàng)建。
4.png
- 在 .m 中
#import <ChartFramework/ChartFramework-Swift.h>
5.png
- 通過(guò)腳本將真機(jī)和模擬器編譯生成的 Framework 合并
在 Build Phases 中選中 "+"虚吟,再單擊 "New Run Script Phase"寸认,最后添加腳本。
6.png
7.png
PS:腳本是在網(wǎng)上找的串慰,好用偏塞,具體鏈接忘了。感謝作者邦鲫!
說(shuō)明:
1. 分別在真機(jī)和模擬器下編譯一次即可灸叼。第一次編譯模擬器時(shí)會(huì)報(bào)錯(cuò),忽略。然后再編譯一次真機(jī)就可以了古今。
2. 真機(jī)和模擬器編譯無(wú)先后順序慎冤。
3. 生成的 Framework 目錄在主工程文件夾下。
8.png
腳本如下:
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}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi
使用該 Framework
- 將 Framework 右鍵導(dǎo)入項(xiàng)目中
- 將 Build Settings -> Build Options -> Always Embed Swift Standard Libraries 設(shè)置為 YES
6.png
- 在 Framework Search Paths 中設(shè)置 Framework 的 path
7.png
- 嵌入 Framework
8.png
- 如果 Framework 中有 xib沧卢、storyboard 等文件蚁堤,需要導(dǎo)入到項(xiàng)目中
9.png
總結(jié)
Apple Swift and Objective-C in the Same Project 文檔中的一段總結(jié),寫(xiě)得非常好但狭。
總結(jié).png