【问题标题】:Sharing code between original iOS App and App Extension在原始 iOS App 和 App Extension 之间共享代码
【发布时间】:2015-05-02 01:32:22
【问题描述】:

iOS 应用和扩展应用之间的共享类

我想在我的应用和扩展应用中都使用自定义类。如果我只是在主应用程序文件夹中有该类,则扩展程序不会使用它。我尝试复制它并将其放入扩展文件夹中,但我当然会收到invalid redeclaration of [my class] 错误。什么是最好的解决方案?它只是一个类,而不是多个资源。

【问题讨论】:

    标签: ios xcode ios-app-extension ios8-extension


    【解决方案1】:

    不应复制任何内容。只需添加所需的文件即可为您的扩展程序编译源代码:

    【讨论】:

    • 谢谢!这看起来很棒!这与创建框架相比如何?
    • @RubenMartinezJr。创建框架不会分别为每个目标构建您的类。但会执行一次并链接到每个目标。
    • @RubenMartinezJr。绝不。您将只在应用程序和扩展程序之间共享代码。它们将被单独编译。因此,例如,您可以使用 #ifdef SOME_EXTENSION_FLAG ... #endif 在 App 或扩展编译期间禁用部分代码。
    • 这个解决方案和框架之间的缺点是编译后的类将同时包含app 和appex 扩展名,因此增加了 IPA 文件的整体大小,因为存在重复.使用动态框架您将无法支持 iOS7,但如果您仅针对 iOS8 构建产品,这是一种更好的方法,因为应用程序和扩展程序都将与同一个框架进行通信。
    • 似乎如果我在编译源中包含 ClassA.m 并且 ClassA 依赖于 ClassB 和 ClassC,我还需要包含 ClassB.m 和 ClassC.m。如果 ClassB 和 ClassC 作为回报具有依赖关系等等,这可能会变得非常疯狂。任何有解决此问题的方法或谁能告诉我我是否遗漏了什么?谢谢!
    【解决方案2】:

    只需确保您要共享的文件在 Target Membership 部分中打勾即可。

    选择您的文件,打开右侧的实用程序面板,然后在Target Membership下勾选相应的目标。

    【讨论】:

    • 只是为了提供更多的洞察力,以这种方式进行还会自动将类添加到Compile Sources 下的Build Phases。
    • 这就是我所缺少的,它真的很简单。
    • 是的,但与添加到 CompileSources 相比,它更直接
    【解决方案3】:

    嵌入式框架是在应用程序和扩展程序之间重用代码的好方法。将部分代码移至嵌入式框架后,我们将有机会围绕它编写一些单元测试。

    参见使用嵌入式框架共享代码部分 https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

    【讨论】:

      【解决方案4】:

      应用扩展(小部件,今天)

      App Extension - 来自 iOS v8 - 是一个 packaged bundle,它使用与 Containing App 不同的进程,并且可以与 Host App 通信。它具有.appex 文件扩展名,位于PlugIns 文件夹中。类似于 CXTests[About]

      应用打包包

      SpeedWidgetExtension.appex - 应用程序扩展包

      • 共享数据 - 使用App Group[About]
      • 分享代码
        • Target Membership - 最简单的方法或适用于 iOS v8 之前的版本,它允许您将文件添加到每个目标中。它增加了包的占用空间,因为该文件将为每个目标重复

        • Framework - 用于分组/重用代码的模块

          • Embedded framework aka Dynamic framework - 共享通用代码库的最合适方式。请注意,对于使用Embedded framework,您应该只将其嵌入Containing App(并且不要将此框架添加到App Extension。如果您包含框架并且对于App Extension,它将具有App Extension bundle 中的相同框架 - 框架将被复制)。有可能是因为@prath[About]
          //App Extension
          LD_RUNPATH_SEARCH_PATHS = @executable_path/../../Frameworks
          //It means that App Extension can uses Dynamic framework from Containing app
          
          • Static Framework - 将代码链接到可执行二进制文件。您只能为Containing App 链接库

      [iOS extensions]
      [Vocabulary]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 2022-10-04
        • 1970-01-01
        • 2011-04-02
        • 2018-08-01
        相关资源
        最近更新 更多