OSX和iOS共享swift模块

Tam*_*ane 6 macos xcode objective-c ios swift

我已经创建了基于swift的Cocoa Touch Framework项目,TestLib然后我添加了Cocoa Framework名为的新目标TestLibOSX.当我在iOS应用程序上使用该框架时,似乎没有任何问题,但是当我创建OSX控制台应用程序时,XCode抱怨它无法找到TestLibOSX模块.我错过了什么吗?

PS 不一样:)

编辑:似乎这一定是可能的,因为我可以看到Lister以这种方式实现.

Tok*_*iku 1

好吧,通用框架确实很痛苦。不仅适用于 iOS 和 OSX,而​​且仅适用于 iOS 内部,因为您需要 2 个框架:一个用于模拟器,一个用于设备。处理 iOS 的方式是使用“聚合”目标。我相信可以利用相同的途径来集成 OS X 目标。

当您构建框架时,您会得到一个 .framework(乐高积木)文件夹。在那里,有两件非常重要的事情:

  1. “可执行”文件
  2. “模块”文件夹

在这两个地方,您都必须实现支持您想要支持的所有架构。如果您单独构建框架并希望将它们融合在一起,则必须执行以下操作:

  1. 获取两个可执行文件并使用“lipo”命令将它们合并。
  2. 确保两个“模块”文件夹中的所有文件都一起移动。

实际上,这很混乱,所以这就是我所做的!

  • 首先,我构建框架。它们可以位于同一项目中的不同目标,但通常相同的名称会有所帮助。仅对于 iOS,只有一个框架,因此一个目标就足够了。
  • 然后我添加一个“聚合”目标,它将帮助为不同的架构创建多个构建。
  • 单击项目名称,然后单击聚合目标,转到“构建阶段”,然后单击小加号以添加“新运行脚本阶段”。
  • 我将代码复制粘贴到这个GIST 中。
  • 最后,将您的方案更改为聚合目标并构建它将完成您需要的所有合并,最终您将得到一个通用的 .framework。

该脚本相当简单,只要稍微涉猎一下,我相信可以对其进行调整以添加 OSX 支持。我希望这能为您指明正确的方向:)

脚本内容:

#!/bin/sh

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 1. Build Device and Simulator versions
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"

# Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"

# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"

# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"

# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"
Run Code Online (Sandbox Code Playgroud)