我创建了名为Cocoa Touch Framework
的基于swift的TestLib
项目,然后我为名为Cocoa Framework
的{{1}}添加了新目标。当我在iOS应用程序上使用该框架时,似乎没有任何问题,但是当我创建OSX控制台应用程序时,XCode抱怨它无法找到TestLibOSX
模块。我错过了什么吗?
P.S This不一样:)
编辑:似乎必须这样,因为我可以看到Lister以这种方式实现。
答案 0 :(得分:3)
如果您希望创建单个动态框架二进制文件,请执行以下步骤(如http://colemancda.github.io/programming/2015/02/11/universal-ios-osx-framework/中所述):
这应该会改变您的框架和测试单元的有效架构和支持的平台。如果没有,则手动更改它们以继承项目的构建设置。
Base SDK:我推荐OS X,但它也适用于iOS。请注意,使用iOS作为基本SDK,"我的Mac"目标分为3个不同的目标。
支持的平台:macosx iphoneos iphonesimulator
有效架构:arm64 armv7 armv7s i386 x86_64
运行路径搜索路径:$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks
框架搜索路径:$(SDKROOT) $(inherited)
这样您就可以将其导入import MyFramework
而不是
#if os(iOS)
import MyFramework
#else
import MyFrameworkOSX
#endif
答案 1 :(得分:1)
好吧,通用框架真的很痛苦。不仅适用于iOS和OSX,还适用于iOS内部,因为您需要2个框架:一个用于模拟器,一个用于设备。处理iOS的方式是使用" Aggregate"目标。我相信可以利用相同的途径来集成OS X目标。
构建框架时,会得到一个.framework(lego block)文件夹。在那里,有两个非常重要的事情要做:
在这两个地方,您必须具有支持您希望支持的所有体系结构的实现。如果您在哪里单独构建框架并希望将它们融合在一起,则必须执行以下操作:
实际上,这是一团糟,所以我在做什么!
该脚本非常简单,只需稍加试试,我确信可以调整它以添加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}"