OSX和iOS共享swift模块

时间:2014-12-30 23:06:20

标签: ios objective-c xcode macos swift

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

P.S This不一样:)

编辑:似乎必须这样,因为我可以看到Lister以这种方式实现。

2 个答案:

答案 0 :(得分:3)

如果您希望创建单个动态框架二进制文件,请执行以下步骤(如http://colemancda.github.io/programming/2015/02/11/universal-ios-osx-framework/中所述):

1。更改项目的有效体系结构和支持的平台。

这应该会改变您的框架和测试单元的有效架构和支持的平台。如果没有,则手动更改它们以继承项目的构建设置。

Step One

  • Base SDK:我推荐OS X,但它也适用于iOS。请注意,使用iOS作为基本SDK,"我的Mac"目标分为3个不同的目标。

  • 支持的平台:macosx iphoneos iphonesimulator

  • 有效架构:arm64 armv7 armv7s i386 x86_64

2。更改单元测试包

的搜索路径

Step Two

  • 运行路径搜索路径:$(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)文件夹。在那里,有两个非常重要的事情要做:

  1. "可执行文件"文件
  2. "模块"夹
  3. 在这两个地方,您必须具有支持您希望支持的所有体系结构的实现。如果您在哪里单独构建框架并希望将它们融合在一起,则必须执行以下操作:

    1. 将两个可执行文件合并为" lipo"命令。
    2. 确保两个"模块"中的所有文件文件夹正在移动 在一起。
    3. 实际上,这是一团糟,所以我在做什么!

      • 首先我构建框架。他们可以在不同的目标 相同的项目,但通常,相同的名称有帮助。仅对于iOS,只有一个框架,因此一个目标就足够了。
      • 然后我添加一个" Aggregate"目标,它将有助于为不同的架构创建多个构建。
      • 点击项目名称然后点击Aggregate目标,我转到" Build Phases"然后单击小加号以添加"新运行脚本阶段"。
      • 我在this 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}"