Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用

说明

  1. 本篇文章中 Frmaework 是在 Objective-C 环境下创建的,包含 Objective-C 和 Swift 文件。由于项目原因,只涉及 Objective-C 调用 Swift。
  2. Swift 调用 Objective-C 需要添加一个 bridge 文件,本文不做详述。

注意事项

Xcode 9 中不要直接拖动文件到项目中(直接拖入不会选中 Targets 的那个复选框),需要右键导入文件,并且选中 Targets 的那个复选框,否则会找不到文件。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 0.jpg

PS:也可以在拖动后,选中文件,在 Xocde 的右侧选中那个复选框。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 1.png

完成一个 Framework

  1. 创建一个 Objective-C 的Framework(截图省略)

  2. 在 Build Settings 中设置 Defines Module 为 YES

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 2.png

  1. Build Phases -> Headers -> Public 中添加需要暴露的 .h 文件,不需要暴露的文件放在 Build Phases -> Headers -> Project 中。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 3.png

  1. 在 Objective-C 的 .h 文件中,需要用到 Swift 中的对象时,前置声明在 Swift 中的类。

不要在 .h 中 #import <ChartFramework/ChartFramework-Swift.h>,否则会报错找不到文件

PS:ChartFramework-Swift.h 是我自己项目中的命名。格式是 productModuleName-Swift.h。
当你工程中有 Swift 文件时,会自动生成的(注意前面提到的注意事项),不需要手动创建。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 4.png

  1. 在 .m 中
#import <ChartFramework/ChartFramework-Swift.h>

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 5.png

  1. 通过脚本将真机和模拟器编译生成的 Framework 合并

在 Build Phases 中选中 “+”,再单击 “New Run Script Phase”,最后添加脚本。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 6.png
《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 7.png

PS:脚本是在网上找的,好用,具体链接忘了。感谢作者!
说明:
1. 分别在真机和模拟器下编译一次即可。第一次编译模拟器时会报错,忽略。然后再编译一次真机就可以了。
2. 真机和模拟器编译无先后顺序。
3. 生成的 Framework 目录在主工程文件夹下。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 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

  1. 将 Framework 右键导入项目中
  2. 将 Build Settings -> Build Options -> Always Embed Swift Standard Libraries 设置为 YES

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 6.png

  1. 在 Framework Search Paths 中设置 Framework 的 path

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 7.png

  1. 嵌入 Framework

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 8.png

  1. 如果 Framework 中有 xib、storyboard 等文件,需要导入到项目中

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 9.png

总结

Apple Swift and Objective-C in the Same Project 文档中的一段总结,写得非常好。

《Xcode 9 下创建包含 Objective-C 与 Swift 代码的 Framework 及其使用》 总结.png

参考

    原文作者:世界的一缕曙光
    原文地址: https://www.jianshu.com/p/d1bf6706653f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞