【问题标题】:iOS App modularization at build timeiOS App 构建时的模块化
【发布时间】:2016-01-12 18:31:26
【问题描述】:

我的应用程序主屏幕原型如下: 考虑到这个主屏幕,我必须以这样一种方式开发应用程序,即这四个功能中的每个功能都应该在构建时可插入。 例如,

如果我设置像

这样的宏
#define FEATURE_1  0

然后,主屏幕将只有 3 个图块用于其余三个功能。此外,与 feature-1 相关的文件不应在生成的 .ipa 中编译。

当我开发这四个模块时,我让所有的类相互独立。但问题是我有一个包含整个 UI 的故事板。 现在,我必须以这样一种方式分离 UI 和资源,即如果关闭任何功能,则不应编译与该功能相关的文件。

我尝试过的内容:我在某处读到,将每个功能作为静态库来完成我的工作,但是,我不知道如何在建造时间。此外,它并没有解决我在故事板中分离视图的问题。

具体来说,我的问题是:

1) 如何根据上面定义的宏将特定文件复制到我的项目中并省略特定文件?如果可能的话,请指导我找到一个好的方法。

2) 如何分离故事板上的视图?可以定义多个故事板并在构建时包含所需的故事板吗? 请指导。

【问题讨论】:

  • 只是不要使用情节提要。使用 NIB 没什么大不了的
  • 如果你的视图像你画的那样简单 -> 你可以通过编程来完成
  • 你为什么要这样做?
  • @BradThomas 我有一个包含大量代码库的应用程序。我正在尝试对其进行模块化。我只想复制和编译必要的文件,以便生成的 ipa 相对较小..
  • 通常代码不是文件大小的问题,而是图像等资源的问题。你能把它们模块化吗?

标签: ios objective-c xcode build-process


【解决方案1】:

1 的答案:你不能只使用宏。

为您的不同配置创建多个目标,定义每个目标所需的宏,并切换文件包含复选框以在构建期间仅包含所需的文件。

【讨论】:

  • 我可以编写一个脚本来切换构建过程中要包含/排除的文件吗...?如果是,你能指导我举个例子吗?
  • 老实说,我不知道。我想是的……但这很复杂。这是 xCode 构建系统文档的链接:developer.apple.com/legacy/library/documentation/DeveloperTools/…
  • 你确定你有正确的方法。只是想知道……如果您需要一种插件系统,为什么不创建在构建时包含的插件库,而不是处理宏和复杂的条件构建阶段?
  • 最后,您的视图的代码大小是否证明您必须从项目中完全删除它?就不能只是未使用的代码吗?
【解决方案2】:

虽然您可以使用构建系统,但在您的情况下,将受影响的代码包装在中似乎更容易

#if FEATURE_1
...
#endif

为了隐藏视图,您可以使用代码行

#if !FEATURE_1
    feature1View.hidden = YES;
#endif

取决于你想要达到的目标。

【讨论】:

    【解决方案3】:

    回答 2 。使用 UICollectionView,或在您的 XIB 中使用 4 个视图并使用此方法

    -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self){
    //        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"--name of xibs--" owner:nil options:nil];
    //        self = [nibArray objectAtIndex:0];
        }
        return self;
    }
    

    在 nibArray 中,视图将被存储

    【讨论】:

      【解决方案4】:

      我最终做了什么:

      假设我有两个特征:1 和 2。

      所以我的要求是制作三种构建

      1. 只有功能 1 的构建。
      2. 只有功能 2 的构建。
      3. 同时具有功能 1 和 2 的构建。

      所以,我将项目文件在 Xcode 组中划分为:

      1. CommonModule – 该组包含两个功能都需要的文件。
      2. ModuleOne :该组由功能一所需的文件组成。
      3. ModuleTwo :该组包含功能 2 所需的文件。

      我为每个模块遵循的文件夹结构是:

      最好保持磁盘上项目的文件夹结构与该项目的组结构相似。它减少了混乱,将特定文件夹中的所有文件添加到特定组成为可能

      现在我定义了三个目标,对应于我上面列出的三种构建类型。

      1. TargetOneCommonModuleModuleOne 组中的文件属于此目标。
      2. TargetTwoCommonModuleModuleTwo 组中的文件属于此目标。
      3. TargetAllCommonModuleModuleOneModuleTwo 组中的文件属于此目标。

      现在在 CommonModule 中,我有一个 BuildConfig.h 文件,其中包含如下宏:

      #define IncludeModuleOne  1
      #define IncludeModuleTwo  1
      

      因此,在构建时,请选择适当的目标并适当地切换上述开关以获得正确的构建。

      现在在InitialViewController.m 中,我检查了开关值,并根据这些值显示/隐藏了该特定功能的菜单选项。

      这样,总结一下,我只在构建中包含了require文件,并使用了多个目标+配置宏一起

      我很快会在 GitHub 上分享我的示例项目的链接。我希望它会帮助有类似要求的人。 谢谢 !

      【讨论】:

        猜你喜欢
        • 2020-01-16
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 2016-09-25
        • 2016-12-07
        • 1970-01-01
        • 2013-11-24
        • 2018-08-29
        相关资源
        最近更新 更多