在原始 iOS 应用和应用扩展之间共享代码

Sharing code between original iOS App and App Extension

在 iOS 应用和扩展应用之间共享 class

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

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

只需确保要共享的文件在 目标成员 部分打勾。

Select你的文件,打开右边的工具面板,在Target Membership.

下勾选合适的目标

嵌入式框架是在应用程序和扩展之间重用代码的好方法。将一些代码移动到嵌入式框架将为我们提供一个很好的机会来围绕它编写一些单元测试。

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

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

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

应用打包包

SpeedWidgetExtension.appex - 应用程序扩展包

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

    • Framework - grouping/reusing 代码

      的模块
      • Embedded framework 又名 Dynamic framework - 共享通用代码库的最合适方式。请注意,要使用 Embedded framework,您应该仅将其嵌入 Containing App(并且 不要App Extension 中添加此框架。如果您包含框架对于 App Extension 它将在 App Extension 包中具有相同的框架 - 框架将被复制)。有可能是因为@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 - link 可执行二进制代码。您可以 link 库仅供 Containing App


[Vocabulary]