如何从2个嵌入的不同项目中运行项目

问题描述:

我有两个iOS项目,我希望将其作为单个项目并根据条件一次运行一个项目。如何从2个嵌入的不同项目中运行项目

例如:我有一个名为项目A项目B。我2个项目要嵌入项目A项目B到名为项目C一个单一的项目。 ProjectC将有一个条件取决于我必须运行的条件项目A项目B代码。

注意:运行项目的条件将应用于运行时而不是编译时。

我怀疑这是真的可能吗?我需要关于如何解决这个问题的专业指导。

+0

项目C - 哪个应用程序产生一些性传播疾病的ios哪个通知需要通过的XCode项目被获取,并运行或项目B。对吗?如果我可以对,请提供更详细的为什么它需要? 2个应用程序间的通信我有两个不同的项目 – toohtik

+0

羽翼丰满的项目,我想整合这两个项目,所以我可以使用根据条件。这项目是我与我的要求。 – karthik

+0

项目A和项目B是独立的应用程序,是否正确?这种情况是什么?确定是否在启动时,金的是,这发生在运行时动态(即用户从菜单中选择,或者在即时变更)的期望。后者更困难。 –

好的,基于阅读这个问题并提出一些问题......它真的不清楚为什么关于豆荚的答案得到了这么多票。它不能解决问题。

比方说,我们有现有的ProjectA和ProjectB。 ProjectC尚不存在,但是希望使ProjectC成为A和B的“组合”,A或B将在某种条件下运行。一旦运行,该应用将保持运行该版本,直到重新启动。

两种基本方法是将所有代码和资产合并到ProjectC中,或者尝试制作您加载的A和B框架。但是,无论使用哪种方案,您都需要对代码库进行调整。你需要做的工作量也是项目复杂程度的副产品。

我参与过一个项目,我们已经成功地为大型应用程序做了你想做的事情。我们通过参加我们的iPhone和iPad项目,结合代码/资产,实质上制作了一个“通用应用程序”。我们在运行时“推出”了适当的版本。

在你做出这样的努力之前,你需要权衡后果。我会列举一些。

  • 如果您有A/B依赖捆绑ID,您将遇到问题。 ProjectC将拥有它自己的包ID。例如,是否有任何第三方API(例如Facebook)在您想要使用它们并且看起来像ProjectA或ProjectB的地方?如果是,但它们绑定到捆绑ID,则会出现问题。
  • 如果您使用IAP,您的产品ID将需要不同。所以很显然,如果这些产品ID是硬编码的,A和B中的代码将需要更改。如果它们是服务器驱动的,则需要确保服务器代码并实际提供正确的产品ID。如果期望ProjectA的所有者应该仍然拥有ProjectC的IAP,那么这是可能的......但是,需要花费您的大小上的服务器端逻辑来进行管理。
  • 调试代码时需要多少努力?
  • ProjectA和ProjectB仍在积极发展中吗?这样做可能会使这些项目非常难以维护。
  • 为此需要多少时间?这样做很繁琐,需要时间。

你可能会得到更多的成功A和B的源/资产组合为C.在你不会将增加对项目文件或B到C.为什么换句话说?因为您需要能够轻松识别所有冲突点,然后提供解决方法。冲突的一个简单示例是AppDelegate,这是项目默认创建的项目。你会有3个(A,B,C)。

请记住,所有的方法都充满了问题。如果您使用框架(无论它们是否为Pod),并且您决定将资产放入框架包中,则必须更改代码以访问它们,因为它们不再位于mainBundle中。

好的,一般准则是什么?

  • 选择一种方法(如组合或框架)。我将讨论联合。
  • 预先确定您的冲突。对于每种类型的冲突来确定你的策略。例如,要解决AppDelegate,您可以始终使用ProjectAAppDelegateProjectBAppDelegate
  • 检查Info.plist。这是其他冲突的一个很好的来源。 C的Info.plist将是两者的组合。
  • 想出一个你将如何处理冲突的策略。例如,我们有一个命名约定,当我们有类名冲突时我们会使用这个约定。
  • 将您的ProjectA和ProjectC源代码/资产添加到Project C.开始修复冲突。
  • 喝了很多咖啡。

您需要控制的其他关键事项之一是您根据决定进入的关键点。如果你能在main.m调用UIApplicationMain决定之前,你可以这样做:

Class appDelegate; 

    if (runA) { 
     appDelegate = [ProjectAAppDelegate class]; 
    } else { 
     appDelegate = [ProjectBAppDelegate class]; 

    } 

    return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegate)); 

如果不工作,那么你就必须做到这一点的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions。你可能会想,然后有项目C的AppDelegate的是A和B.代理例如:

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    [self.projectAppDelegate applicationDidBecomeActive:application]; 
} 

其中projectAppDelegate设为您需要正确的版本。

请注意,您还需要手动加载故事板以确保启动了正确的故事板。请记住,如果您在加载期间花费了大量时间做出决定(您说这是网络电话),则可以启动您的应用程序。

您可能能够找到一些漂亮的动态加载,如果它们是框架,可以做,但关键应该是可维护性/易于调试。

我打算在这里停下来,主要是因为有很多不同的事情要做,我真的没有时间把它们写出来。

Additional info based on follow up question 

几率很高,你会有一些文件的重复。我举了AppDelegate的例子。 enum会较不频繁,但会发生。还要记住,它不是您关心的文件名,而是您关心的类或其他定义的数据类型。这些是与编译器/链接器有关的冲突。

例如说:

项目A:

typedef NS_ENUM(NSInteger, State) {}

项目B:

typedef NS_ENUM(NSInteger, State) {}

这正是我的意思大概提前有策略。实施例策略:

  1. 项目A是“中奖”,因此只有项目B将具有变化
  2. 项目B是“中奖”,因此只有项目A将有变化
  3. 两个项目A和项目B将有变化。

因此,对于1,其结果必然是

项目A:

typedef NS_ENUM(NSInteger, State) {}

项目B:

typedef NS_ENUM(NSInteger, PBState) {}

注意什么,我确实听到。为了让我的生活更轻松,我使用了一些预定义的前缀来指定它是ProjectB。在这种情况下PB。对于

2: 项目:

typedef NS_ENUM(NSInteger, PAState) {}

项目B:

typedef NS_ENUM(NSInteger, State) {}

为3: 项目:

typedef NS_ENUM(NSInteger, PAState) {}

项目B:

typedef NS_ENUM(NSInteger, PBState) {}

这将是由你来制定规则,一致的目标。 你需要为你将如何解决所有的数据类型变化的策略。例如,如果你是从State去 - >PBState,很明显,你只需要修改项目B。这是在你自己的项目中提供帮助的地方。但是,你可以使用Xcode的Search Scope,以帮助控制这种情况。哦

一些其他的事情。

在锋线上,投资上的脚本来查找项目和项目B的所有重复的文件。基本上你需要做的,基于项目find项目B和扩展你需要(如.M,.H,的.xib等)。这将给你一个潜在的候选人名单,并从那里你可以制定规则的战略。

因为我是这并在这部分项目的傻逼,我在一个文本文件中不停地基本上这个名单。当我巩固了文件,并将其移动到文件中的一个不同的部分(由几个换行分隔)。有几种方法进行会计核算,它只是我选择的方法。

我也将确保你有一个像合并阿拉沙(这是我用的)一个很好的比较工具。

另外,还要频繁快照,以防万一。你可以使用git分支。我经常复制当前的目录,以便稍后根据需要区分它们。所以

+0

感谢您对我的问题给出详细解答的努力。我将遵循上面列出的准则。我必须说这个答案给了我很好的澄清我的问题。我只是再澄清一次,你是否遇到过问题如果项目A和项目B具有相同的文件名或枚举结构,则可以使用枚举和文件复制。可以给出关于如何处理该部分的建议。 – karthik

+0

@karthik我在答案中添加了更多信息。希望能够回答它。我建议你与你的团队讨论警告,以便每个人都了解风险。 –

+0

当然,谢谢你,我会按照你的建议。 – karthik

我建议您创建pod并调用您的项目,您可以根据场景/用例调用它,就像这样,您可以在pod中保留任意数量的项目。您可以参考link

另一种方式是保持在同一路径的两个项目,建立动态的框架,并使用这些引用到项目“C”我的意思是,你正计划

的方法中的任何一个应该解决的新项目中的问题。

+0

根据我的知识,可可豆荚被用作依赖管理器,它可以用来下载和链接第三方框架,我不确定这是如何解决我的问题的。你可以用至少一种方法详细说明你的答案。 – karthik