我正在开发一个Xcode项目,该项目旨在构建到一个库中,并作为CocoaPod或工作区包含在其他项目中。我正在使用agvtool来设置捆绑和营销版本。我想添加一个简单的方法来读取API的一部分作为API的一部分,它变成了比我预期的更复杂的东西。我最初实现了我的versionString方法,如下所示:
+ (NSString *)versionString {
return [NSString stringWithFormat:@"%@.%@", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]];
}
但是,当工作区中包含库时,CFBundleShortVersionString
和CFBundleVersion
会从工作区中获取其值,不来自库!因此,如果库是营销版本1.2并且捆绑版本是3,但它包含在营销版本2.0和捆绑版本130的工作空间中,则此方法将返回2.0.130
而不是1.2.3
。
有没有人知道我可以访问图书馆CFBundleShortVersionString
而不是工作区的方式?
我开始深入研究agvtool
的一些比较模糊的方面,我发现了一种可靠的方式来访问捆绑版本,但我真的更喜欢的是营销版本,因为那是什么我会用来表示API兼容性。
agvtool
会在您的构建设置中设置Current Project Version
属性,因此如果您将Versioning System
设置为Apple Generic
,Xcode将生成一个带有一些全局常量的.c文件你作为构建过程的一部分。要获得对这些值的访问权限,您需要做的就是在自己的标题中公开它们,如下所示:
extern const unsigned char {PRODUCT NAME}VersionString[];
extern const double {PRODUCT NAME}VersionNumber;
当我看到这个时,我想我肯定是在正确的轨道上。 VersionNumber确实是3.0,但VersionString是@(#)PROGRAM:{PRODUCT NAME} PROJECT:{PRODUCT NAME}-3
。
似乎我可以通过在构建设置中设置Generated Versioning Variables
参数来获得我想要的东西,但我也怀疑我是从错误的方向开始的,而我只是得到了进一步偏离轨道。
非常感谢任何帮助。