构建时的iOS App模块化

时间:2015-10-14 15:16:00

标签: ios objective-c xcode build-process

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

如果我设置像

这样的宏
#define FEATURE_1  0

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

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

我尝试了什么:我在某处读到将每个功能都设置为静态库可以完成我的工作,但是,我无法弄清楚如何包含/排除静态图书馆在建设时。此外,它并没有解决我在故事板中分离视图的问题。

具体来说,我的问题是:

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我最终做了什么:

考虑我有两个功能:1和2。

所以我的要求是三种构建

  1. 仅包含功能1的构建。
  2. 仅包含功能2的构建。
  3. 具有1和1特征的构建。 2。
  4. 因此,我将Xcode组中的项目文件划分为:

    1. CommonModule - 此组由两个功能都需要的文件组成。
    2. ModuleOne:此组由功能一所需的文件组成。
    3. ModuleTwo:此组由功能二所需的文件组成。
    4. 我为每个模块遵循的文件夹结构是:

      my folder structure

      最好将项目的文件夹结构保留在磁盘上,类似于该项目的组结构。它可以减少混淆,并且可以将特定文件夹中的所有文件添加到特定组中

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

      1. TargetOneCommonModuleModuleOne组中的文件属于此目标。
      2. TargetTwoCommonModuleModuleTwo组中的文件属于此目标。
      3. TargetAllCommonModuleModuleOneModuleTwo组中的文件属于此目标。
      4. 现在在CommonModule中,我有一个BuildConfig.h文件,其中包含以下宏:

        #define IncludeModuleOne  1
        #define IncludeModuleTwo  1
        

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

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

        通过这种方式,总而言之,我只使用多个目标+配置宏

        包含构建中的require文件

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