Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从两个嵌入的不同项目中运行一个项目_Ios_Iphone_Ios7 - Fatal编程技术网

Ios 如何从两个嵌入的不同项目中运行一个项目

Ios 如何从两个嵌入的不同项目中运行一个项目,ios,iphone,ios7,Ios,Iphone,Ios7,我有两个iOS项目,我想将其作为一个项目,并根据条件一次运行一个项目 例如:我有两个名为ProjectA和ProjectB的项目。我想将ProjectA和ProjectB嵌入一个名为ProjectC的项目中。 ProjectC将有一个条件,这取决于我必须运行projectA或ProjectB代码的条件 注意:运行项目的条件将在运行时而不是编译时应用 我怀疑这真的可能吗?我需要关于如何解决这个问题的专业指导。我建议您创建pod并调用您的项目,您可以根据场景/用例调用它,就像这样,您可以在pod中保

我有两个iOS项目,我想将其作为一个项目,并根据条件一次运行一个项目

例如:我有两个名为ProjectA和ProjectB的项目。我想将ProjectA和ProjectB嵌入一个名为ProjectC的项目中。 ProjectC将有一个条件,这取决于我必须运行projectA或ProjectB代码的条件

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


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

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

你可以参考这个

另一种方法是保持两个项目在同一条路径上,创建动态框架,并将这些引用用于项目“C”,我指的是您正在计划的新项目


任何一种方法都可以解决您的问题。

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

你可以参考这个

另一种方法是保持两个项目在同一条路径上,创建动态框架,并将这些引用用于项目“C”,我指的是您正在计划的新项目


任何一种方法都可以解决您的问题。

好的,在阅读问题并提出一些问题的基础上。。。我真的不明白为什么关于pods的答案获得了这么多选票。这并不能解决问题

假设我们有现有的ProjectA和ProjectB。ProjectC还不存在,但我们希望ProjectC是a和B的组合,其中a或B将根据某些条件运行。一旦运行,应用程序将一直运行该版本,直到重新启动

两种基本方法是要么将所有代码和资产组合到ProjectC中,要么尝试创建加载的A和B框架。然而,在任何一种情况下,您都必须对代码库进行调整。你需要做的工作量也是项目复杂程度的副产品

我曾参与过一个项目,我们成功地为一个大型应用程序实现了您的愿望。我们通过将iPhone和iPad项目,结合代码/资产,基本上制作了一个通用应用程序。我们在运行时启动了相应的版本

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

如果A/B依赖于bundle id,则会出现问题。ProjectC将拥有自己的捆绑id。例如,是否有任何第三方API(如Facebook)在使用,而您仍希望使用它们,并且看起来像ProjectA或ProjectB?如果是,但它们与bundle id绑定,则会出现问题。 如果您使用IAP,您的产品ID将需要不同。因此,如果这些产品ID是硬编码的,那么A和B中的代码显然需要更改。如果它们是服务器驱动的,则需要确保服务器代码,并实际提供正确的产品ID。如果期望ProjectA的所有者仍然拥有ProjectC的IAP,这是可能的。。。然而,成本来自于需要服务器端逻辑来管理这一点。 调试代码时需要付出多少努力? ProjectA和ProjectB是否仍在积极开发中?这样做可能会使这些项目很难在以后进行维护。 为此将预留多少时间?这样做既乏味又耗时。 将A和B的源/资产合并到C中可能会更成功。换句话说,您不会将A或B的项目文件添加到C中。为什么?因为您需要能够轻松识别所有冲突点,然后提供解决方案。一个简单的冲突示例是AppDelegate,这是project默认创建的。你会有三个A,B,C

请记住,所有方法都充满了问题。如果您选择框架,不管它们是否是pod,并且您决定将资产放入框架捆绑包中,那么您必须更改代码以访问它们,因为它们不再位于mainBundle中

好的,一般的指导方针是什么

选择一种方法,如组合或框架。我要讨论联合收割机。 提前确定尽可能多的冲突。针对每种类型的冲突,确定您的策略。例如,要解决AppDelegate问题,您可以始终执行ProjectAAppDelegate和ProjectBAppDelegate。 检查Info.plist。这是其他冲突的良好来源。C的Info.plist将是这两者的组合。 提出一个你将如何处理冲突的策略。例如,我们有一个命名约定,当类名发生冲突时,我们会使用它。 将您的ProjectA和ProjectC源代码/资产添加到ProjectC中。开始修复 冲突。 多喝咖啡。 你需要控制的另一个关键因素是基于决策的切入点。如果您可以在main.m中调用UIApplicationMain之前做出决定,您可以执行以下操作:

    Class appDelegate;

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

    }

    return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegate));
如果这不起作用,那么您必须在-BOOLapplication:UIApplication*application didnishlaunchingwithoptions:NSDictionary*launchOptions中执行此操作。然后,您可能希望让Project 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的例子。枚举将不太频繁,但会发生。请记住,您关心的不是文件名,而是类或其他定义的数据类型。这些冲突对编译器/链接器很重要

比如说:

项目A:

typedef NS_ENUMNSInteger,状态{}

项目B:

typedef NS_ENUMNSInteger,状态{}

这就是我所说的提前制定战略的意思。示例战略:

ProjectA是赢家,因此只有ProjectB会有变化 ProjectB是赢家,因此只有ProjectA会有变化 项目A和项目B都会有变化。 所以对于1,结果是

项目A:

typedef NS_ENUMNSInteger,状态{}

项目B:

typedef NS_enumninteger,PBState{}

注意我听到的。为了让我的生活更轻松,我使用了一些预定义的前缀来指定它为ProjectB。在本例中为PB

对于2: 项目A:

typedef NS_ENUMNSInteger,PAState{}

项目B:

typedef NS_ENUMNSInteger,状态{}

对于3: 项目A:

typedef NS_ENUMNSInteger,PAState{}

项目B:

typedef NS_enumninteger,PBState{}

这将由你来制定规则,但要始终如一。 您将需要一个解决所有数据类型更改的策略。例如,如果您从State->PBState开始,您显然只想修改ProjectB。在这里,把它放在自己的项目中会有所帮助。但是,您可以使用Xcode的搜索范围来帮助控制这一点

哦,还有别的事

首先,投资一个脚本来查找ProjectA和ProjectB中的所有重复文件。基本上,您需要根据所需的扩展(例如,.m、.h、.xib等)查找ProjectA和ProjectB。这将为您提供一个潜在候选人列表,您可以从中制定规则

由于我是做这部分项目的傻瓜,我基本上把这个列表保存在一个文本文件中。当我合并文件时,我将其移动到一个不同的部分,该部分由文件中的几个换行分隔。有不同的方式做会计对它来说,这只是我选择的方法

我还要确保你有一个很好的diff工具,比如我使用的Araxis Merge


另外,经常拍快照以防万一。您可以使用git分支。我经常只是复制实际的目录,以便以后需要时可以对它们进行区分。

好的,基于阅读问题和提出一些问题。。。我真的不明白为什么关于pods的答案获得了这么多选票。这并不能解决问题

假设我们有现有的ProjectA和ProjectB。ProjectC还不存在,但我们希望ProjectC是a和B的组合,其中a或B将根据某些条件运行。一旦运行,应用程序将一直运行该版本,直到重新启动

两种基本方法是要么将所有代码和资产组合到ProjectC中,要么尝试创建加载的A和B框架。然而,在任何一种情况下,您都必须对代码库进行调整。你需要做的工作量也是项目复杂程度的副产品

我曾参与过一个项目,我们成功地为一个大型应用程序实现了您的愿望。我们通过将iPhone和iPad项目,结合代码/资产,基本上制作了一个通用应用程序。我们在运行时启动了相应的版本

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

如果A/B依赖于bundle id,则会出现问题。ProjectC将有自己的bundle id。例如,是否有任何第三方API(如Facebook)在使用中,您希望仍然使用它们并看起来像l ike ProjectA还是ProjectB?如果是,但它们与bundle id绑定,则会出现问题。 如果您使用IAP,您的产品ID将需要不同。因此,如果这些产品ID是硬编码的,那么A和B中的代码显然需要更改。如果它们是服务器驱动的,则需要确保服务器代码,并实际提供正确的产品ID。如果期望ProjectA的所有者仍然拥有ProjectC的IAP,这是可能的。。。然而,成本来自于需要服务器端逻辑来管理这一点。 调试代码时需要付出多少努力? ProjectA和ProjectB是否仍在积极开发中?这样做可能会使这些项目很难在以后进行维护。 为此将预留多少时间?这样做既乏味又耗时。 将A和B的源/资产合并到C中可能会更成功。换句话说,您不会将A或B的项目文件添加到C中。为什么?因为您需要能够轻松识别所有冲突点,然后提供解决方案。一个简单的冲突示例是AppDelegate,这是project默认创建的。你会有三个A,B,C

请记住,所有方法都充满了问题。如果您选择框架,不管它们是否是pod,并且您决定将资产放入框架捆绑包中,那么您必须更改代码以访问它们,因为它们不再位于mainBundle中

好的,一般的指导方针是什么

选择一种方法,如组合或框架。我要讨论联合收割机。 提前确定尽可能多的冲突。针对每种类型的冲突,确定您的策略。例如,要解决AppDelegate问题,您可以始终执行ProjectAAppDelegate和ProjectBAppDelegate。 检查Info.plist。这是其他冲突的良好来源。C的Info.plist将是这两者的组合。 提出一个你将如何处理冲突的策略。例如,我们有一个命名约定,当类名发生冲突时,我们会使用它。 将您的ProjectA和ProjectC源代码/资产添加到ProjectC中。开始修复冲突。 多喝咖啡。 你需要控制的另一个关键因素是基于决策的切入点。如果您可以在main.m中调用UIApplicationMain之前做出决定,您可以执行以下操作:

    Class appDelegate;

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

    }

    return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegate));
如果这不起作用,那么您必须在-BOOLapplication:UIApplication*application didnishlaunchingwithoptions:NSDictionary*launchOptions中执行此操作。然后,您可能希望让Project 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的例子。枚举将不太频繁,但会发生。请记住,您关心的不是文件名,而是类或其他定义的数据类型。这些冲突对编译器/链接器很重要

比如说:

项目A:

typedef NS_ENUMNSInteger,状态{}

项目B:

typedef NS_ENUMNSInteger,状态{}

这就是我所说的提前制定战略的意思。示例战略:

ProjectA是赢家,因此只有ProjectB会有变化 ProjectB是赢家,因此只有ProjectA会有变化 项目A和项目B都会有变化。 所以对于1,结果是

项目A:

typedef NS_ENUMNSInteger,状态{}

项目B:

typedef NS_enumninteger,PBState{}

注意我听到的。为了让我的生活更轻松,我使用了一些预定义的前缀来指定它为ProjectB。在本例中为PB

对于2: 项目A:

typedef NS_ENUMNSInteger,PAState{}

项目B:

typedef NS_ENUMNSInteger,状态{}

对于3: 项目A:

typedef NS_ENUMNSInteger,PAState{}

项目B:

typedef NS_enumninteger,PBState{}

这将由你来制定规则,但要始终如一。 您将需要一个解决所有数据类型更改的策略。例如,如果您从State->PBState开始,您显然只想修改ProjectB。在这里,把它放在自己的项目中会有所帮助。但是,您可以使用Xcode的搜索范围来帮助控制这一点

哦,还有别的事

首先,投资一个脚本,在Pro中查找所有重复文件 项目A和项目B。基本上,您需要根据所需的扩展(例如,.m、.h、.xib等)查找ProjectA和ProjectB。这将为您提供一个潜在候选人列表,您可以从中制定规则

由于我是做这部分项目的傻瓜,我基本上把这个列表保存在一个文本文件中。当我合并文件时,我将其移动到一个不同的部分,该部分由文件中的几个换行分隔。有不同的方式做会计对它来说,这只是我选择的方法

我还要确保你有一个很好的diff工具,比如我使用的Araxis Merge



另外,经常拍快照以防万一。您可以使用git分支。我经常只是复制实际的目录,以便以后需要时可以对它们进行区分。

so ProjectC——它的ios应用程序生成一些通知,这些通知需要被XCode捕获并运行projectA或ProjectB。正当如果我是对的,你能提供更多的细节为什么需要它吗?两个应用程序之间的通信?我有两个不同的项目完整的项目,我想集成这两个项目,以便根据条件使用该项目。这是我的一个要求。项目a和项目B是独立的应用程序,对吗?这是什么情况?它是在启动时确定的,还是在运行时动态发生的预期,即用户从菜单中选择或动态更改它。后者更难。@MobileBen,它发生在运行时。这并不能真正回答我的问题。运行时的时间是很重要的。如果它只是在发射前关闭,那么方法就大不相同了。我不清楚为什么当前的答案被如此高估。它真的没有回答这个问题,所以ProjectC——它的ios应用程序生成一些通知,这些通知需要被XCode捕获并运行projectA或ProjectB。正当如果我是对的,你能提供更多的细节为什么需要它吗?两个应用程序之间的通信?我有两个不同的项目完整的项目,我想集成这两个项目,以便根据条件使用该项目。这是我的一个要求。项目a和项目B是独立的应用程序,对吗?这是什么情况?它是在启动时确定的,还是在运行时动态发生的预期,即用户从菜单中选择或动态更改它。后者更难。@MobileBen,它发生在运行时。这并不能真正回答我的问题。运行时的时间是很重要的。如果它只是在发射前关闭,那么方法就大不相同了。我不清楚为什么当前的答案被如此高估。它真的没有回答这个问题。据我所知,cocoa pods用作依赖关系管理器,可用于下载和链接第三方框架,我不确定这如何解决我的问题。请您至少用一种方法详细说明您的答案。据我所知,cocoa pods用作依赖关系管理器,可用于下载和链接第三方框架,我不确定这如何解决我的问题。请您至少用一种方法详细说明您的答案。感谢您为详细回答我的问题所做的努力。我将遵循您上面列出的指导原则。我必须说,这个答案给了我很好的澄清关于我的问题。我只想再澄清一点,当项目A和项目B具有相同的文件名或枚举结构时,您是否遇到了枚举和文件复制问题。您能否就如何处理该部分给出建议。@karthik我在回答中添加了更多信息。希望这能回答这个问题。我建议您与您的团队讨论警告,以便每个人都了解风险。这个答案不仅广泛,而且正确。我也不知道pods的答案是如何获得如此多的赞成票的,它只是没有解决这个问题。干得好,@karthik。你应该得到赏金。感谢你对我的问题给出详细的回答。我将遵循你上面列出的指导原则。我必须说,这个回答很好地澄清了我的问题。我还有一个澄清,当项目A和项目B具有相同的文件名或枚举结构时,您是否遇到枚举和文件复制问题。您能否就如何处理该部分给出建议。@karthik我在回答中添加了更多信息。希望这能回答这个问题。我建议您与您的团队讨论警告,以便每个人都了解风险。这个答案不仅广泛,而且正确。我也不知道pods的答案是如何获得如此多的赞成票的,它只是没有解决这个问题。干得好,@karthik。你应该得到赏金。