我有一个项目,我需要从一个基本应用程序中构建一些应用程序。 对于“子应用程序”,它会更改应用程序的API凭证,字体,大小,颜色和一些功能。
所以我改变了我的应用程序,我可以轻松添加功能,更改颜色,...通过更改简单的字符串常量来更快地构建新的应用程序。
我认为最好的解决方案是向此XCode项目添加多个目标,并使用条件编译器标志设置应用程序的各个设置
#ifdef AppTarget1
qr_reader = YES;
#endif
但问题是,将来可以使用多个版本的Framework。因此,当基于旧框架更新应用程序时,我们总是必须进行调整以使用新版本的框架(如果有的话),并且我们无法控制框架版本,等等。
一个目标也是允许我们的开发人员使用Simple Podfile轻松构建新的应用程序。
所以下一个想法是创建一个框架项目,然后在我们的主应用程序中包含CocoaPods。我遵循了本教程:http://chariotsolutions.com/blog/post/using-cocoapods-to-manage-private-libraries/
在MainApp中我包含了Framework,MainApp-AppDelegate类是Framework-AppDelegate类的子类。
@interface MainApp_AppDelegate : FrameworkAppDelegate
我在MainApp_AppDelegate中设置我覆盖的所有基于应用程序的设置的方法。
@implementation MainApp_AppDelegate
-(void)initSettings {
qr_reader = YES;
}
@end
它就像一个魅力,但我有一个问题与图像。 AppFramework包含Image training.png和image y.png。
在主应用程序xyz中,我认为Image training.png看起来不适合这个应用程序,所以我只想改变它(y.png我想要包含在Framework中的版本)。我把x.png放到Main App Ressources文件夹中,但在编译并运行后,我看到了AppFramework项目中包含的Image。
有没有办法改变这种行为或更好的方法来创建框架?
答案 0 :(得分:2)
正在发生的事情是Cocoapods在最终.app
捆绑之后将其资源复制到您的应用完成复制后。所以你的training.jpg
被你的框架覆盖了。
正如@masam所说,您需要重新排序项目的构建阶段,以便在Cocoapods资源之后复制应用程序的资源。
(注意“复制捆绑资源”现在如何在列表中的“复制窗口资源”下
不幸的是,这还不够,因为Xcode的构建系统(试图成为?)是智能的,并且不会复制(或在源文件的情况下重新编译)一个目标,即“最新”。对于像图像这样的静态资源,最新意味着目标路径(在最终.app
包中)比源路径(在Xcode项目中)更新。
因此,如果您现在尝试运行您的应用,您会发现没有任何变化。 Xcode不会复制training.jpg
,因为.app
已经存在,而.app
更新。
您需要欺骗Xcode,使其认为touch
中的资源已过时且需要更新。为此,在“Copy Pods Resources”和“Copy Bundle Resources”之间添加一个新的“Run Script Build Phase”:
脚本应将资源的修改日期设置为较早的日期,以强制Xcode复制应用程序的资源。 find ${TARGET_BUILD_DIR} -name 'training.jpg' -exec touch -ct $(date -v-1d "+%Y%m%d%H%M.%S") {} \;
完成工作:
date -v-1d "+%Y%m%d%H%M.%S"
我们使用find
将资源的修改日期设置为昨天。
Xcode现在将使用应用程序覆盖框架的图像。
再次,正如@masam所说,不要忘记仅将资源添加到正确的目标。
例如
此处,应用程序映像将在DummyApp中使用,但DummyApp2将使用框架映像。
tl; dr:尽可能避免这种情况。
find ${TARGET_BUILD_DIR} -name '*.png'
更具包容性,例如。.pbxproj
); 在 one-target-per-app-flavor thingy:
请记住,您对一个目标的构建阶段所做的每次修改都会不影响其他目标构建阶段。您需要单独编辑每个目标。因此,如果你可以避免它,我以前的不会这样做。
我完全理解需要有多个目标来构建基于相同代码库的多个应用程序,但Xcode在管理大量目标方面可怕不好。从一个正在使用65个不同目标的相当大的应用程序(1k +文件和很多依赖项)的人那里得到它:这是一场噩梦。
.pbxproj
基本上会增加目标数量(在我的情况下为25MB),每次在Xcode中完成项目修改时你都会得到沙滩球。并且每个目标都是独立管理的,每次需要时,例如。添加/删除编译标志,您需要更新每个目标,一个。通过。一个即可。 (或者您将使用sed
/ awk
/其他方式手动编辑{{1}},这更快,但风险很高......但很有趣:)。)
哦......我是否提到过合并冲突?
答案 1 :(得分:0)
这可能是由于您的构建阶段中的某个订单(项目 - >构建阶段)。默认情况下,它将首先复制捆绑包资源,然后复制Pods资源(覆盖主应用程序中的资源)。
您可以将“复制Pod资源”的顺序更改为早期阶段,方法是将其拖到“复制捆绑资源”上方。
您还必须通过单击图像资源验证主项目中包含的图像资源是否具有正确的目标成员资格 - >文件检查员 - >目标会员。应检查您正在编译的目标。
答案 2 :(得分:0)
复制你的目标!?
我通过这种方式构建的最后一个应用程序为每个目标使用不同的包标识符。 然后,只需对您的捆绑ID进行测试,即可以编程方式进行不同的设置。
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];