说明
- 本篇文章中 Frmaework 是在 Objective-C 环境下创建的,包含 Objective-C 和 Swift 文件。由于项目原因,只涉及 Objective-C 调用 Swift。
- Swift 调用 Objective-C 需要添加一个 bridge 文件,本文不做详述。
注意事项
Xcode 9 中不要直接拖动文件到项目中(直接拖入不会选中 Targets 的那个复选框),需要右键导入文件,并且选中 Targets 的那个复选框,否则会找不到文件。
0.jpgPS:也可以在拖动后,选中文件,在 Xocde 的右侧选中那个复选框。
1.png完成一个 Framework
-
创建一个 Objective-C 的Framework(截图省略)
-
在 Build Settings 中设置 Defines Module 为 YES
- 在 Build Phases -> Headers -> Public 中添加需要暴露的 .h 文件,不需要暴露的文件放在 Build Phases -> Headers -> Project 中。
- 在 Objective-C 的 .h 文件中,需要用到 Swift 中的对象时,前置声明在 Swift 中的类。
不要在 .h 中 #import <ChartFramework/ChartFramework-Swift.h>
,否则会报错找不到文件
PS:ChartFramework-Swift.h 是我自己项目中的命名。格式是 productModuleName-Swift.h。
当你工程中有 Swift 文件时,会自动生成的(注意前面提到的注意事项),不需要手动创建。
4.png
- 在 .m 中
#import <ChartFramework/ChartFramework-Swift.h>
5.png
- 通过脚本将真机和模拟器编译生成的 Framework 合并
在 Build Phases 中选中 "+",再单击 "New Run Script Phase",最后添加脚本。
6.png 7.pngPS:脚本是在网上找的,好用,具体链接忘了。感谢作者!
说明:
1. 分别在真机和模拟器下编译一次即可。第一次编译模拟器时会报错,忽略。然后再编译一次真机就可以了。
2. 真机和模拟器编译无先后顺序。
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 右键导入项目中
- 将 Build Settings -> Build Options -> Always Embed Swift Standard Libraries 设置为 YES
- 在 Framework Search Paths 中设置 Framework 的 path
- 嵌入 Framework
- 如果 Framework 中有 xib、storyboard 等文件,需要导入到项目中
总结
Apple Swift and Objective-C in the Same Project 文档中的一段总结,写得非常好。
总结.png
网友评论