如何从2个嵌入的不同项目中运行项目
我有两个iOS项目,我希望将其作为单个项目并根据条件一次运行一个项目。如何从2个嵌入的不同项目中运行项目
例如:我有一个名为项目A和项目B。我2个项目要嵌入项目A和项目B到名为项目C一个单一的项目。 ProjectC将有一个条件取决于我必须运行的条件项目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
,您可以始终使用ProjectAAppDelegate
和ProjectBAppDelegate
。 - 检查
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) {}
这正是我的意思大概提前有策略。实施例策略:
- 项目A是“中奖”,因此只有项目B将具有变化
- 项目B是“中奖”,因此只有项目A将有变化
- 两个项目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分支。我经常复制当前的目录,以便稍后根据需要区分它们。所以
项目C - 哪个应用程序产生一些性传播疾病的ios哪个通知需要通过的XCode项目被获取,并运行或项目B。对吗?如果我可以对,请提供更详细的为什么它需要? 2个应用程序间的通信我有两个不同的项目 – toohtik
羽翼丰满的项目,我想整合这两个项目,所以我可以使用根据条件。这项目是我与我的要求。 – karthik
项目A和项目B是独立的应用程序,是否正确?这种情况是什么?确定是否在启动时,金的是,这发生在运行时动态(即用户从菜单中选择,或者在即时变更)的期望。后者更困难。 –