【问题标题】:OSX and iOS shared swift moduleOSX 和 iOS 共享 swift 模块
【发布时间】:2015-02-27 02:46:46
【问题描述】:

我创建了名为 TestLib 的基于 swift 的 Cocoa Touch Framework 项目,然后我为 Cocoa Framework 添加了名为 TestLibOSX 的新目标。当我在 iOS 应用程序上使用该框架时,它似乎可以正常工作,但是当我创建 OSX 控制台应用程序时,XCode 抱怨它找不到 TestLibOSX 模块。我错过了什么吗?

P.S This 不一样:)

编辑:似乎这必须是可能的,因为我可以看到 Lister 是这样实现的。

【问题讨论】:

  • 我上周尝试这样做,但反过来(我创建了一个 OS X 框架并添加了一个 iOS 目标),我遇到了 OS X 框架工作的类似问题,但 iOS 框架使用时不断给我错误。我最终将代码移到 Source 文件夹中,然后创建两个单独的项目并将正确的项目包含到我的 Mac 和 iOS 工作区中。
  • @NSArray 是的,这是最极端的情况,我只需要弄清楚 Lister 是如何实现的。我已经下载了源代码,似乎我做的和他们完全一样。
  • 欢迎来到一个充满痛苦、痛苦、愤怒和链接器错误的世界。尤其是在尝试编写控制台应用程序时。但是你可以看看Carthage 是如何配置的,它使用像LlamaKit 这样的框架,同时具有iOS 和OS X 目标。
  • 但是说真的……如果有人要为如何做到这一点做一个分步教程,并注意屏幕截图和陷阱,那么他们会受到很多人的欢迎。
  • @AirspeedVelocity 作为另一种方法,我想我可以让 2 个项目引用相同的源文件。类似github.com/typelift/Basis

标签: ios objective-c xcode macos swift


【解决方案1】:

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

1。更改项目的有效架构和支持的平台。

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

  • Base SDK:我推荐 OS X,但它也适用于 iOS。请注意,以 iOS 作为基础 SDK 时,“My Mac”目标分为 3 个不同的目标。

  • 支持的平台:macosx iphoneos iphonesimulator

  • 有效架构:arm64 armv7 armv7s i386 x86_64

2。更改单元测试包的搜索路径

  • 运行路径搜索路径:$(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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    实际上,这是一团糟,所以这就是我要做的!

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

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多