【问题标题】:How Do I Create a Development Framework In iOS Including Swift?如何在包括 Swift 的 iOS 中创建开发框架?
【发布时间】:2023-03-21 01:21:01
【问题描述】:

我的目标是创建一个包含 Swift 和 Objective-C 的 iOS 框架,我可以在我的开发项目中使用它。这个框架的本质是框架本身正在发展。所以,每次我使用这个框架构建一个项目时(我将使用框架的项目称为“使用”项目,因为没有更好的术语),我想确保框架本身被重新构建,这一点很重要。我希望这是一个框架,因为我有一些使用应用程序,我想在这些应用程序中使用相同的框架代码。今天我为此苦苦挣扎,并在至少在我看来应该更容易的事情上浪费了很多时间。所以,我将分享我的过程。

【问题讨论】:

    标签: ios swift frameworks xcode6 xcode7


    【解决方案1】:

    Swift 消费者 -> Swift 动态框架

    Xcode 版本 10.2.1

    创建 Swift 框架

    创建框架项目或创建框架目标

    File -> New -> Project... -> Cocoa Touch Framework
    //or
    Project editor -> Add a Target -> Cocoa Touch Framework
    

    将生成两个文件:

    1. Info.plist - Build Settings -> Info.plist File
    2. <product_name>.h - Build Phases -> Headers。是伞头文件[About]

    添加文件.swift

    Select `.swift` file -> Select File Inspectors Tab -> Target Membership -> Select the target
    //or
    Project editor -> select a target -> Build Phases -> Compile Sources -> add files
    

    构建库 - ⌘ 命令 + BProduct -> Build

    注意:确保为与客户端代码相同的流程架构构建框架。

    查找生成的输出[Build location]

    Products group -> <product_name>.framework -> Show in Finder
    

    框架包括

    • Info.plist
    • Modules[About] 文件夹:
      • module.modulemap
      • &lt;product_name&gt;.swiftmodule
        • .swiftdoc
        • .swiftmodule
    • Headers 文件夹:
      • 来自Headers 部分的文件。有公共接口/定义
      • &lt;product_name&gt;-Swift.h - Xcode 生成的头文件[About]

    使用 Swift 框架的 Swift 消费者

    Drag and drop[About]将二进制文件导入Xcode项目

    Embed dynamic binary(或不嵌入 || 链接静态二进制文件)[Link vs Embed] [Library not loaded]

    //Xcode 11
    Project editor -> select a target -> General -> Frameworks, Libraries, and Embedded Content -> path to `<product_name>.framework` -> Embed
    
    //pre Xcode 11
    Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework`
    

    添加Framework Search paths(FRAMEWORK_SEARCH_PATHS)[Module not found][Recursive path]

    Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file
    

    将模块导入Swift客户端代码[module_name]

    import module_name
    

    More examples here

    【讨论】:

      【解决方案2】:

      首先要观察(这肯定不是我的第一个观察!)是你不能在 iOS 下使用静态库来做到这一点。 Xcode 不会让你在静态框架中使用 Swift 试试看。 Xcode 会拒绝你的意愿!

      这是我最终完成的过程。我必须处理的两个主要问题是:(i)使 Xcode 链接到 using 项目中的框架而没有错误,以及(ii)在 using 项目中访问框架的标头。在苹果的开明观点中,这两个问题是分开的。注意讽刺。 ;)。

      1) 使用 Xcode 创建一个Cocoa Touch Framework。我相信这适用于 Xcode6 和 Xcode7。使用:

      文件 > 新建 > 项目 > iOS > 框架和库 > Cocoa Touch 框架

      我碰巧在使用 Xcode7。 (不要创建Cocoa Touch Static Library——就像我上面说的,Xcode 不会让你将 Swift 合并到静态库中)。

      2) 对于您的 Swift 类,确保成员和函数是 public。我没有对此进行过实验,但似乎 public 属性对于框架用户可见的成员和函数是必需的。

      3) 将您想要的任何 Swift 类(和 Objective-C)添加到您的框架中。

      4) 关闭该框架项目。 (同一个项目不能在Xcode中打开两次,接下来需要将框架合并到你使用的项目中)。

      5) 在 Xcode 中打开您正在使用的项目。对我来说,这是一个现有的通用应用程序项目。您可能正在创建一个新的 using 项目。无论如何,将您的框架项目的 .xcodeproj 文件在 Finder 中拖到您正在使用的项目中。

      6) 在您使用的项目中,打开您的框架项目。并将框架文件拖到 Build Phases 中的 Embed Frameworks 中(当我第一次开始实验时,Build Phases 中没有 Embed Frameworks 部分,我还不知道是什么魔法导致它出现!)。

      到目前为止,这些步骤应该使您能够构建和链接,而无需实际集成库代码的使用。 (我在一些测试中使用https://github.com/RadiusNetworks/swift-framework-example)。

      7) 现在是致命一击:在Build Settings 下,搜索Framework Search Paths。并添加:

      ${TARGET_BUILD_DIR}/YourFrameworkName.framework
      

      (您似乎不必将其标记为递归)。

      8) 在您使用框架的 Swift 代码文件中,您需要在每个文件的顶部添加一个导入:

      import YourFrameworkName
      

      您现在应该可以使用新库进行构建和链接了!

      9) 还有一个问题:确保您的框架的Deployment Target 与您的目标项目匹配。例如,如果您使用的项目是为 iOS7 构建的,请确保您的框架是为 iOS7 或更早版本构建的。

      10) 第二个问题 (10/23/15):我刚刚了解到我的框架必须有“App-Swift.h”(我为此使用的名称)作为 Objective-C 生成的接口头文件构建设置中的名称。当我把这个(Objective-C Generated Interface Header)拿出来(试图解决另一个问题)时,我在 App-Swift.h 中遇到了一些有趣的问题。这些问题看起来像: "Cannot find interface declaration for NSObject"?

      11) 第三个问题 (10/29/15):当我尝试将我的第一个应用程序上传到使用此框架的 iTunes Connect 时,我收到了一个上传错误。错误读取:

      错误 ITMS-90206:“无效的捆绑包。捆绑包位于 'Your.app/Frameworks/YourFramework.framework' 包含不允许的文件 '框架'。”

      各种 SO 和其他帖子都遇到了这种错误,对我来说,诀窍是,对于 Framework 目标,在 Build Settings 中,将“Embedded Content Contains Swift Code”设置为 NO。 (我的应用构建设置已经将此标志设置为 NO)。

      已完成大部分步骤的示例项目位于https://github.com/crspybits/CocoaTouchFramework.git

      【讨论】:

      • 将框架的全部 xocdeproject 提供给其他想要使用您的框架的人不是不安全吗?它不会让您的应用对所有人开放吗?
      • “让您的应用对所有人开放”是什么意思?正如我所提到的,这篇文章是在我自己的开发项目的背景下进行的。我没有将我的框架分发给其他存在某种安全或闭源问题的人。
      猜你喜欢
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      相关资源
      最近更新 更多