iOS 构建时应用程序模块化

iOS App modularization at build time

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

如果我设置一个像

这样的宏
#define FEATURE_1  0

那么,对于剩余的三个功能,主屏幕将只有 3 个磁贴。此外,与 feature-1 相关的文件不应在生成的 .ipa 中编译。

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

我试过的方法:我在某处读到,将每个功能制作成静态库就可以完成我的工作,但是,我不知道如何 include/exclude 构建时的静态库。而且,它没有解决我在故事板中分离视图的问题。

具体来说,我的问题是:

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

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

回答 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 中,将存储视图

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

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

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

中似乎更容易
#if FEATURE_1
...
#endif

要隐藏视图,您可以使用

行中的代码
#if !FEATURE_1
    feature1View.hidden = YES;
#endif

具体取决于您要实现的目标。

我最后做了什么:

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

所以我的要求是三种构建

  1. 只有功能 1 的版本。
  2. 只有功能 2 的版本。
  3. 同时具有功能 1 和 2 的版本。

因此,我将项目文件分为 Xcode 组为:

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

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

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

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

  1. TargetOne : CommonModuleModuleOne 组中的文件属于此目标。
  2. TargetTwo : CommonModuleModuleTwo 组中的文件属于此目标。
  3. TargetAll : CommonModuleModuleOneModuleTwo 组中的文件属于此目标。

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

#define IncludeModuleOne  1
#define IncludeModuleTwo  1

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

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

这样,总而言之,我在构建中只包含需要的文件,同时使用多个目标+配置宏

我很快将在 GitHub 上分享一个 link 到我的示例项目。我希望它能帮助有类似需求的人。 谢谢 !